损失函数——交叉熵损失(Cross-entropy loss)

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

交叉熵损失(Cross-entropy loss)是深度学习中常用的一种损失函数,通常用于分类问题。它衡量了模型预测结果与实际结果之间的差距,是优化模型参数的关键指标之一。以下是交叉熵损失的详细介绍。

假设我们有一个分类问题,需要将输入数据x分为C个不同的类别。对于每个输入数据x,我们定义一个C维的向量y^​,其中y^​i​表示x属于第i个类别的概率。我们的目标是使得y^​尽可能接近真实的标签y的概率分布。

假设真实标签y是一个C维的向量,其中只有一个元素为1,其余元素为0,表示x属于第k个类别。那么,我们可以使用交叉熵损失来衡量模型预测结果和真实标签之间的差距。交叉熵损失的公式如下: 

                                                         L\left ( x,y \right ) = -\sum _{i=1}^{C}x_{_{i}} log y_{i}

其中,xi​表示真实标签的第i个元素,y​i​表示模型预测x属于第i个类别的概率。

交叉熵损失的本质是衡量两个概率分布之间的距离。其中一个概率分布是真实标签y的分布,另一个是模型预测的概率分布y^​。对于每个类别i,yi​表示真实标签x属于第i个类别的概率,y^​i​表示模型预测x属于第i个类别的概率。当两个概率分布越接近时,交叉熵损失越小,表示模型预测结果越准确。

交叉熵损失是一种凸函数,通常使用梯度下降等优化算法来最小化它。在深度学习中,交叉熵损失是常见的分类损失函数之一,广泛应用于图像分类、语音识别等任务中。

在PyTorch中,交叉熵损失可以使用torch.nn.CrossEntropyLoss实现。该函数将输入数据视为模型输出的概率分布,将目标标签视为类别索引,并计算这些概率与实际标签之间的交叉熵损失。

以下是一个示例代码片段,说明如何使用torch.nn.CrossEntropyLoss计算交叉熵损失:

import torch# 创建模型输出和目标标签
output = torch.randn(10, 5)  # 10个样本,5个类别
target = torch.tensor([1, 0, 4, 2, 3, 1, 0, 4, 2, 3])  # 目标类别索引# 创建交叉熵损失函数
criterion = torch.nn.CrossEntropyLoss()# 计算损失
loss = criterion(output, target)print(loss)

在训练中,你可以使用torch.nn.CrossEntropyLoss作为损失函数来优化模型。假设你已经有一个PyTorch模型和训练数据集,以下是一个简单的训练循环示例,它使用交叉熵损失函数来训练模型:

import torch
import torch.nn as nn
import torch.optim as optim# 定义模型
class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc1 = nn.Linear(10, 5)self.fc2 = nn.Linear(5, 2)def forward(self, x):x = self.fc1(x)x = nn.functional.relu(x)x = self.fc2(x)return xmodel = MyModel()# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)# 训练循环
for epoch in range(num_epochs):for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()if batch_idx % log_interval == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, batch_idx * len(data), len(train_loader.dataset),100. * batch_idx / len(train_loader), loss.item()))

在这个例子中,MyModel是一个简单的两层全连接神经网络。训练循环通过从数据集中加载数据批次,使用optimizer.zero_grad()清空梯度,计算模型输出和损失,使用loss.backward()计算梯度并使用optimizer.step()更新模型参数。每个epoch结束时,模型将在测试集上进行评估,以检查其在新数据上的泛化能力。

在这个训练循环中,我们使用nn.CrossEntropyLoss()作为损失函数,并传递模型输出和目标标签作为参数。loss.backward()计算梯度并将梯度传播回模型中的参数,从而使优化器能够更新这些参数以最小化损失。


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

相关文章

【Pytorch】交叉熵损失函数 CrossEntropyLoss() 详解

文章目录 一、损失函数 nn.CrossEntropyLoss()二、什么是交叉熵三、Pytorch 中的 CrossEntropyLoss() 函数参考链接 一、损失函数 nn.CrossEntropyLoss() 交叉熵损失函数 nn.CrossEntropyLoss() ,结合了 nn.LogSoftmax() 和 nn.NLLLoss() 两个函数。 它在做分类&a…

一文读懂交叉熵损失函数

进行二分类或多分类问题时,在众多损失函数中交叉熵损失函数较为常用。 下面的内容将以这三个问题来展开 什么是交叉熵损失以图片分类问题为例,理解交叉熵损失函数从0开始实现交叉熵损失函数 1,什么是交叉熵损失 交叉熵是信息论中的一个重…

交叉熵损失函数

目录 一、交叉熵损失函数含义 二、交叉熵损失函数定义为:​ 三、交叉熵损失函数计算案例 一、交叉熵损失函数含义 交叉熵是一个信息论中的概念,它原来是用来估算平均编码长度的。给定两个 概率分布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事件刷屏引发热议,整个过程无需本人在场便被轻易破解实在令人震惊,虽然目前该功能已经下线,但刷脸背后技术是否安全、面部信息泄露等问题仍是大众最为关心的问题。 事实上,现在人们听到“…