1

当我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网络的损失函数?

ps 我使用的数据集是图书馆提供的MNISTtorchvision数据集。

ps这里提供的类似问题的答案并没有为我的案例提出解决方案。

4

1 回答 1

2

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

你的目标不完整!如果有多个类,您应该使用torch.nn.CrossEntropyLoss而不是torch.nn.BCELoss()

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

于 2019-06-30T05:36:12.947 回答