原理
1.为什么使用交叉熵作为代价函数地址:https://www.zhihu.com/question/65288314
2.理解交叉熵作为损失函数在神经网络的作用:https://blog.youkuaiyun.com/chaipp0607/article/details/73392175
说实话2的解释,讲述了一个数据的处理流程,好像没有牵涉到理论,讲的浅显易懂,结合下面的代码是极好的。
代码
代码参考地址:https://zhuanlan.zhihu.com/p/27842203
我将代码合在下面两个片段中了,
第一个讲解的是softmax函数的作用
import tensorflow as tf
import numpy as np
#logits数据,就是神经网络中输出的结果。
logits = np.array([[1, 2, 7],
[3, 5, 2],
[6, 1, 3],
[8, 2, 0],
[3, 6, 1]], dtype=np.float32)
predicts = tf.nn.softmax(logits=logits, dim=-1)
with tf.Session() as sess:
print(sess.run(predicts))
输出:
第二个是交叉熵
import tensorflow as tf
import numpy as np
labels = np.array([[0, 0, 1],
[0, 1, 0],
[1, 0, 0],
[1, 0, 0],
[0, 1, 0]], dtype=np.float32)
logits = np.array([[1, 2, 7],
[3, 5, 2],
[6, 1, 3],
[8, 2, 0],
[3, 6, 1]], dtype=np.float32)
#手动求交叉熵
labels = tf.clip_by_value(labels, 1e-10, 1.0)
predicts = tf.clip_by_value(predicts, 1e-10, 1.0)
cross_entropy = tf.reduce_sum(labels * tf.log(labels/predicts), axis=1)
#使用tf.nn.softmax_cross_entropy_with_logits()求交叉熵
cross_entropy2 = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=labels)
#使用tf.nn.sparse_softmax_cross_entropy_with_logits求交叉熵
classes = tf.argmax(labels, axis=1) # 顺着列(axis=1)的方向取得所有列相应的分量的最大值的下标,返回的是一个shape=(len(labels),)的向量
cross_entropy3 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,
labels=classes)
with tf.Session() as sess:
#手动求交叉熵
loss1 = sess.run(cross_entropy)
print(loss1)
#使用tf.nn.softmax_cross_entropy_with_logits()求交叉熵
loss2 = sess.run(cross_entropy2)
print(loss2)
##使用tf.nn.sparse_softmax_cross_entropy_with_logits求交叉熵
loss3 = sess.run(cross_entropy3)
print(loss3)
输出:
[ 0.00917445 0.16984604 0.05498521 0.00281022 0.05498521]
[ 0.00917445 0.16984604 0.05498521 0.00281022 0.05498521]
[ 0.00917445 0.16984604 0.05498521 0.00281022 0.05498521]