PyTorch - BCELoss: ValueError: Target and input must have the same number of elements

PyTorch - BCELoss: ValueError: Target and input must have the same number of elements

当我使用 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数据集中) ,变量 target 的形状是 [1000],因为它包含测试批次的目标 类(测试的批次大小设置为 10)。所以,问题是我如何应用 BCELoss 作为 CNN 网络的损失函数?

p.s。我使用的数据集是由 torchvision 库提供的 MNIST 数据集。

p.s。 The answer provided to a similar question here 没有针对我的情况提出解决方案。

您声称的answer没有提出解决方案,实际上解决了您的问题:

your targets are incomplete! If there are multiple classes, you should work with torch.nn.CrossEntropyLoss instead of torch.nn.BCELoss()

总而言之,torch.nn.BCELoss() 旨在用于对每个输入示例的 c 独立 二进制属性进行分类的任务。另一方面,您的任务是将每个输出分类为 c 互斥 类 之一。对于此任务,您需要不同的损失,torch.nn.CrossEntropyLoss().
由不同损失函数表示的不同任务需要不同的监督(标签)。如果您想将每个示例分类为 c 互斥 类 之一,则每个示例只需要一个整数标签(就像您在 mnist 示例中那样)。但是,如果你想将每个示例分类为 c 个独立的二进制属性,你需要为每个示例 c 个二进制标签 - 这就是为什么 pytorch 给你一个错误。