1

在下面的简单代码中,梯度得到正确计算。

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

4

1 回答 1

1

x在第二个示例中,和之间没有依赖关系yfunc是一个依赖于两者并且碰巧修改的操作y。如果您检查相应的tf.assign操作,您将看到:

op: "Assign"
input: "Variable"   # this is y
input: "mul"        # this is 2*x

但是x并且y是独立的,这就是引擎无法采用梯度的原因。

于 2018-01-13T17:57:05.117 回答