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