python-3.x - nn.NLLLoss() 目标大小问题
问题描述
我有一个大小为 [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 应与 nn.NLLLoss() 的目标 batch_size 匹配
错误:预期输入 batch_size (32) 与目标 batch_size (10) 匹配。
解决方案
我不是 100% 确定,因为我不知道这里的标签是什么意思。但我认为你想要的是从第二个索引中选择两个不同的标签。因此你应该改变:
labels1,labels2 = labels[0]
至
labels1,labels2 = labels[:, 0], labels[:, 1]
此外,NLLLoss 将类索引作为输入,您不必使用 one-hot 编码标签。但是,这个问题已经在这里解决了
推荐阅读
- logging - Serilog.ILogger 可以转换为 Microsoft.Extensions.Logging.ILogger 吗?
- node.js - ReactJS cookie 库无法识别 Express-Session Cookie
- android - 带有电话号码的firebase身份验证
- python - 每次更改都会调用 ipywidget 观察方法多次,为什么?
- amazon-web-services - S3 桶。发生未知错误:操作不适用于语句中的任何资源。如何创建 s3-bucket 策略?
- linux - 安装 speedtest-cli 时的 PIP 警告
- oauth-2.0 - 使用 ORY Hydra 进行 OpenID 会话管理
- javascript - 跨度值更改事件监听器
- mysql - 如何获得按匹配列分组的平均行数?
- php - 在循环php中使用查询函数