一文读懂交叉熵损失函数

article/2025/9/10 3:45:31

进行二分类或多分类问题时,在众多损失函数中交叉熵损失函数较为常用。

下面的内容将以这三个问题来展开

  1. 什么是交叉熵损失
  2. 以图片分类问题为例,理解交叉熵损失函数
  3. 从0开始实现交叉熵损失函数

1,什么是交叉熵损失

交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性

在这里插入图片描述

p(x)表示样本的真实分布,q(x)表示模型所预测的分布

**交叉熵能够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。

交叉熵在分类问题中常常与softmax是标配,softmax将输出的结果进行处理,使其多个分类的预测值和为1,再通过交叉熵来计算损失。**

2,以图片分类问题为例,理解交叉熵损失函数

Fashion-MNIST数据集是一个包含60000衣服,鞋子等图片的数据集,也是实验图像分类算法经常用的数据集。具体图片类别及其标签如下
在这里插入图片描述

这里,我们就以在这个数据集上的图片分类问题为例,理解交叉熵损失函数。

假设某个场景如下:对于我们设计的用于图片分类的卷积神经网络的训练还没有完成,此时,终止我们的训练,显然,各种层的参数已经保留。从数据集中任选一张图片(类别已经被记录),输入我们的神经网络,结果输出的是一个包含10个数据的一维张量,这10个数据分别对应10种物品的概率。不妨记为

q=[0.1058, 0.1043, 0.0988, 0.1066, 0.0875, 0.0881, 0.1027, 0.1046, 0.1057, 0.0958]

很显然,这个预测结果有点糟糕,不过主要是因为网络没有训练好。同时我们也已知道这个图片的真实类别为4,这时记

p=[0,0,0,0,1,0,0,0,0,0]

带入交叉熵损失函数,计算如下:

loss= -(0xlog(0.1058)+0xlog(0.1043)+0xlog(0.0988)+0xlog(0.1066)+1xlog(0.0875)+0xlog(0.0881)+0xlog(0.1027)+0xlog(0.1046)+0xlog( 0.1057)+0xlog(0.0958))=2.4361

这个结果就是我们的交叉熵损失,当然,我们希望越小越好,这意味着我们的神经网络较为成功。

其实,这个神经网络的训练过程就是对于输入的60000个数据(这里全部作为训练集,没有设置测试集),进行预测,计算损失,更新权重不断使得损失减小,循环往复。最终在训练很多轮后,使得损失足够小,分类的精度足够的高。那么我们可以认为这个神经网络在这个数据集上有较为不错的效果。

3,从0开始实现交叉熵损失函数

当然,pytorch中已经有这个函数,叫做 CrossEntropyLoss()。当然这个函数的输入不是一组概率,而是一组数据,可正可负。

这个函数先对输入的数据进行softMax操作 ,将其转换为概率,再与标签数据按上面的交叉熵损失函数计算。

也就等价于softMax+上面定义的函数(log+NLLLOSS)。

所以我们的交叉熵损失函数实现如下:

softmax:

def soft_max(data):t1=torch.exp(data)#对所有数据进行指数运算s=t1.sum(dim=1) #按行求和shape=data.size()m=shape[0]#获取行数n=shape[1]for i in range(m):t1[i]=t1[i]/s[i]return t1

cross_entropyloss

def cross_entropyloss(input,target):shape=data.size()m=shape[0]#获取行数output=-torch.log(input[range(m),target.flatten()]).sum()/mprint(input[range(m),target.flatten()])return output

比较:


#自己编写
data=torch.tensor([[-1,0.5,2],[-1,0.5,3]])
t1=soft_max(data)#将预测数据转换为概率!!!
#此处为重点
t2=cross_entropyloss(t1,torch.tensor([1,2]))
print(t2)
------------------------------------------
#PyTorch中的原函数
crossentropyloss=nn.CrossEntropyLoss()
t3=crossentropyloss(data,torch.tensor([1,2]))
print(t3)
-------------------------------------------
结果:
tensor(0.9185)
tensor(0.9185)

当然,在实际进行训练时,肯定是一个batch一个batch的进行,也就是一次输入几十张甚至上百张图片。所以理解上面的程序是非常必要的。

基于使问题简化的原则,程序的数据为图片三分类问题的两个样本预测数据(与第二问无任何关系)

程序描述:程序中的数据如下

