使用Tensorflow" tf.gather"和" tf.gradients"一起

时间:2016-06-27 21:19:04

标签: tensorflow sparse-matrix

我想计算张量的渐变" Y"关于参数矩阵" X"在Tensorflow。具体来说,我想只计算一组给定的"指数" " X"。以下代码首先计算整个渐变,然后返回与所需索引对应的渐变:

Y=some_function_of_X
grad=tf.gradients(Y,X)
grads_i_want_to_compute=tf.gather(grad,indices)

使用Tensorflow" tf.scatter_sub",然后我可以更新参数矩阵的所需索引" X"基于梯度下降:

tf.scatter_sub(X,indices,learning_rate*grads_i_want_to_compute)

这可以正常工作,但在一天结束时,所有渐变都会被计算出来!为了处理速度,我不想计算所有的梯度。所以我尝试了这个:

Y=some_function_of_X
sparse_X=tf.gather(X,indices)
grads_i_want_to_compute = tf.gradient(Y,sparse_X)
tf.scatter_sub(X,indices,learning_rate*grads_i_want_to_compute)

在后者中," tf.gradient"返回"无"对象所以我无法继续。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

要使这项工作,您需要Y作为sparse_X的函数,而不是X的函数。

答案 1 :(得分:0)

您可以尝试将X拆分为一组较小的张量然后计算

Y = f(tf.concat(list_of_X_i,...))

然后计算渐变w.r.t.您关心的每个X_i。对于你想要做的事情,这可能不实际或有效。

另一件需要考虑的事情是,根据网络的深度和结构,X中单个元素的梯度可能取决于上面各层的许多(甚至全部)梯度。因此,与蛮力方法相比,您可能无法节省大量计算。