tf中softmax_cross_entropy_with_logits與sparse_softmax_cross_entropy_with_logits
其實這兩個都是計算交叉熵,只是輸入數據不同。
#sparse 稀疏的、稀少的
word_labels = tf.constant([2,0])
predict_logits = tf.constant([[2.0,-1.0,3.0],[1.0,0.0,-0.5]])
loss = tf.nn.sparse_softmax_cross_entropy_with_logits(
labels = word_labels,logits = predict_logits)
with tf.Session() as sess:
print(sess.run(loss))
#結果是:[0.32656264 0.4643688 ]
word_prob_distribution = tf.constant([[0.0,0.0,1.0],[1.0,0.0,0.0]])
loss = tf.nn.softmax_cross_entropy_with_logits(labels = word_prob_distribution,logits = predict_logits)
with tf.Session() as sess:
print(sess.run(loss))
#結果是:[0.32656264 0.4643688 ]
由于softmax_cross_entropy_with_logits允許提供一個概率分布,因此在使用時有更大的自由度。
舉個例子,一種叫label_smoothing的技巧將正確數據的概率設為一個比1.0略小的值,將錯誤的該概率設置為一個比0.0略大的值,
這樣可以避免模型與數據過擬合,在某些時候可以提高訓練效果
word_prob_smooth = tf.constant([[0.01, 0.01, 0.97], [0.98, 0.03, 0.01]])
loss = tf.nn.softmax_cross_entropy_with_logits(labels = word_prob_smooth,logits = predict_logits)
with tf.Session() as sess:
print(sess.run(loss))
#[0.37329704 0.5186562 ]

浙公網安備 33010602011771號