keras中的K.gradients()函数

【时间】2018.12.26

【题目】keras中的K.gradients()函数

概述

K.gradients(y,x)

【功能】用于求y关于x 的导数(梯度)

【输入】(y和x可以是张量tensor也可以是张量列表,形如 [tensor1, tensor2, …, tensorn]),

【返回】返回的是一个张量列表,列表长度是张量列表x的长度,列表元素是与x具有一样shape的张量。

     举个例子,比如:grads = K.gradients(y, x),若y是(2,2)张量,x是(1,7,7,512)张量,那么返回的grads是只有1个元素的(1,7,7,512)张量列表。

    具体而言:

  • K.gradients()实现y对x求导
  • 求导返回值是一个list,list的长度等于len(x)
  • 假设返回值是[grad1, grad2, grad3],y=[y1, y2],x=[x1, x2, x3]。则,真实的计算过程为:

     keras中的K.gradients()函数_第1张图片

    其中y1/x1表示求y1关于x1的偏导数。

PS :K.gradients()应该是通过tensorflow的tf.gradients()实现的,具体用法可以参考:tensorflow—tf.gradients()简单实用教程

 

一、具体例子:

【代码】:

from keras import backend as K

from keras.models import Sequential

from keras.layers import Dense, Activation



model = Sequential()

model.add(Dense(units=64, activation='relu',input_dim=100))

model.add(Dense(units=10,activation='softmax'))

model.summary()



grads = K.gradients(model.output,[model.input])

print('input_shape:',model.output_shape,'output_shape:',model.input_shape)

print('grads:',grads)

print(len(grads))

print('grads[0]_shape:',grads[0].shape)

 

【运行结果】:

keras中的K.gradients()函数_第2张图片

二、关于张量的梯度的一点补充

  • 梯度是一个向量,一般是对一个标量求在某点以及某一个方向上的梯度,所以对于求y在张量x上的梯度,可以理解为张量x提供了方向,故所求的梯度的shape与x的shape一样。例如:
  • 对于标量y,以及张量x=[[x0,x1],[x2,x3]],对应的梯度为grad=[[g0,g1],[g2,g3]],其中,g0=dy/dx0,g1=dy/dx1,g2=dy/dx2,g3=dy/dx3.
  • 如果y是一个张量,例如y=[[y0,y1]],其梯度的shape也是x的shape,而且grad=grad0+grad1,其中grad0和grad1分别是y0,y1关于x的梯度。这也可以说是张量的梯度的计算方法,当然,数学上好像并没有所谓的张量的梯度的说法。
  • 具体例子如下:(y 是一个(2,1)的张量,x 是一个(1,2)的张量,而且y[0,0]=x[0,0],y[0,1]=2*x[0,1])

      【代码】

import tensorflow as tf

x = tf.get_variable('w1',shape=[1,2])

tmp1=x[0,0]

tmp2=2*x[0,1]

y=tf.stack([tmp1,tmp2],0)  #y 是一个(2,1)的张量,x 是一个(1,2)的张量,而且y=x[0,0]+2*x[0,1]

grads = tf.gradients(y,[x])



with tf.Session() as sess:

    tf.global_variables_initializer().run()

    re = sess.run(grads)

    print('the gradient of y=x[0,0]+2*x[0,1] for x is :',re)

【运行结果】

 

你可能感兴趣的:(Keras)