【问题标题】:nn.NLLLoss() target size issuenn.NLLLoss() 目标大小问题
【发布时间】:2026-02-24 20:50:01
【问题描述】:

我有一个大小为 [32,2,10] 的标签,我想将此标签分成 label1 和 label2,我需要根据每个 label1 和 label2 的输入计算损失。

模型是 VGG16 + 附加分类器。

输出类 = 10

class cust_vgg():
    def forward(self, images,model):
        out = model.features(images)
        out1 = model.avgpool(out)
        out1 = out1.reshape(out1.size(0), -1)
        return model.classifier(out1), model.classifier1(out1)  

out = cust_vgg.forward(images,model)
out_classifier,out_classifier1 = out  
labels1,labels2 = labels[0]
loss_classifier = nn.NLLLoss(out_classifier, labels1)
loss_classifier1 = nn.NLLLoss(out_classifier1,labels2)
loss = loss_classifier + loss_classifier1
loss.backward()
opt.step()

输入的 batch_size 应该与目标 batch_size 匹配 nn.NLLLoss()

错误:预期输入 batch_size (32) 与目标 batch_size (10) 匹配。

【问题讨论】:

    标签: python-3.x pytorch


    【解决方案1】:

    我不是 100% 确定,因为我不知道这里的标签是什么意思。但我认为你想要的是从第二个索引中选择两个不同的标签。因此你应该改变:

    labels1,labels2 = labels[0]
    

    labels1,labels2 = labels[:, 0], labels[:, 1]
    

    此外,NLLLoss 将类索引作为输入,您不必使用 one-hot 编码标签。不过这个问题已经解决了here

    【讨论】:

    • 我收到此错误:/opt/conda/conda-bld/pytorch_1549630534704/work/aten/src/THCUNN/generic/ClassNLLCriterion.cu:15 不支持多目标
    • @saitharun 到底在做什么?