嵌入式学习-土堆PyTorch(7)-day23

损失函数的调用

import torch
from torch import nn
from torch.nn import L1Lossinputs = torch.tensor([1.0,2.0,3.0])
target = torch.tensor([1.0,2.0,5.0])inputs = torch.reshape(inputs, (1, 1, 1, 3))
target = torch.reshape(target, (1, 1, 1, 3))
#损失函数
loss = L1Loss(reduction='sum')
#MSELoss均值方差
loss_mse = nn.MSELoss()
result1 = loss(inputs, target)
result2 = loss_mse(inputs, target)
print(result1, result2)

 实际应用

import torch
import torchvision.datasets
from torch import nn
from torch.nn import Conv2ddataset = torchvision.datasets.CIFAR10(root='./data_CIF', train=False, download=True, transform=torchvision.transforms.ToTensor())
dataloader = torch.utils.data.DataLoader(dataset, batch_size=1)class Tudui(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2)self.maxpool1 = nn.MaxPool2d(kernel_size=2)self.conv2 = nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2)self.maxpool2 = nn.MaxPool2d(kernel_size=2)self.conv3 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2)self.maxpool3 = nn.MaxPool2d(kernel_size=2)self.flatten = nn.Flatten()self.linear1 = nn.Linear(in_features=1024, out_features=64)self.linear2 = nn.Linear(in_features=64, out_features=10)self.model1 = nn.Sequential(Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2),nn.MaxPool2d(kernel_size=2),nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2),nn.MaxPool2d(kernel_size=2),nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2),nn.MaxPool2d(kernel_size=2),nn.Flatten(),nn.Linear(in_features=1024, out_features=64),nn.Linear(in_features=64, out_features=10))def forward(self, x):x = self.model1(x)return x
loss = nn.CrossEntropyLoss()
tudui = Tudui()
for data in dataloader:imgs,targets = dataoutputs = tudui(imgs)result1 = loss(outputs, targets)print(result1)#反向传播result1.backward()#梯度grad会改变,从而通过grad来降低loss

torch.nn.CrossEntropyLoss 

🧩 CrossEntropyLoss 是什么?

本质上是:

Softmax + NLLLoss(负对数似然) 的组合。

公式:

\text{Loss} = - \sum_{i} y_i \log(\hat{p}_i)

  • \hat{p}_i​:模型预测的概率(通过 softmax 得到)

  • y_i​:真实类别的 one-hot 标签

PyTorch 不需要你手动做 softmax,它会直接从 logits(未经过 softmax 的原始输出)算起,防止数值不稳定。


🏷️ 常用参数

torch.nn.CrossEntropyLoss(weight=None, ignore_index=-100, reduction='mean')

参数含义
weight给不同类别加权(处理类别不均衡)
ignore_index忽略某个类别(常见于 NLP 的 padding)
reductionmean(默认平均)、sum(求和)、none(逐个样本返回 loss)


🎨 最小使用例子

import torch
import torch.nn as nncriterion = nn.CrossEntropyLoss()# 假设 batch_size=3, num_classes=5
outputs = torch.tensor([[1.0, 2.0, 0.5, -1.0, 0.0],[0.1, -0.2, 2.3, 0.7, 1.8],[2.0, 0.1, 0.0, 1.0, 0.5]])  # logits
labels = torch.tensor([1, 2, 0])  # 真实类别索引loss = criterion(outputs, labels)
print(loss.item())
  • outputs:模型输出 logits,不需要 softmax;

  • labels:真实类别(索引型),如 0, 1, 2,...

  • loss.item():输出标量值。


💡 你需要注意:

