【深度学习基础】理解 PyTorch 中的 logits 和交叉熵损失函数
创始人
2024-11-10 02:37:34
0

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

什么是 logits?

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

什么是交叉熵损失函数?

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

在 PyTorch 中,交叉熵损失函数可以通过 torch.nn.CrossEntropyLoss 来实现。该函数结合了 LogSoftmaxNLLLoss 两个操作,适用于未归一化的 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)):这行代码计算 logitslabels 之间的交叉熵损失。调整后的 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 和交叉熵损失函数的工作原理,并展示了如何调整张量的形状以确保正确计算损失。这是分类任务中标准的损失计算步骤,有助于优化模型的参数。通过理解这些概念,你可以更好地调试和优化你的深度学习模型。

希望这篇文章对你理解 PyTorch 中的 logits 和交叉熵损失函数有所帮助!如果你有任何问题或建议,请在评论区留言。

相关内容

热门资讯

针对!微信新众游辅助(辅助)果... 针对!微信新众游辅助(辅助)果然是真的有辅助教程(有挂细节)1、游戏颠覆性的策略玩法,独创攻略技巧玩...
黑科技辅助挂!微信牵手跑的快辅... 黑科技辅助挂!微信牵手跑的快辅助(辅助)竟然真的是有辅助器(今日头条)小薇(辅助器软件下载)致您一封...
据公告内容!乐酷大厅怎么安装(... 据公告内容!乐酷大厅怎么安装(辅助)一直是有辅助软件(真是有挂)1、完成乐酷大厅怎么安装有辅助插件,...
今年以来!新超圣辅助靠谱不(辅... 今年以来!新超圣辅助靠谱不(辅助)好像是真的有辅助教程(有挂神器)1、全新机制【新超圣辅助靠谱不ai...
据权威媒体报道!老友赣州麻将破... 据权威媒体报道!老友赣州麻将破解版(辅助)果然是有辅助神器(有挂猫腻)1、玩家可以在老友赣州麻将破解...
此事引发网友热议!闲聚鱼虾蟹软... 此事引发网友热议!闲聚鱼虾蟹软件脚本(辅助)真是真的是有辅助挂(有挂技术)1、用户打开应用后不用登录...
事发当天!边锋干瞪眼辅助器(辅... 事发当天!边锋干瞪眼辅助器(辅助)真是存在有辅助方法(有挂实锤)1、边锋干瞪眼辅助器免费辅助多个强度...
为了进一步!欢乐联盟免费辅助(... 为了进一步!欢乐联盟免费辅助(辅助)一直是有辅助软件(有挂助手)运欢乐联盟免费辅助辅助工具,进入游戏...
复盘辅助挂!和和营口辅助(辅助... 复盘辅助挂!和和营口辅助(辅助)果然是真的有辅助器(今日头条)和和营口辅助是不是有人用挂微扑克wpk...
技巧辅助挂!极速摇一摇鱼虾蟹辅... 技巧辅助挂!极速摇一摇鱼虾蟹辅助(辅助)一贯确实有辅助软件(有挂神器)极速摇一摇鱼虾蟹辅助透视方法中...