tensorflow中交叉熵损失函数详解
1 前言
tensorflow中定义了3个交叉熵损失函数:
- softmax_cross_entropy_with_logits(logits, labels)
- softmax_cross_entropy_with_logits_v2(logits, labels)
- sparse_softmax_cross_entropy_with_logits(logits, labels)
其中logits都是未经激活函数(sigmoid、tanh、relu)和softmax放缩后的神经网络输出值,labels为样本标签(真实值);
1和2应用差不多,函数1不太严格,在新版本中将被淘汰,不建议使用;
1和2中,logits和labels维数相同,并且labels采用one-hots编码,比如mnist数据集中,有3个样本标签[1 5 8],采用one-hot编码为:[[0 1 0 0 0 0 0 0 0 0], [0 0 0 0 0 1 0 0 0 0], [0 0 0 0 0 0 0 0 1 0]],如果labels不是采用one-hot编码,需要采用tf.one_hot(y, 10) 函数转换为one-hot编码格式;
3中,logits和labels维数不相同,labels没有采用one-hot编码,若已编码,需采用tf.argmax(y,1) 还原为原格式;
这3个函数都封装了如下两个函数:
- y_=softmax(z) (z为神经网络输出值)
- cross_entropy=-ylog(y_) (y为标签)
2 实验
import tensorflow as tf
#真实值(标签值)
y=tf.constant([[1.,0.,0.],[0.,1.,0.],[0.,0.,1.],[1.,0.,0.]])
#未经激活函数和softmax放缩后的神经网络输出值
z=tf.constant([[1.,5.,9.],[8.,7.,3.],[6.,7.,5.],[2.,8.,4.]])
#使用softmax(z)函数和-y*log(y_)函数计算交叉熵
y_=tf.nn.softmax(z)
cross_entropy1 =-y*tf.log(y_)
#计算cross_entropy1的行和
cross_entropy12=tf.reduce_sum(cross_entropy1,1)
#使用softmax_cross_entropy_with_logits函数计算交叉熵
cross_entropy2=tf.nn.softmax_cross_entropy_with_logits(logits=z, labels=y)
#使用softmax_cross_entropy_with_logits_v2函数计算交叉熵
cross_entropy3=tf.nn.softmax_cross_entropy_with_logits_v2(logits=z, labels=y)
#使用sparse_softmax_cross_entropy_with_logits函数计算交叉熵
cross_entropy4=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=z, labels=tf.argmax(y,1))
with tf.Session() as sess:
c1=sess.run(cross_entropy1)
c12=sess.run(cross_entropy12)
c2=sess.run(cross_entropy2)
c3=sess.run(cross_entropy3)
c4=sess.run(cross_entropy4)
print("使用softmax(z)函数和-y*log(y_)函数计算交叉熵:\n",c1)
print("行和:\n",c12)
print("\n使用softmax_cross_entropy_with_logits函数计算交叉熵:\n",c2)
print("\n使用softmax_cross_entropy_with_logits_v2函数计算交叉熵:\n",c3)
print("\n使用sparse_softmax_cross_entropy_with_logits函数计算交叉熵:\n",c4)
3 注意事项
在进行分类时,网络输出值z并不是最终的类别,需要进行如下操作:
#softmax压缩变换
y_=tf.softmax(z)
#精确度
correct_prediction=tf.equal(tf.argmax(y_,1),tf.argmax(y,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
由于softmax()只是将数据整体压缩,并不改变数据的相对大小,因此,一些教材或网课在计算预测分类和精确度时,为简化计算,省去了softmax函数,如下:
#精确度
correct_prediction=tf.equal(tf.argmax(z,1),tf.argmax(y,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
声明:本文转自tensorflow中交叉熵损失函数详解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)