1. 交叉熵:
2. logits:神经网络最后一层的输出
下面看实际中的3种用法:
1.根据定义手动求
2.使用sparse_softmax_cross_entropy_with_logits
3.使用softmax_cross_entropy_with_logits
其中2和3的区别在于sparse要求输入是实数,比如[2,4,6, 344],然后对实数做one_hot,而softmax_cross_entropy_with_logits要求是one_hot输入,即[0,0,1],[0,1,0]等。其它的处理方式一样
import tensorflow as tf
logits = tf.Variable([[0.3, 0.4, 0.6], [0.4, 0.4, 0.5]], dtype=tf.float32) #shape = (2,3),假设是模型产生的
y = tf.nn.softmax(logits)#做softmax用于手动求交叉熵
y_true = [2, 1] #shape = (2,)用于sparse
y_true_one_hot = tf.one_hot(y_true, 3, on_value=1, off_value=0)#shape=(2,3)
cross_entropy = -tf.reduce_sum(tf.to_float(y_true_one_hot)*tf.log(y),axis=1)
output = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y_true, logits=logits)
output_ = tf.nn.softmax_cross_entropy_with_logits(labels=y_true_one_hot, logits=logits)
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(y_true_one_hot))
print(sess.run(cross_entropy))
print(sess.run(output))
print(sess.run(output_))
结果:
[[0 0 1]
[0 1 0]]
[ 0.93983102 1.1330688 ]
[ 0.93983102 1.1330688 ]
[ 0.93983102 1.13306868]