【问题标题】:PyTorch - BCELoss: ValueError: Target and input must have the same number of elementsPyTorch - BCELoss:ValueError:目标和输入必须具有相同数量的元素
【发布时间】:2019-11-11 06:53:46
【问题描述】:

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

附言我使用的数据集是由torchvision 库提供的MNIST 数据集。

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

【问题讨论】:

    标签: machine-learning conv-neural-network pytorch mnist torchvision


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的解释。那么,当我在寻找它们的性能比较时,还有哪些其他损失函数可以用于我的案例?
    猜你喜欢
    • 2018-05-15
    • 1970-01-01
    • 2020-09-24
    • 2020-07-27
    • 2020-06-10
    • 2019-03-14
    • 1970-01-01
    • 2016-12-15
    • 2013-11-03
    相关资源
    最近更新 更多