Python 三维输入下的Pyrotch交叉熵损失

Python 三维输入下的Pyrotch交叉熵损失,python,neural-network,pytorch,cross-entropy,Python,Neural Network,Pytorch,Cross Entropy,我有一个网络,它输出一个大小为的3D张量(批量大小、最大长度、数量类)。我的事实是在形状(批量大小,最大长度)。如果我在标签上执行一个热编码,它的形状将是(批大小、最大长度、num类),即最大长度中的值是[0、num类]范围内的整数。因为原始代码太长,所以我编写了一个更简单的版本来复制原始错误 criterion = nn.CrossEntropyLoss() batch_size = 32 max_len = 350 num_classes = 1000 pred = torch.randn(

我有一个网络,它输出一个大小为
的3D张量(批量大小、最大长度、数量类)
。我的事实是在形状
(批量大小,最大长度)
。如果我在标签上执行一个热编码,它的形状将是
(批大小、最大长度、num类)
,即
最大长度
中的值是
[0、num类]
范围内的整数。因为原始代码太长,所以我编写了一个更简单的版本来复制原始错误

criterion = nn.CrossEntropyLoss()
batch_size = 32
max_len = 350
num_classes = 1000
pred = torch.randn([batch_size, max_len, num_classes])
label = torch.randint(0, num_classes,[batch_size, max_len])
pred = nn.Softmax(dim = 2)(pred)
criterion(pred, label)
pred和标签的形状分别为,
torch.Size([32,350,1000])
torch.Size([32,350])

遇到的错误是

ValueError:预期的目标大小(32,1000),获得火炬。大小([32,350,1000])

如果我用一个热编码标签来计算损失

x = nn.functional.one_hot(label)
criterion(pred, x)
它将抛出以下错误

ValueError:预期的目标大小(32,1000),获得火炬。大小([32,350,1000])


从中,
CrossEntropyLoss
期望其输入的形状为
(N,C,…)
,因此第二个维度始终是类的数量。如果您将
preds
重塑为大小
(批量大小、数量类、最大长度)
,则代码应该可以工作,
交叉熵权
期望其输入的形状为
(N,C…)
,因此第二个维度始终是类的数量。如果您将
preds
重塑为大小
(批量大小、数量类、最大长度)

即使您对标签进行了一次热编码,当它传递到
CrossEntropyLoss
抱歉,我想我发现了问题并更新了我的答案。即使您对标签进行了一次热编码,当它被传递到
CrossEntropyLoss
时,它将抛出一个错误。对不起,我想我找到了问题并更新了我的答案。