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
相关产品推荐
相关产品推荐

