You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中nn.CrossEntropyLoss在不同batch size下的使用疑问

nn.CrossEntropyLoss 在多帧序列场景下的使用说明

batch size=1 的情况

你给出的代码修正变量名后是可行的,注意代码里的outputs、targets要和前面定义的output、label对应:

label = label.squeeze(0)
output = output.squeeze(0)
criterion = nn.CrossEntropyLoss()
loss = criterion(output, label)

nn.CrossEntropyLoss要求输入特征的形状为 (N, C)(N是样本数,C是类别数),或带额外维度的 (N, C, d1, d2,...)。squeeze后output变为(30,7)(30个样本,7类),label变为(30),完全符合输入要求,能正常计算损失。

其实也可以不用squeeze,直接传入原形状的张量:

criterion = nn.CrossEntropyLoss()
loss = criterion(output, label.squeeze(0))
# 甚至更简单:label是(1,30),和output的前两维(1,30)匹配,直接传也行
loss = criterion(output, label)

batch size=2 的情况

不用做squeeze操作,两种方式都能正常调用:

方式1:手动合并维度

把batch和frame维度合并成总样本数(2*30=60),让特征和标签符合(N,C)和(N)的标准格式:

criterion = nn.CrossEntropyLoss()
# 将output从(2,30,7) reshape为(60,7)
output_reshaped = output.view(-1, 7)
# 将label从(2,30) reshape为(60)
label_reshaped = label.view(-1)
loss = criterion(output_reshaped, label_reshaped)

方式2:直接传入原形状张量

nn.CrossEntropyLoss 默认以最后一维为类别维度,只要标签的形状和特征除类别外的维度匹配,就能自动处理。这里output是(2,30,7)(最后一维是类别),label是(2,30),维度完全匹配,直接传入即可:

criterion = nn.CrossEntropyLoss()
loss = criterion(output, label)

两种方式本质都是对每帧计算损失后取平均(默认reduction='mean'),结果完全一致。

内容的提问来源于stack exchange,提问作者Soul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:01:19