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中交叉熵损失函数详解
tensorflow中交叉熵损失函数详解的更多相关文章
- 【转载】深度学习中softmax交叉熵损失函数的理解
深度学习中softmax交叉熵损失函数的理解 2018-08-11 23:49:43 lilong117194 阅读数 5198更多 分类专栏: Deep learning 版权声明:本文为博主原 ...
- 深度学习中交叉熵和KL散度和最大似然估计之间的关系
机器学习的面试题中经常会被问到交叉熵(cross entropy)和最大似然估计(MLE)或者KL散度有什么关系,查了一些资料发现优化这3个东西其实是等价的. 熵和交叉熵 提到交叉熵就需要了解下信息论 ...
- linux-2.6.26内核中ARM中断实现详解(转)
转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...
- 深度学习原理与框架-神经网络结构与原理 1.得分函数 2.SVM损失函数 3.正则化惩罚项 4.softmax交叉熵损失函数 5. 最优化问题(前向传播) 6.batch_size(批量更新权重参数) 7.反向传播
神经网络由各个部分组成 1.得分函数:在进行输出时,对于每一个类别都会输入一个得分值,使用这些得分值可以用来构造出每一个类别的概率值,也可以使用softmax构造类别的概率值,从而构造出loss值, ...
- Win10 TensorFlow(gpu)安装详解
Win10 TensorFlow(gpu)安装详解 写在前面:TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着 ...
- (转)Win10 TensorFlow(gpu)安装详解
Win10 TensorFlow(gpu)安装详解 写在前面:TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着 ...
- [ch03-02] 交叉熵损失函数
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 3.2 交叉熵损失函数 交叉熵(Cross Entrop ...
- 关于交叉熵损失函数Cross Entropy Loss
1.说在前面 最近在学习object detection的论文,又遇到交叉熵.高斯混合模型等之类的知识,发现自己没有搞明白这些概念,也从来没有认真总结归纳过,所以觉得自己应该沉下心,对以前的知识做一个 ...
- softmax交叉熵损失函数求导
来源:https://www.jianshu.com/p/c02a1fbffad6 简单易懂的softmax交叉熵损失函数求导 来写一个softmax求导的推导过程,不仅可以给自己理清思路,还可以造福 ...
- 深度学习基础5:交叉熵损失函数、MSE、CTC损失适用于字识别语音等序列问题、Balanced L1 Loss适用于目标检测
深度学习基础5:交叉熵损失函数.MSE.CTC损失适用于字识别语音等序列问题.Balanced L1 Loss适用于目标检测 1.交叉熵损失函数 在物理学中,"熵"被用来表示热力学 ...
随机推荐
- 你和时间管理大师,就差一个开源工具「GitHub 热点速览」
在这个快节奏的生活中,我们努力地在平衡工作.生活和个人发展,但常常感到时间不够用.如何在繁忙的日程中找到一丝丝"喘息"的机会,这个名叫 cal.com 开源项目能让你更轻松地管理日 ...
- FileZilla 连接不上宝塔
1,修改 pureftp的配置文件 ForcePassiveIP 为服务器的ip , 并去掉 # 2,FileZilla 使用明文连接
- 【面试题精讲】说一说springboot加载配置文件优先级
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 文章更新计划 系列文章地址 Spring Boot 加载配置文 ...
- [转帖]记druid 连接池没满,但超时问题 GetConnectionTimeoutException active 5, maxActive 100
记druid 连接池没满,但超时问题 GetConnectionTimeoutException active 5, maxActive 100 问题说明 线上服务突然出现报错,通过日志查找发现是因为 ...
- Oracle存储过程的基本学习
Oracle存储过程的基本学习 摘要 这个简要学习应该会分为上下两部分 第一部分是存储过程的学习. 第二部分是python的学习. 核心目标是查询Oracle数据库中的主键数据. 如果有主键upper ...
- [转帖]高性能网络实战:借助 eBPF 来优化负载均衡的性能
https://zhuanlan.zhihu.com/p/592981662 网络性能优化,eBPF 是如何发挥作用的呢? 本篇文章,我就以最常用的负载均衡器为例,带你一起来看看如何借助 eBPF 来 ...
- 截止2021年linux发行版
- charles如何抓取https请求
我们都知道charles下载安装后只能抓取http请求,要想抓取https请求需要下载安装证书 下面介绍pc端和移动端的配置方法 一.pc端(win) 1.打开charles,点击help>SS ...
- 如何处理开发环境没有问题,线上环境有问题这个bug
解决思路 首先确认开发环境有没有这个问题: 如果没有这个问题: 将你的地址切换为线上的环境,看看线上环境有没有这个问题: 如果切换为线上环境有这个问题,就可以调试了: 如果切换为线上环境没有这个问题, ...
- 【解决了一个小问题】alert manager要怎么样才能触发告警到企业微信上?
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 07-15:花了几个小时仍然是没走通这个流程,把中间结果记 ...