2016-05-21 4 views
2

テンソルフローでtf.nn.sparse_softmax_cross_entropy_with_logitsを使用すると、クラスラベルを-1に設定することで特定の行の損失を計算することができます(それ以外の場合は、0-> numclasses-1 )。Tensorflowのスパースクロスエントロピー

これは残念ながら(ソース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

[clip_by_value](https://www.tensorflow.org/versions/r0.8/api_docs/python/train.html#clip_by_value)を使用してグランドナンバーをクリップすることができます。 – fabrizioM

+1

申し訳ありませんが、私はあなたが "間違った"勾配によって何を意味するか分かりません。 "-1"の行の消失はゼロになります。つまり、最終的な損失でパラメータが有効にならないのはなぜですか? –

答えて

1

最も簡単な方法は、分類損失を、損失が必要な場合は1の同様のテンソルで乗算し、そうでない場合はゼロを乗算することです。これは、あなたがそれが更新されることを望まない場合、損失が既にゼロであるという事実によって、より簡単になります。これは、基本的には、この疎ソフトマックスの損失ゼロがある場合でも、幾分奇妙な勾配動作をするという事実に対する回避策です。 はtf.nn.sparse_softmax_cross_entropy_with_logits後にこの行を追加:

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

また、勾配をゼロにする必要があります。