PyTorch CrossEntropyLoss最小批量大小

时间:2020-02-24 12:20:12

标签: pytorch cross-entropy

我正在尝试构建一个简单的示例,该示例的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

1 个答案:

答案 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的输入。