PyTorch中的损失函数:F.nll_loss 与 nn.CrossEntropyLoss

文章目录

    • 背景介绍
    • F.nll_loss
      • 什么是负对数似然损失?
      • 应用场景
    • nn.CrossEntropyLoss
      • 简化工作流程
      • 内部机制
    • 区别与联系

背景介绍

无论是图像分类、文本分类还是其他类型的分类任务,交叉熵损失(Cross Entropy Loss)都是最常用的一种损失函数。它衡量的是模型预测的概率分布与真实标签之间的差异。在 PyTorch 中,有两个特别值得注意的实现:F.nll_lossnn.CrossEntropyLoss

F.nll_loss

什么是负对数似然损失?

F.nll_loss 是负对数似然损失(Negative Log Likelihood Loss),主要用于多类分类问题。它的输入是对数概率(log-probabilities),这意味着在使用 F.nll_loss 之前,我们需要先对模型的输出应用 log_softmax 函数,将原始输出转换为对数概率形式。

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader, TensorDataset# 创建一些虚拟数据
features = torch.randn(100, 20)  # 假设有100个样本,每个样本有20个特征
labels = torch.randint(0, 3, (100,))  # 假设有3个类别# 创建数据加载器
dataset = TensorDataset(features, labels)
data_loader = DataLoader(dataset, batch_size=10, shuffle=True)class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc = nn.Linear(20, 3)  # 输入维度为20,输出维度为3(对应3个类别)def forward(self, x):return self.fc(x)model_nll = SimpleModel()
optimizer = torch.optim.SGD(model_nll.parameters(), lr=0.01)for inputs, targets in data_loader:optimizer.zero_grad()  # 清除梯度outputs = model_nll(inputs)  # 模型前向传播log_softmax_outputs = F.log_softmax(outputs, dim=1)  # 应用 log_softmaxloss = F.nll_loss(log_softmax_outputs, targets)  # 计算 nll_lossloss.backward()  # 反向传播optimizer.step()  # 更新权重print(f"Batch Loss with F.nll_loss: {loss.item():.4f}")

应用场景

由于 F.nll_loss 需要预先计算 log_softmax,这为用户提供了一定程度的灵活性,尤其是在需要复用 log_softmax 结果的情况下。

nn.CrossEntropyLoss

简化工作流程

相比之下,nn.CrossEntropyLoss 更加直接和易用。它结合了 log_softmaxnll_loss 的功能,因此可以直接接受未经归一化的原始输出作为输入,内部自动完成这两个步骤。

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import DataLoader, TensorDataset# 创建一些虚拟数据
features = torch.randn(100, 20)  # 假设有100个样本,每个样本有20个特征
labels = torch.randint(0, 3, (100,))  # 假设有3个类别# 创建数据加载器
dataset = TensorDataset(features, labels)
data_loader = DataLoader(dataset, batch_size=10, shuffle=True)class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc = nn.Linear(20, 3)  # 输入维度为20,输出维度为3(对应3个类别)def forward(self, x):return self.fc(x)model_ce = SimpleModel()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model_ce.parameters(), lr=0.01)for inputs, targets in data_loader:optimizer.zero_grad()  # 清除梯度outputs = model_ce(inputs)  # 模型前向传播loss = criterion(outputs, targets)  # 直接计算交叉熵损失,内部包含 log_softmaxloss.backward()  # 反向传播optimizer.step()  # 更新权重print(f"Batch Loss with nn.CrossEntropyLoss: {loss.item():.4f}")

内部机制

实际上,nn.CrossEntropyLoss = log_softmax + nll_loss 。这种设计简化了用户的代码编写过程,特别是当不需要对中间结果进行额外操作时。

区别与联系

  • 输入要求F.nll_loss 要求输入为 log_softmax 后的结果;而 nn.CrossEntropyLoss 可以直接接受未经 softmax 处理的原始输出。

  • 灵活性:如果需要对 log_softmax 结果进行进一步处理或调试,那么 F.nll_loss 提供了更大的灵活性。

  • 便捷性:对于大多数用户而言,nn.CrossEntropyLoss 因其简洁性和内置的 log_softmax 步骤,是更方便的选择。

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

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

相关文章

