首页 > 其他分享 >深度学习 PyTorch 中的 logits 和交叉熵损失函数

深度学习 PyTorch 中的 logits 和交叉熵损失函数

时间:2024-11-13 22:15:12浏览次数:3  
标签:函数 交叉 labels 形状 损失 PyTorch logits view

在深度学习中,理解损失函数是训练模型的关键一步。在分类任务中,交叉熵损失函数是最常用的损失函数之一。本文将详细解释 PyTorch 中的 logits、交叉熵损失函数的工作原理,并展示如何调整张量的形状以确保计算正确的损失。

什么是 logits?

logits 是模型输出的未归一化预测值,通常是全连接层的输出。在分类任务中,logits 的形状通常为 (batch_size, num_labels),其中 batch_size 是一个批次中的样本数,num_labels 是分类任务中的类别数。

什么是交叉熵损失函数?

交叉熵损失函数(Cross-Entropy Loss)是一种常用于分类任务的损失函数。它衡量的是预测分布与真实分布之间的差异。具体而言,它会计算每个样本的预测类别与真实类别之间的距离,然后取平均值。

在 PyTorch 中,交叉熵损失函数可以通过 torch.nn.CrossEntropyLoss 来实现。该函数结合了 LogSoftmax 和 NLLLoss 两个操作,适用于未归一化的 logits。

示例:计算 logits 和交叉熵损失

让我们通过一个具体示例来详细解释如何计算 logits 和交叉熵损失。

定义模型

首先,我们定义一个简单的模型,其中包含一个全连接层和一个 dropout 层。

import torch
import torch.nn as nn
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.dropout = nn.Dropout(p=0.1)
        self.classifier = nn.Linear(768, 3)  # 假设输入的维度是768,输出的维度是3
    def forward(self, output):
        pooled_output = output[1]
        pooled_output = self.dropout(pooled_output)
        logits = self.classifier(pooled_output)
        return logits

训练循环

接下来,我们定义一个训练循环,并在其中计算损失。

# 假设你有数据加载器和优化器等
# dataloader = ...
# optimizer = ...
model = MyModel()
criterion = nn.CrossEntropyLoss()  # 定义交叉熵损失函数
optimizer = torch.optim.Adam(model.parameters())
for epoch in range(num_epochs):
    for inputs, labels in dataloader:
        optimizer.zero_grad()
        outputs = model(inputs)
        logits = outputs
        # 计算损失
        loss = criterion(logits.view(-1, model.classifier.out_features), labels.view(-1))
        
        # 反向传播和优化
        loss.backward()
        optimizer.step()

解释代码细节

1、logits:

logits 是模型的输出。假设 logits 的形状为 (batch_size, num_labels),例如 (32, 3),表示每个批次有 32 个样本,每个样本有 3 个类别的预测值。

2、labels:

labels 是模型的真实标签。假设 labels 的形状为 (batch_size,),例如 (32,),表示每个批次有 32 个样本的真实类别标签。

3、.view():

logits.view(-1, model.classifier.out_features):view 方法用于重新调整张量的形状。这里将 logits 的形状调整为 (-1, num_labels),其中 -1 表示自动计算的维度大小,使总元素数保持不变。这种调整通常用于确保张量形状与损失函数期望的输入形状相匹配。 labels.view(-1):同样,view(-1) 将 labels 的形状调整为一维,便于与 logits 的形状对齐。

4、计算损失:

loss = criterion(logits.view(-1, model.classifier.out_features), labels.view(-1)):这行代码计算 logits 和 labels 之间的交叉熵损失。调整后的 logits 形状为 (batch_size * num_labels, num_labels),调整后的 labels 形状为 (batch_size * num_labels,)。这样,损失函数能够正确计算每个样本的损失。

具体示例

假设有一个分类任务,模型的输出和标签如下:

logits = torch.tensor([[2.0, 0.5, 0.3], [0.2, 2.0, 0.5]])
labels = torch.tensor([0, 1])

解释如下:

logits 的形状是 (2, 3),表示有 2 个样本,每个样本有 3 个类别的预测值。

labels 的形状是 (2,),表示有 2 个样本的真实类别标签。

model.classifier.out_features 是 3,表示有 3 个类别。

调整形状并计算损失:

logits = logits.view(-1, 3)  # 形状变为 (2, 3)
labels = labels.view(-1)     # 形状变为 (2,)
loss_fct = nn.CrossEntropyLoss()
loss = loss_fct(logits, labels)  # 计算交叉熵损失

交叉熵损失计算

