在下面的简单代码中,梯度得到正确计算。
import tensorflow as tf
x = tf.constant([1, 2, 3, 4], dtype=tf.float32)
y = tf.Variable(tf.ones_like(x), dtype=tf.float32)
y = 2*x
grad = tf.gradients(y, x)
ini = tf.global_variables_initializer()
with tf.Session() as ses:
ses.run(ini)
print(ses.run(grad))
结果,正如预期的那样[array([ 2., 2., 2., 2.], dtype=float32)]
。尝试tf.assign
用于函数计算时遇到问题。下面的代码:
import tensorflow as tf
x = tf.constant([1, 2, 3, 4], dtype=tf.float32)
y = tf.Variable(tf.ones_like(x), dtype=tf.float32)
func = tf.assign(y, 2*x)
grad = tf.gradients(y, x)
ini = tf.global_variables_initializer()
with tf.Session() as ses:
ses.run(ini)
ses.run(func)
print(ses.run(grad))
...产生一个错误:
TypeError: Fetch argument None has invalid type
<class 'NoneType'>
。
为什么呢?x
和节点之间的连接是否y
通过操作“丢失”了tf.assign
?