【时间】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]。则,真实的计算过程为:
其中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)
【运行结果】:
二、关于张量的梯度的一点补充
- 梯度是一个向量,一般是对一个标量求在某点以及某一个方向上的梯度,所以对于求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)
【运行结果】