tensorflow中gradients的使用以及TypeError: Fetch argument None has invalid type <class 'NoneType'>错误解析

在反向传播过程中,神经网络需要对每一个loss对应的学习参数求偏导,算出的这个值也就是梯度,用来乘以学习率更新学习参数使用的,它是通过tensorflow中gradients函数使用的。

我们根据官方文档对函数原型进行解析

官方文档中函数原型以及参数如下:

tf.gradients( ys, xs, grad_ys=None, name=gradients, colocate_gradients_with_ops=False, gate_gradients=False, aggregation_method=None, stop_gradients=None, unconnected_gradients=tf.UnconnectedGradients.NONE)

ys和xs都是张量或者张量列表。函数tf.gradients作用是在ys中对xs求导,求导的返回值是一个list,list的长度与xs的长度相同。

下面通过例子介绍函数的用法(这是李金洪老师那本书中举到的例子)

 

import tensorflow as tfw1 = tf.Variable([[1,2]])w2 = tf.Variable([[3,4]])y = tf.matmul(w1, [[9],[10]])grads = tf.gradients(y,[w1])with tf.Session() as sess: sess.run(tf.global_variables_initializer()) gradval = sess.run(grads) print(gradval)

 

运行这段代码会报错,报错为:

TypeError: Fetch argument None has invalid type <class NoneType>

原因是Tensorflow gradients好像int型的Tensor 的gradients 把w1的设置成float类型的例如tf.float32 gards就能算了,而且tensorflow梯度值一般都是float32类型的。所以我们修改代码将整型的张量改为浮点型:

import tensorflow as tfw1 = tf.Variable([[1.,2.]])w2 = tf.Variable([[3.,4.]])y = tf.matmul(w1, [[9.],[10.]])grads = tf.gradients(y,[w1])with tf.Session() as sess: sess.run(tf.global_variables_initializer()) gradval = sess.run(grads) print(gradval)

输出结果为:

[array([[ 9., 10.]], dtype=float32)]

上面例子中,由于y是由w1与[[9],[10]]相乘而来,所以其导数也就是[[9],[10]](即斜率)。

注意:如果求梯度的式子中没有要求偏导的变量,系统会报错。例如,写成grads = tf.gradients(y,[w1,w2])。

 

相关文章