注:(未对pred进行softmax操作,也就是在神经网络的最后一个全连接层后未加softmax操作)
在这里插入图片描述

解释: [1]可写为[0,1,0],也就是说明预测值为[-1,0.5,2]的样本属于第二个类别,为狗。

[2]可写为[0,0,1], 也就是说明预测值为[-1,0.5,3]的样本属于第三个类别,为马。

手动计算过程:

第一步:既然要计算交叉熵,那么就要将这些预测数据转换为概率,也就是进行softmax操作,如果这些数据原本就是概率,则直接进行第二步

[-1,0.5,2]—————— [0.0391, 0.1753, 0.7856]

[-1,0.5,3]—————— [0.0166, 0.0746, 0.9088]

第二步:

loss1=-(0xlog(0.0391)+1xlog(0.1753)+0xlog(0.7856))=1.7413

loss2=-(0xlog(0.0166)+0xlog(0.0746)+1xlog(0.9088))=0.0956

loss=(loss1+loss2)/2=0.9185

注:上述式中的log函数默认是自然对数

我的公众号:Math and Code
欢迎关注!


http://chatgpt.dhexx.cn/article/Ok2d1ySf.shtml

相关文章

交叉熵损失函数

目录 一、交叉熵损失函数含义 二、交叉熵损失函数定义为:​ 三、交叉熵损失函数计算案例 一、交叉熵损失函数含义 交叉熵是一个信息论中的概念,它原来是用来估算平均编码长度的。给定两个 概率分布p和q,通过q来表示p的交叉熵为 交叉熵刻画…

交叉熵损失函数(Cross Entropy Loss)

基础不牢,地动山摇,读研到现在有一年多了,发现自己对很多经常打交道的知识并不了解,仅仅是会改一改别人的代码,这使我感到非常焦虑,自此开始我的打基础之路。如果博客中有错误的地方,欢迎大家评…

js遍历数组中的对象并拿到值

拿到一组数组,数组中是对象,想拿到这个对象里面的某个值,可以参考以下例子: 这样就拿到所有n1的值. 想拿到这个对象里面所有对应的值如下: 也可以这样取值: 往数组里面push多个值: js中!!用法 …

js遍历数组以及获取数组对象的key和key的值方法

