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

时间:2017-07-27 11:01:31

标签: tensorflow

当计算涉及稀疏张量时,计算相对于变量的损失梯度返回 mounted() { this.$watch('$plugin.prop', val => console.log(val)); }

这是一个最小的例子:

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)

显示渐变可用于稀疏张量值,但在将其转换回密集张量后不会出现。

在没有GPU的Ubuntu Linux上使用TensorFlow 1.2时会发生这种情况。

1 个答案:

答案 0 :(得分:1)

事实证明[<tf.Tensor 'gradients/MatMul_grad/MatMul_1:0' shape=(2, 3) dtype=float32>] [None] 操作(sparse_to_dense是一个便利包装器)在TensorFlow 1.2中没有渐变,但这可以在TensorFlow 1.3中解决(参见this issue) 。截至今天,即2018年5月,该错误尚未修复且已关闭,请参阅this bug description

解决方法是在图表中有两条单独的路径,一条避开后向传递的sparse_tensor_to_dense操作,另一条路径使用sparse_to_dense,但仅用于前向传递。

从稀疏的is described in here获得密集的可微分张量的一种hacky方式:

sparse_to_dense

现在 dense_tensor_hack = tf.sparse_add(tf.zeros(sparse_tensor.dense_shape), sparse_tensor) 有一个明确定义的渐变。