案例1_3:流水灯

文章目录 文章介绍原理图&#xff08;同案例1_2&#xff09;代码效果图 文章介绍 原理图&#xff08;同案例1_2&#xff09; 代码 #include <reg51.h> // 包含头文件void delay(unsigned int time) {unsigned int i, j;for (i 0; i < time; i)for (j 0; j < 1…

基于物联网技术的电动车防盗系统设计(论文+源码)

1总体设计 本课题为基于物联网技术的电动车防盗系统&#xff0c;在此将整个系统架构设计如图2.1所示&#xff0c;其采用STM32F103单片机为控制器&#xff0c;通过NEO-6M实现GPS定位功能&#xff0c;通过红外传感器检测电瓶是否离开位&#xff0c;通过Air202 NBIOT模块将当前的数…

学习知识的心理和方法杂记-02

本文简单记录下我个人对大脑学习模式的认识。 人脑的基本能力是什么&#xff1f; 接收输入的能力。语言和声音 视觉图像 触觉 嗅觉 味觉等。 存储能力。人脑存储能力背后的物理化学结构我们人类目前还无法完全认知&#xff0c;但是存储的目标物一定是人可以通过五官获得的形…

国产化替换案例:CACTER邮件网关为Groupwise系统加固邮件安全防线

电子邮件作为企业信息流转的命脉&#xff0c;承载着商业机密与客户数据。然而&#xff0c;网络攻击手段日益复杂&#xff0c;钓鱼邮件等威胁正快速侵蚀企业安全防线。据《2024年第四季度企业邮箱安全性研究报告》显示&#xff0c;2024年Q4企业邮箱用户遭遇的钓鱼邮件数量激增至…

3.使用ElementUI搭建侧边栏及顶部栏

1. 安装ElementUI ElementUI是基于 Vue 2.0 的桌面端组件库。使用之前&#xff0c;需要在项目文件夹中安装ElementUI&#xff0c;在终端中输入以下命令&#xff0c;进行安装。 npm i element-ui -S并在main.js中引入ElementUI 2. 使用elmentUI组件进行页面布局 2.1 清空原…

C++并发以及多线程的秘密

1.基础概念 并发&#xff08;Concurrency&#xff09; 并发是指在同一时间段内&#xff0c;多个任务看起来像是同时执行的。并发并不一定意味着真正的同时执行&#xff0c;它可以是通过时间片轮转等方式在多个任务之间快速切换&#xff0c;让用户感觉多个任务在同时进行。并发…

从零开始实现大语言模型(十四):高阶训练技巧

1. 前言 预训练大语言模型的流程与训练普通神经深度网络模型本质上并没有任何不同。可以使用深度学习实践中已经被证明非常有效的高阶训练技巧&#xff0c;优化大语言模型预训练流程&#xff0c;使大语言模型预训练效率更高&#xff0c;训练过程更稳定。 本文介绍深度学习领域…

利用EasyCVR平台打造化工园区视频+AI智能化监控管理系统

化工园区作为化工产业的重要聚集地&#xff0c;其安全问题一直是社会关注的焦点。传统的人工监控方式效率低下且容易出现疏漏&#xff0c;已经难以满足日益增长的安全管理需求。 基于EasyCVR视频汇聚平台构建的化工园区视频AI智能化应用方案&#xff0c;能够有效解决这些问题&…

GB28181视频监控流媒体平台LiveGBS如何自定义收流端口区间以便减少收流端口数或解决端口冲突问题

LiveGBS GB28181流媒体服务在接收视频的时候默认是使用30000-30249&#xff0c; webrtc流播放端口区间默认是UDP的30250-30500区间。有些网络环境不方便开放这么大的端口区间&#xff0c;下面介绍下如何修改配置这个区间。 从页面上修改这个区间&#xff0c;端口区间尽量设置大…

Qt:事件

目录 处理事件 鼠标事件 键盘事件 定时器事件 窗口事件 虽然 Qt 是跨平台的 C 开发框架&#xff0c;Qt 的很多能力其实是操作系统提供的 只不过 Qt 封装了系统的 API 事件 前面学习过信号槽&#xff1a; 用户进行的各种操作&#xff0c;就可能会产生出信号&#xff0c;可以…