交叉熵损失会分别计算每个样本的损失,并取平均值。例如,对于第一个样本,真实标签是类别 0,损失函数会对类别 0 的预测值计算损失。对于第二个样本,真实标签是类别 1,损失函数会对类别 1 的预测值计算损失。

总结

在本文中,我们深入解释了 PyTorch 中 logits 和交叉熵损失函数的工作原理,并展示了如何调整张量的形状以确保正确计算损失。这是分类任务中标准的损失计算步骤,有助于优化模型的参数。通过理解这些概念,你可以更好地调试和优化你的深度学习模型。

标签:函数,交叉,labels,形状,损失,PyTorch,logits,view
From: https://blog.csdn.net/qq_20314339/article/details/143754066

相关文章

  • 【自动驾驶-感知】CenterNet与CenterFusion融合目标检测的目标检测模型实战代码-基于P
    【自动驾驶-感知】CenterNet与CenterFusion融合目标检测的目标检测模型实战代码一.CenterNet目标检测模型1.中心点热力图2.物体尺寸回归3.分类任务4.损失函数二、融合目标检测CenterFusion算法原理三.实现案例与代码数据集与实验环境数据预处理与增强模型定义......
  • 基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)
    摘要:基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集,使用Pysdie6库来搭建前端页面展示......
  • PyTorch 应用实战
    PyTorch作为深度学习非常重要的框架之一,在科研和开发领域有着非常广泛的使用,是我们学习和研究LLM必备的工具之一。本文主要介绍三个PyTorch的实战案例,方便大家快速了解和体验PyTorch。一、PyTorch简介PyTorch是一个开源的Python深度学习框架,它具有灵活、高效、易于学......
  • pytorch简单识别CIFAR10彩色图片的卷积神经网络
    环境:python3.11.10pytorch2.3.0一、前期准备1.设置GPUimporttorchimporttorch.nnasnnimportmatplotlib.pyplotaspltimporttorchvisiondevice=torch.device("cuda"iftorch.cuda.is_available()else"cpu")device2.导入数据使用dataset下载CI......
  • golang交叉编译
    交叉编译需要linux环境windows安装编译器aptinstallgcc-mingw-w64编译指令windows: CGO_ENABLED=1\ GOOS=windows\ GOARCH=amd64\ CC=x86_64-w64-mingw32-gcc\ gobuild\ -buildmode=c-shared\ -ldflags\ "-s-w\ -X'${ProjectName}/vers......
  • (1) Pytorch深度学习—数值处理
    (1)Pytorch深度学习—数值处理(1)Pytorch——数值处理参考于李沐“动手学深度学习”系列以及网上各路大佬的博客资料,感谢大家的分享,如错改,如侵删。torch中的数值处理数值处理是深度学习中极其重要的一部分,张量(tensor)是后续进行处理和计算的基本单位。张量表示一个由数值组成......
  • 使用 C# 入门深度学习:Pytorch 基础
    教程名称:使用C#入门深度学习作者:痴者工良地址:https://torch.whuanle.cn1.2Pytorch基础本文内容介绍Pytorcn的基础API,主要是数组的创建方式和运算方式,由于相关内容跟Numpy比较相似,并且Numpy类型可以转torch.Tensor,因此对Numpy感兴趣的读者可以参考笔者的其它文......
  • (1) Pytorch深度学习—数值处理
    (1)Pytorch——数值处理参考于李沐“动手学深度学习”系列以及网上各路大佬的博客资料,感谢大家的分享,如错改,如侵删。torch中的数值处理数值处理是深度学习中极其重要的一部分,张量(tensor)是后续进行处理和计算的基本单位。张量表示一个由数值组成的数组,这个数组可能有多个维度。......
  • pytorch简单识别MNIST的全连接神经网络
    本文通过PyTorch框架来构建、训练以及评估一个简单的全连接神经网络,以便理解神经网络的基本结构,并通过实际操作获得第一手的经验。选择的任务是在经典的MNIST手写数字数据集上进行数字识别,这是学习深度学习不可或缺的一个实验。一、PyTorch概览PyTorch是一个开源的机器学习库,广......
  • miniconda Pytorch CUDA Cudnn onnxruntime
    FROMubuntu:22.04#docker启动方式#dockerrun-itd--gpusall--privileged=true--shm-size8G--nameonnx197271d29cb79/bin/bashMAINTAINERSuSu#切换阿里云源RUNapt-getupdate&&apt-getinstall-yvim&&apt-getinstall-ysudo&&......