Python 张量流中的稀疏交叉熵

Python 张量流中的稀疏交叉熵,python,tensorflow,Python,Tensorflow,在tensorflow中将tf.nn.sparse\u softmax\u cross\u entropy\u与\u logits一起使用,可以通过将类标签设置为-1(否则预计其范围为0->numclass-1)来仅计算特定行的损失 不幸的是,这破坏了梯度计算(如源nn_ops.py中的注释所述) 我想做的事情如下: raw_classification_output1 = [0,1,0] raw_classification_output2 = [0,0,1] classification_

在tensorflow中将tf.nn.sparse\u softmax\u cross\u entropy\u与\u logits一起使用,可以通过将类标签设置为-1(否则预计其范围为0->numclass-1)来仅计算特定行的损失

不幸的是,这破坏了梯度计算(如源nn_ops.py中的注释所述)

我想做的事情如下:

raw_classification_output1 = [0,1,0]
raw_classification_output2 = [0,0,1]

classification_output =tf.concat(0,[raw_classification_output1,raw_classification_output2])
classification_labels = [1,-1]

classification_loss =    tf.nn.sparse_softmax_cross_entropy_with_logits(classification_output,classification_labels)

total_loss = tf.reduce_sum(classification_loss) + tf.reduce_sum(other_loss)

optimizer = tf.train.GradientDescentOptimizer(1e-3)
grads_and_vars = optimizer.compute_gradients(total_loss)
changed_grads_and_vars = #do something to 0 the incorrect gradients
optimizer.apply_gradients(changed_grads_and_vars)

将这些梯度归零最直接的方法是什么

最简单的方法是将分类损失乘以一个类似的张量,在需要损失的地方乘以1,在不需要损失的地方乘以0。由于损失已经为零,而您不希望更新它,因此这变得更容易。这基本上只是一个解决办法,因为如果这个稀疏softmax的损失为零,它仍然会有一些奇怪的渐变行为。 将此行添加到tf.nn.sparse\u softmax\u cross\u entropy\u之后,并使用\u logits:

  classification_loss_zeroed = tf.mul(classification_loss,tf.to_float(tf.not_equal(classification_loss,0)))

它也应该将梯度归零

你可以用它来修剪你的大眼睛。对不起,我不知道你说的“不正确”的梯度是什么意思。带“-1”的行的丢失将为零,这意味着您的参数在最终丢失中不会生效,那么为什么它们不为零呢?