在tensorflow中使用tf.nn.sparse_softmax_cross_entropy_with_logits,可以通过将类标签设置为-1来计算特定行的丢失(否则预计它将在0-> numclasses-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)
将这些渐变归零的最简单方法是什么?
答案 0 :(得分:1)
最简单的方法是将分类损失乘以需要损失的类似张量1,而不是缺点。由于损失已经为零而您不希望更新,因此这更容易实现。这基本上只是一个解决方法,因为如果这个稀疏softmax的损耗为零,它仍然会做一些奇怪的梯度行为。 在tf.nn.sparse_softmax_cross_entropy_with_logits之后添加此行:
classification_loss_zeroed = tf.mul(classification_loss,tf.to_float(tf.not_equal(classification_loss,0)))
它也应该将渐变归零。