当计算涉及稀疏张量时,计算相对于变量的损失梯度返回 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时会发生这种情况。
答案 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)
有一个明确定义的渐变。