У меня есть сеть, которая выводит трехмерный тензор размера (batch_size, max_len, num_classes)
. Моя гордая правда в форме (batch_size, max_len)
. Если я выполню однократное кодирование этикеток, они будут иметь форму (batch_size, max_len, num_classes)
, т.е. значения в max_len
являются целыми числами в диапазоне [0, num_classes]
. Поскольку исходный код слишком длинный, я написал более простую версию, воспроизводящую исходную ошибку.
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)
форма пред и метка соответственно torch.Size([32, 350, 1000])
и torch.Size([32, 350])
Произошла ошибка
ValueError: ожидаемый размер цели (32, 1000), есть torch.Size ([32, 350, 1000])
Если я горячо кодирую метки для вычисления потерь
x = nn.functional.one_hot(label)
criterion(pred, x)
это вызовет следующую ошибку
ValueError: ожидаемый размер цели (32, 1000), есть torch.Size ([32, 350, 1000])