使用Tensorflow';s";tf.gather";及;tf.梯度“;在一起

使用Tensorflow';s";tf.gather";及;tf.梯度“;在一起,tensorflow,sparse-matrix,Tensorflow,Sparse Matrix,我想计算张量Y相对于张量流中参数矩阵X的梯度。具体来说,我只想计算一组给定的“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,indice

我想计算张量Y相对于张量流中参数矩阵X的梯度。具体来说,我只想计算一组给定的“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”返回“None”对象,因此无法继续。有人知道如何解决这个问题吗?

你可以试着把X分解成一组较小的张量,然后进行计算

Y=f(tf.concat(列表)

然后计算你关心的每个X_i的梯度w.r.t。对于您正在尝试做的事情来说,它可能不实用或没有效率


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

要实现这一点,您需要Y是稀疏X的函数,而不是X的函数