Кросс-энтропийные потери Pytorch из одномерных тензоров

#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)