数组: let arr [{ appendData: { "Expiration Date mm- dd - yyyy(2D)": "03-04-2025" }},{appendData: { "Manufacturer(21P)": "MURATA" }}]arr.forEach((value,i)>{ //数组循环for(var pl in value){ //数组对象遍…

javascript遍历数组的方法总结

一、for循环 var arr[javascript,jquery,html,css,学习,加油,1,2]; for(var i0;i<arr.length;i){console.log(输出值,arr[i]); } 二、for...in 遍历的是key 适合遍历对象 var arr[javascript,jquery,html,css,学习,加油,1,2]; for(var i in arr){ console.log(输出值---…

html函数参数数组遍历,JavaScript foreach遍历数组

JavaScript forEach遍历数组教程 JavaScript forEach详解 定义 forEach() 方法为每个数组元素调用一次函数(回调函数)。 语法 array.forEach(function(currentValue, index, arr), thisValue); 参数 参数 描述 function(currentValue, index, arr) 必须。数组每个元素需要执行的…

js中遍历数组加到新数组_js数组遍历:JavaScript如何遍历数组?

什么是数组的遍历? 操作数组中的每一个数组元素。 使用for循环来遍历数组 因为数组的下标是连续的&#xff0c;数组的下标是从0开始。 我们也可以得到数组的长度。 格式&#xff1a;for(var i0;i 数组变量名[i] } 注意&#xff1a;条件表达式的写法 i i<数组的长度-1 // 数…

html页面遍历数组,javascript如何遍历数组?

作为一个程序员对于数组遍历大家都不是很陌生&#xff0c;在开发中我们也经常要处理数组。这里我们讨论下JavaScript中常用的数组遍历方法。 数组中常用的遍历方法有四种&#xff0c;分别是&#xff1a;for for-in forEach for-of (ES6) 1、第一种for循环var arr [1, 2, 3, 4]…

JavaScript遍历数组,附5个案例

先给大家分享一些JavaScript的相关资料&#xff1a; 认识JavaScript到初体验JavaScript 注释以及输入输出语句JavaScript变量的使用、语法扩展、命名规范JavaScript数据类型简介以及简单的数据类型JavaScript获取变量数据类型JavaScript 运算符&算数运算符JavaScript递增和…

1.9 JavaScript 遍历数组

遍历数组 数组的长度 使用 “数组名.length” 可以访问数组元素的数量&#xff08;数组长度&#xff09; a.length 动态监测数组元素的个数 案例 请将 [“关羽”, “张飞”, “赵云”,“小脆筒”], 将数组里的元素依次打印到控制台 代码实现 <!DOCTYPE html> <html&…

html怎么遍历数组,JavaScript如何遍历数组?遍历数组方法介绍

在往期文章中为大家介绍了 JavaScript 如何定义数组。那么这篇文章中 w3cschool 小编来为大家介绍下 JavaScript 如何遍历数组。 方法一&#xff1a;for 循环遍历数组 var arr[Tom,Jenny,Jan,Marry]; for(var i0;i console.log(arr[i]); } 实现效果&#xff1a; 方法二&#xf…

小程序 js 遍历数组

js 方式一&#xff1a; for (var index in res.data) { title : res.data[index].title } res.data&#xff1a;数组 index&#xff1a;下标 title&#xff1a;数组中的一个字段 方式二&#xff1a; for (var i 0; i < datas.length; i) { console.log(i); if( i > 1) b…

JS遍历数组的方法【详解】

法一&#xff1a;for循环 法二&#xff1a;forEach遍历&#xff08;可以同时取出数组中的值和值对应的下标&#xff09; 必须搭配函数使用&#xff0c;而且可以直接取出数组中的每个对象和对象对应的下标 let arr [{er: qwe},{er: asd}];arr.forEach((item,index)>{cons…

js遍历数组的方法

JS遍历数组的8种方法如下&#xff1a; 1.for循环 (改变原数组&#xff0c;无返回值) 2.forEach()&#xff08;改变原数组&#xff0c;无返回值&#xff09; 3.map() 4.filter() 5.reduce() 6.some() 7.every() 8.find() 1.for 循环&#xff1a;可以改变原数组。 2.f…

js数组遍历十种方法

1. some() 遍历数组&#xff0c;只要有一个以上的元素满足条件就返回 true&#xff0c;否则返回 false &#xff0c;退出循环 对数组中每个元素执行一次ok函数&#xff0c;知道某个元素返回true&#xff0c;则直接返回true。如果都返回false,则返回false 检查整个数组中是否…

JS遍历数组的十五种方法

一、循环遍历 for循环&#xff0c;也是最常见的。 可以使用临时变量&#xff0c;将长度缓存起来&#xff0c;避免重复获取数组长度&#xff0c;当数组较大时优化效果才会比较明显。 // arr 是要遍历的数组 // arr[i] 是遍历的数组的元素 // i 是数组的元素对应的下标(索引号)…

JS中循环遍历数组的几种常用方式总结

第一种&#xff1a;for循环&#xff0c;也是最常见的 最简单的一种&#xff0c;也是使用频率最高的一种&#xff0c;虽然性能不弱&#xff0c;但仍有优化空间 const arr [11, 22, 33, 44, 55, 66, 77, 88]; for (let i 0; i < arr.length; i) {console.log(arr[i]);}打印…

3D人脸识别技术,正在全面入侵我们的日常生活

最近“人脸识别技术”因丰巢智能柜“刷脸取件”被小学生用一张面部打印照片破解的bug事件刷屏引发热议,整个过程无需本人在场便被轻易破解实在令人震惊,虽然目前该功能已经下线,但刷脸背后技术是否安全、面部信息泄露等问题仍是大众最为关心的问题。 事实上,现在人们听到“…

3D人脸识别——点云转化为可训练的图片

1.场景介绍 3D人脸点云不容易直接训练&#xff0c;需要将其转化为二维图片。大部分论文是这样做的&#xff1a;首先求出每个点所在平面的法向量&#xff0c;发向量与水平面和竖直平面的夹角组成两个通道&#xff0c;深度图是一个通道。然后&#xff0c;将这三个通道归一到[0~25…

人脸识别

自20世纪下半叶&#xff0c;计算机视觉技术逐渐地发展壮大。同时&#xff0c;伴随着数字图像相关的软硬件技术在人们生活中的广泛使用&#xff0c;数字图像已经成为当代社会信息来源的重要构成因素&#xff0c;各种图像处理与分析的需求和应用也不断促使该技术的革新。计算机视…