为什么在TensorFlow中使用稀疏张量时没有梯度可用?

为什么在TensorFlow中使用稀疏张量时没有梯度可用?,tensorflow,Tensorflow,当计算涉及稀疏张量时,计算关于变量的损失梯度返回None 下面是一个简单的例子: x = tf.placeholder(tf.float32, shape=[1,2]) w = tf.get_variable("w", [2, 3]) y = tf.matmul(x, w) sparse_loss = tf.SparseTensor([[0], [2], [4]], tf.reshape(y, [-1]), [5]) dense_loss = tf.sparse_tensor_to_de

当计算涉及稀疏张量时,计算关于变量的损失梯度返回
None

下面是一个简单的例子:

x = tf.placeholder(tf.float32, shape=[1,2])

w = tf.get_variable("w", [2, 3])

y = tf.matmul(x, w)

sparse_loss = tf.SparseTensor([[0], [2], [4]], tf.reshape(y, [-1]), [5])

dense_loss = tf.sparse_tensor_to_dense(sparse_loss)

sparse_grads = tf.gradients(sparse_loss.values, w)
print(sparse_grads)

dense_grads = tf.gradients(dense_loss, w)
print(dense_grads)
这张照片

[<tf.Tensor 'gradients/MatMul_grad/MatMul_1:0' shape=(2, 3) dtype=float32>]
[None]
[]
[无]
表明梯度可用于稀疏张量值,但在将其转换回稠密张量后不可用


这是在没有GPU的Ubuntu Linux上的TensorFlow 1.2上发生的。

结果是
sparse\u to\u densed
操作(围绕该操作,
sparse\u tensor\u to\u densed
是一个方便的包装器)在TensorFlow 1.2中没有梯度,但这可以在TensorFlow 1.3中解决(请参阅)。截至今天2018年5月,该漏洞尚未修复,已关闭,请参阅

一种解决方法是在图形中有两条单独的路径,一条用于避免向后传递的
稀疏到密集
操作,另一条用于仅向前传递的
稀疏到密集

从稀疏张量得到稠密可微张量的一种简单方法:


现在,
densite\u tensor\u hack
有了一个定义良好的梯度。

你知道这在后续版本中是否已经解决了吗?@JoshuaR。链接的Github问题包括2017年6月16日的评论,“顺便说一句,该op现在有一个梯度。”也可以使用
scatter\u nd
作为
sparse\u to\u dense
的替代方案。
    dense_tensor_hack = tf.sparse_add(tf.zeros(sparse_tensor.dense_shape), sparse_tensor)