⚠️ 重点📌 说明
logits 直接输入不要提前做 softmax
label 是类别索引不是 one-hot,而是整数(如 [1, 3, 0]
自动求 batch 平均默认 reduction='mean'
多分类用它最合适二分类也能用,但 BCEWithLogitsLoss 更常见


🎁 总结

优点缺点
✅ 简单强大,适合分类❌ 不适合回归任务
✅ 内置 softmax + log❌ label 不能是 one-hot
✅ 数值稳定性强❌ 类别极度不均衡需额外加 weight


🎯 一句话总结

CrossEntropyLoss 是深度学习中分类问题的“首选痛点衡量尺”,帮你用“正确标签”去教训“错误预测”,模型越聪明 loss 越小。

 公式:

 

1️⃣ 第一部分:

- \log \left( \frac{\exp(x[\text{class}])}{\sum_j \exp(x[j])} \right)

这是经典 负对数似然(Negative Log-Likelihood):

  • 分子:你模型对正确类别 class 输出的得分(logits),取 exp;

  • 分母:所有类别的 logits 做 softmax 归一化;

  • 再取负 log —— 意思是“你对正确答案预测得越自信,loss 越小”。


2️⃣ 推导为:

= - x[\text{class}] + \log \left( \sum_j \exp(x[j]) \right)

log(a/b) = log(a) - log(b) 的变形:

  • - x[\text{class}]:你对正确类输出的分值直接扣掉;

  • +\log(\sum_j \exp(x[j])):对所有类别的总分值做归一化。

这是交叉熵公式最常用的“log-sum-exp”形式。


📌 为什么这么写?

  • 避免直接用 softmax(softmax+log 合并后可以避免数值不稳定 🚀)

  • 计算量更高效(框架底层可以优化)


🌟 直观理解:

场景解释
正确类分数高x[\text{class}]越大,loss 越小
错误类分数高\sum \exp(x[j])越大,loss 越大
目标压低 log-sum-exp,拉高正确类别 logits

🎯 一句话总结:

交叉熵 = “扣掉正确答案得分” + “对所有类别归一化”,越接近正确答案,loss 越小。
这就是你训练神经网络时 模型越来越聪明的数学依据 😎

举例:

logits = torch.tensor([1.0, 2.0, 0.1])  # 模型输出 (C=3)
label = torch.tensor([1])  # 真实类别索引 = 1

其中:

  • N=1(batch size)

  • C=3(类别数)

  • 正确类别是索引1,对应第二个值:2.0

🎁 完整公式回顾

\text{loss}(x, y) = -x[y] + \log \sum_{j} \exp(x[j])


🟣 第一步:Softmax + log 逻辑

softmax 本质上是:

p = \frac{\exp(x[\text{class}])}{\sum_j \exp(x[j])}

但是 PyTorch 的 CrossEntropyLoss 内部直接用:

\text{loss} = - \log p


🧮 你这个例子手动算:

logits = [1.0, 2.0, 0.1],class = 1,对应 logit = 2.0

第一部分:

- x[\text{class}] = -2.0

第二部分:

\log \sum_{j=1}^{3} \exp(x[j]) = \log (\exp(1.0) + \exp(2.0) + \exp(0.1))

先算:

  • exp(1.0)≈2.718

  • exp(2.0)≈7.389

  • exp(0.1)≈1.105

加起来:

∑=2.718+7.389+1.105=11.212

取对数:

log⁡(11.212)≈2.418

最终 loss:

loss=−2.0+2.418=0.418

🌟 你可以这样理解

部分含义
−x[class]- x[\text{class}]−x[class]惩罚正确答案打分太低
log⁡∑exp⁡(x)\log \sum \exp(x)log∑exp(x)考虑所有类别的对比,如果错误类别打分高也被惩罚
最终目标“提升正确答案打分、降低错误答案打分”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915530.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2025最新】使用neo4j实现GraphRAG所需的向量检索

学习笔记,比较混乱,介意慎点。 背景 在将UMLS或者LightRAG构造的数据库存入neo4j之后,我开始将知识图谱运用到实际场景的使用中、例如查询、推理。然而,由于字符串匹配导致大量术语在检索时出现缺失。导致检索效果不佳。我们需要…

【AI深究】随机森林(Random Forest)全网最详细全流程详解与案例(附Python代码演示)|集成学习|数学原理、案例流程、代码演示及结果解读|参数与调优、工程启示、单棵决策树的对比、优缺点

大家好,我是爱酱。本篇将会系统地讲解随机森林(Random Forest)的原理、核心思想、数学表达、算法流程、代码实现与工程应用。内容适合初学者和进阶读者,配合公式和可视化示例。 注:本文章含大量数学算式、详细例子说明…

6.String、StringBuffer、StringBuilder区别及使用场景

String固定长度,引用的字符串内容无法改变例如,String s abc;s def;那么 s 字符串对应的地址已经改变了StringBuider 声明一个对象时,指向堆中的一块空间,包括两个属性 value 和 count其中 value 属性类似动态数组,可…

Qualcomm Linux 蓝牙指南学习--验证 Fluoride 协议栈的功能(2)

前言 Qualcomm Technologies推出的Linux蓝牙指南详细介绍了基于Qualcomm RB3 Gen 2和IQ-9100 Beta开发套件的蓝牙解决方案。该文档涵盖BlueZ和Fluoride协议栈的功能验证流程,支持蓝牙5.2核心规范,包括WCN6750/WCN6856/QCA6698AQ芯片组的特性。主要内容分为三部分: ‌1. 功…

Spring Boot中REST与gRPC并存架构设计与性能优化实践指南

Spring Boot中REST与gRPC并存架构设计与性能优化实践指南 在微服务架构日益复杂的当下,单一协议往往难以满足高并发低延迟与生态兼容的双重需求。本文基于真实生产环境的项目经验,分享了如何在Spring Boot中同时提供RESTful API和gRPC接口的架构设计、性…

Simulink仿真-model Setting关键配置

1.概述 Simulink 的仿真设置(Model Settings)是确保仿真准确性的关键配置,主要包括仿真时间、步长、解法器选择等核心参数的设定。 ‌可以通过快捷键‌CtrlE‌打开仿真设置界面2.核心参数 2.1 求解器Solver配置 时间范围:设置仿真…

内网与外网是通过什么进行传输的?内外网文件传输的安全方法

在当前企业信息化建设日益深入的背景下,出于安全防护与合规管理的需要,很多单位将网络划分为内网(办公网/生产网)与外网(互联网/DMZ区)。这种网络隔离策略虽然提升了安全性,但也带来了内外网文件…

RabbitMQ面试精讲 Day 4:Queue属性与消息特性

【RabbitMQ面试精讲 Day 4】Queue属性与消息特性 开篇 欢迎来到"RabbitMQ面试精讲"系列的第4天!今天我们将深入探讨RabbitMQ中Queue的属性配置与消息特性,这是理解和优化RabbitMQ使用的关键知识点。掌握这些内容不仅能帮助你在面试中展现深厚…

uniapp vue3 vite项目使用微信云开发(云函数)

1、在根目录新建文件夹 cloudfunctions2、配置 manifest.json在项目根目录的 manifest.json 文件中,找到微信小程序配置部分,添加 cloudfunctionRoot 字段,指向你的云函数目录:{"mp-weixin": {"cloudfunctionRoot&…

AK视频下载工具:免费高效,多平台支持

近期小编又发现了一款更强大的新神器——AK视频下载(电脑版),一起来了解下吧~ 软件亮点 完全免费,无需安装,操作便捷,直接打开即可使用。 支持多平台视频下载,包括抖音、B站、小红书、快手等主…

7月21日星期一今日早报简报微语报早读

7月21日星期一,农历六月廿七,早报#微语早读。1、广东佛山累计报告基孔肯雅热确诊病例1873例,均为轻症;2、祝贺!石宇奇夺得日本羽毛球公开赛男单冠军;3、中国和匈牙利顺利完成引渡条约谈判;4、科…

基于Milvus Lite的轻量级向量数据库实战指南

一、为什么选择Milvus Lite? 在人工智能和语义搜索应用中,高效的向量检索是核心需求。相比需要部署Docker的完整版Milvus,Milvus Lite提供: 零依赖:纯Python实现,无需安装Docker或外部组件 开箱即用&…

深度学习时代下的社交媒体情感分析:方法、工具与未来挑战

摘要:基于Yue等学者2019年发表的权威综述,本文系统总结情感分析的技术框架、实战资源与前沿方向,附Python代码示例。 一、情感分析为何重要? 情感分析(Sentiment Analysis)旨在从文本中提取主观态度&…

Spring Boot 3.0新特性全面解析与实战应用

Spring Boot 3.0新特性全面解析与实战应用 引言 Spring Boot 3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进。本文将深入解析Spring Boot 3.0的核心变化,并通过实战示例展示如何在项目中应用这些新特性。 核心变化概览 Java版…

C# sqlsugar 主子表 联合显示 LeftJoin

在C#中使用SqlSugar ORM进行Left Join操作是一种常见需求,尤其是在处理复杂数据库查询时。SqlSugar是一个轻量级、高性能的ORM框架,支持多种数据库。下面是如何使用SqlSugar进行Left Join操作的示例。1. 安装SqlSugar首先,确保你的项目中已经…

【ROS1】08-ROS通信机制——服务通信

目录 一、概念 二、何时使用服务 三、话题通信与服务通信的区别 四、案例 4.1 C实现 4.1.1 服务端 4.1.2 客户端 4.1.3 测试执行 4.2 Python实现 4.2.1 服务端 4.2.2 客户端 4.2.3 客户端优化——动态传参 4.2.4 客户端优化——等待服务端启动后再发起请求 一、概…

45.sentinel自定义异常

上文提到Blocked by Sentinel(flow limits) 限流异常,这样返给用户就不太友好,所以需要自定义异常。 默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口: BlockException有很多子类: pac…

f4硬件配置spi

f4型号是stm32f407zgt6用spi来进行MOSI,主机发送从机接收时钟频率设置为1MHzMOSI为PC3,SCK为PB10,CS设置为output->PB12时钟配置如下:波特率计算公式为:128M/(4*Prescaler) 要让波特率为1M,10…

Redis的持久化-RDB

1.持久化一提到持久化,我们就会第一时间联想到M有SQL的事务,MySQL事务有四个比较核心的特征:原子性(把多个操作打包成一个整体),一致性(事务执行之前和之后,数据都不能离谱&#xff…

前端内存泄漏

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…