はじめに
TensorFlowのMNISTのチュートリアルをしていたら、そのページでは損失関数(Loss fucntion)にtf.losses.softmax_cross_entropy
を使っていたのですが、公式のGitHubではtf.losses.sparse_softmax_cross_entropy
を使っていて、その違いを調べてもなかなか出てこなかったので、自分のメモ代わりに残しておきます。
ついでにwith_logits
が付く場合も書いておきます。
sparseがある場合とない場合の違いは?
公式のAPIを読んでもわけがわからなかったのですが(無能)、stack overflowで質問兄貴とブログ執筆外人兄貴によると、両者の結果に違いはないそうです。
sparse
が付いていると、自動でinputをone-hotにしてくれるそうです。はい、便利!
one-hot codingについてはこちらを参考にどうぞ。
例えばこうしてたのが
without_sparse
onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=10)
loss = tf.losses.softmax_cross_entropy(
onehot_labels=onehot_labels, logits=logits)
これで済むというとです。
with_sparse
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
with_logitsがある場合とない場合の違いは?
Qiita執筆兄貴によると
"with_logits"というのは、この関数は内部でソフトマックスも計算するから、ニューラルネットワークの出力をそのまま入力してね、という意味です。
だそうです。ありがたい。