当我使用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。我使用的数据集是torchvision库提供的MNIST数据集。

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

最佳答案

您声明的answer并不提出解决方案,实际上可以解决您的问题:


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


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

关于machine-learning - PyTorch-BCELoss:ValueError:目标和输入必须具有相同数量的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56821729/

10-12 22:41