切片的变量返回渐变无

时间:2017-01-27 08:20:19

标签: python tensorflow deep-learning

我一直在玩tf.gradients()功能,并且遇到了一种我没想到的行为。即它似乎无法计算切片变量的梯度。我把一个例子放在一起,希望能说明我的意思:

import tensorflow as tf

a = tf.Variable([1.0])
b = tf.Variable([1.0])
c = tf.concat(0, [a, b])
print(c)  # >Tensor("concat:0", shape=(2,), dtype=float32)

grad_full = tf.gradients(c,  c)
grad_slice1 = tf.gradients(c,  a)
grad_slice2 = tf.gradients(c,  c[:, ])  # --> Here the gradient is None
grad_slice3 = tf.gradients(c,  c[0, ])  # --> Here the gradient is None

print(grad_full)  # >[<tf.Tensor 'gradients/Fill:0' shape=(2,) dtype=float32>]
print(grad_slice1)  # >[<tf.Tensor 'gradients_1/concat_grad/Slice:0' shape=(1,) dtype=float32>]
print(grad_slice2)  # >[None]
print(grad_slice3)  # >[None]

sess = tf.Session()
sess.run(tf.initialize_all_variables())

grad_full_v, grad_slice_v = sess.run([grad_full[0], grad_slice1[0]])
print(grad_full_v)  # >[ 1.  1.]
print(grad_slice_v)  # >[ 1.]

我的问题是:

1)我是否按照预期的方式使用tf.gradients()函数?

2)如果是这样,这种行为是否有原因?在我的理解中,切片不一定会破坏反向传播。

3)这是否意味着我需要避免在整个网络中切片(或至少从变量到损失的每条路径)?例如,这意味着,我不能将完全连接的层的结果切割成许多有意义的部分(比如使用一个fc层估计多个标量,然后将联合估计切成我想要使用的部分)。

我在使用python 3.5的Ubuntu 16上使用Tensorflow 0.11 RC0构建。

1 个答案:

答案 0 :(得分:0)

d = c[:, ]创建一个不同的张量,然后a, b, c。如果考虑依赖图,则d取决于c。那么渐变在这种情况下不起作用。如果x取决于y,grad(y, x)有效,而不是相反。