#python #pytorch
#python #pytorch
Вопрос:
Мне здесь чего-то не хватает: почему CrossEntropyLoss
не работает с одномерными тензорами?
from torch import Tensor
X =Tensor([1.0,2.0,3.0])
labs = Tensor([2,2,3])
loss = nn.CrossEntropyLoss().forward(X,labs)
_stacklevel, dtype)
1315 dim = _get_softmax_dim('log_softmax', input.dim(), _stacklevel)
1316 if dtype is None:
-> 1317 ret = input.log_softmax(dim)
1318 else:
1319 ret = input.log_softmax(dim, dtype=dtype)
IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
Почему это не удается и что следует изменить, чтобы получить желаемый результат?
Комментарии:
1. CrossEntropyLoss ожидает, что входные данные будут в форме
(minibatch,C)
или(minibatch, C, d_1, d_2, ..., d_K)
.
Ответ №1:
Проблема обсуждается на форумах pytorch здесь. Как правильно указал Праджот, обычно для одного входного образца не имеет смысла иметь три разные метки, поэтому принимается только одна метка на вход. В сообщении на форумах обсуждаются обходные пути для расширенных вариантов использования, где это может иметь смысл.
Ответ №2:
если вы видите документацию здесь!
Input: (N,C) where C = number of classes
Target: (N) where each value is 0 <= targets[i] <= C-1
Output: scalar. If reduce is False, then (N) instead.
Таким образом, он ожидает ввода в виде 2D тензора
и цели в виде 1D
import torch
from torch import Tensor
X =Tensor([[1.0,2.0,3.0]]) #2D
labs = torch.LongTensor([2]) # 0 <= targets[i] <= C-1
loss = nn.CrossEntropyLoss().forward(X,labs)