nn.NLLLoss()目标大小问题

时间:2019-05-26 14:41:20

标签: python-3.x pytorch

我有一个大小为[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)相匹配。

1 个答案:

答案 0 :(得分:0)

我不确定100%,因为我不明白标签的含义。但是我认为您想要从2nd索引中选择两个不同的标签。因此,您应该更改:

labels1,labels2 = labels[0]

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

此外,NLLLoss将类索引作为输入,您不必使用一键编码的标签。但是,该问题已经解决here