我正在尝试构建一个简单的示例,该示例的CrossEntropyLoss为零,具有三个类且minibatch size = 1:
ce_loss = nn.CrossEntropyLoss()
outputs = torch.tensor([[1,0,3]], dtype=float)
targets = torch.tensor([1,0,3], dtype=torch.int64)
loss = ce_loss(outputs, targets)
哪个会导致错误:
ValueError: Expected input batch_size (1) to match target batch_size (3).
出什么问题了,“ target batch_size(3)”来自哪里?
更新1
根据我对PyTorch文档的理解,我尝试以下情况。请指出我错了。
示例1:
outputs = torch.tensor([[1,1]], dtype=float)
targets = torch.tensor([1], dtype=torch.int64)
loss = ce_loss(outputs, targets)
输出:
loss: 0.6931471805599453
问题:
1)我有一个等于1的类别,并且对此类别有两个预测分别等于1,对吗?
2)为什么非零损失?
示例2:
outputs = torch.tensor([[1]], dtype=float)
targets = torch.tensor([1], dtype=torch.int64)
loss = ce_loss(outputs, targets)
错误:
IndexError: Target 1 is out of bounds.
问题:
1)我有一个等于1的类别,并且对此类别的一个预测等于1,对吗?
2)为什么索引错误?
示例3:
outputs = torch.tensor([[1,1],[2,2]], dtype=float)
targets = torch.tensor([1, 2], dtype=torch.int64)
loss = ce_loss(outputs, targets)
错误:
IndexError: Target 2 is out of bounds.
问题:
1)我有两个等于1和2的类别,这些等级等于1和2的两个预测(批量大小= 2),对吗?
2)为什么索引错误?
---更多问题:----
在以下情况下,输出和目标应具有什么形状:
1)二进制分类,一个时间步长,一个输出神经元预测一个值,批大小= 1
2)二进制分类,五个不同的时间步长,一个输出神经元预测5个值,批大小= 5
3)七个类,一个时间步长,由7个输出神经元预测7个值,批量大小= 1
4)七类,五个不同的时间步长,由七个输出神经元预测五组7个值,批大小= 5
答案 0 :(得分:-1)
您的outputs
包含1批(1个样本):
outputs = torch.tensor([[1,0,3]], dtype=float)
另一方面,您的targets
包含3个类别,对应于3个批次(3个样本)。
您应该仅传递与outputs
中的样本相对应的一个目标标签,例如
targets = torch.tensor([1], dtype=torch.int64)
详细了解传递给CrossEntropy here的输入。