责任链模式:优雅处理复杂流程的设计艺术

引言 在软件设计中&#xff0c;我们经常会遇到需要按特定顺序处理请求的场景。例如&#xff0c;一个订单处理系统可能需要经过验证、付款、物流安排和客户通知等多个步骤。如果我们将这些步骤硬编码在一个方法中&#xff0c;代码将变得臃肿且难以维护。这时&#xff0c;责任链…

【STM32】玩转IIC之驱动MPU6050及姿态解算

目录 前言 一.MPU6050模块介绍 1.1MPU6050简介 1.2 MPU6050的引脚定义 1.3MPU6050寄存器解析 二.MPU6050驱动开发 2.1 配置寄存器 2.2对MPU6050寄存器进行读写 2.2.1 写入寄存器 2.2.2读取寄存器 2.3 初始化MPU6050 2.3.1 设置工作模式 2.3.2 配置采样率 2.3.3 启…

【ThreeJS Basics 09】Debug

文章目录 简介从 dat.GUI 到 lil-gui例子安装 lil-gui 并实例化不同类型的调整改变位置针对非属性的调整复选框颜色 功能/按钮调整几何形状文件夹调整 GUI宽度标题关闭文件夹隐藏按键切换 结论 简介 每一个创意项目的一个基本方面是能够轻松调整。开发人员和参与项目的其他参与…

【Pandas】pandas Series explode

Pandas2.2 Series Computations descriptive stats 方法描述Series.argsort([axis, kind, order, stable])用于返回 Series 中元素排序后的索引位置的方法Series.argmin([axis, skipna])用于返回 Series 中最小值索引位置的方法Series.argmax([axis, skipna])用于返回 Series…

电脑网络出现问题!简单的几种方法解除电脑飞行模式

在某些情况下&#xff0c;您可能需要关闭电脑上的飞行模式以便重新连接到 Wi-Fi、蓝牙或其他无线网络。本教程中简鹿办公将指导您如何在 Windows 和 macO S操作系统上解除飞行模式。 一、Windows 系统下解除飞行模式 通过快捷操作中心 步骤一&#xff1a;点击屏幕右下角的通知…

nature genetics | SCENT:单细胞多模态数据揭示组织特异性增强子基因图谱,并可识别致病等位基因

–https://doi.org/10.1038/s41588-024-01682-1 Tissue-specific enhancer–gene maps from multimodal single-cell data identify causal disease alleles 研究团队和单位 Alkes L. Price–Broad Institute of MIT and Harvard Soumya Raychaudhuri–Harvard Medical S…

MyBatis-Plus 与 Spring Boot 的最佳实践

在现代 Java 开发中,MyBatis-Plus 和 Spring Boot 的结合已经成为了一种非常流行的技术栈。MyBatis-Plus 是 MyBatis 的增强工具,提供了许多便捷的功能,而 Spring Boot 则简化了 Spring 应用的开发流程。本文将探讨如何将 MyBatis-Plus 与 Spring Boot 进行整合,并分享一些…

uploadlabs通关思路

目录 靶场准备 复现 pass-01 代码审计 执行逻辑 文件上传 方法一&#xff1a;直接修改或删除js脚本 方法二&#xff1a;修改文件后缀 pass-02 代码审计 文件上传 1. 思路 2. 实操 pass-03 代码审计 过程&#xff1a; 文件上传 pass-04 代码审计 文件上传 p…

AI编程工具节选

1、文心快码 百度基于文心大模型推出的一款智能编码助手&#xff0c; 官网地址&#xff1a;文心快码(Baidu Comate)更懂你的智能代码助手 2、通义灵码 阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c; 官网地址&#xff1a;通义灵码_你的智能编码助手-阿里云 …

目录扫描工具深度对比:Dirb、Dirsearch、DirBuster、Feroxbuster 与 Gobuster

✨ 前言 在网络安全测试与渗透测试中&#xff0c;目录扫描&#xff08;又称目录枚举&#xff09;是一项至关重要的技术。它用于发现 Web 服务器上未公开的隐藏目录和文件&#xff0c;这些资源可能包含敏感数据、配置文件甚至潜在漏洞&#xff0c;因而成为攻击者与安全研究人员…