当我使用BCELoss
作为神经网络的损失函数时,得到ValueError: Target and input must have the same number of elements
。
这是我的测试阶段代码(这是一个非常典型的测试阶段代码):
network.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = network(data)
output = output.to(device)
test_loss += loss_function(output, target).item() # error happens here
_, predicted = torch.max(output.data, 1)
correct += (predicted == target).sum().item()
变量output
的形状为[1000, 10]
,因为存在10
个目标类(在 MNIST 数据集中),变量{{ 1}}为target
,因为它包含测试批次的目标类别(测试的批次大小设置为[1000]
)。因此,问题是如何将10
用作BCELoss
网络的损失函数?
p.s。我使用的数据集是CNN
库提供的 MNIST 数据集。
p.s。 The answer provided to a similar question here并未针对我的情况提出解决方案。
答案 0 :(得分:1)
您声称的answer并没有提出解决方案,实际上确实解决了您的问题:
您的目标不完整!如果有多个类,则应使用
torch.nn.CrossEntropyLoss
而不是torch.nn.BCELoss()
回顾一下,torch.nn.BCELoss()
用于按照每个输入示例对c
独立个二进制属性进行分类的任务。另一方面,您的任务是将每个输出分为c
互斥类之一。对于此任务,您需要另外损失torch.nn.CrossEntropyLoss()
。
由不同损失函数表示的不同任务需要不同的监督(标签)。如果要将每个示例分类为c
互斥类之一,则每个示例仅需要一个整数标签(如mnist示例中的示例)。但是,如果要将每个示例分类为c
个独立的二进制属性,则每个示例都需要c
二进制标签-这就是pytorch给您错误的原因。