Входное измерение для CrossEntropy Loss в PyTorch - PullRequest
1 голос
/ 29 апреля 2020

Для проблемы бинарной классификации с batch_size = 1 у меня есть lo git и значения меток, по которым мне нужно рассчитать потери.

logit: tensor([0.1198, 0.1911], device='cuda:0', grad_fn=<AddBackward0>)
label: tensor(1], device='cuda:0')
# calculate loss
loss_criterion = nn.CrossEntropyLoss()
loss_criterion.cuda()
loss = loss_criterion( b_logits, b_labels )

Однако это всегда приводит к следующей ошибке

IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)

Какие входные размеры на самом деле запрашивает CrossEntropyLoss?

1 Ответ

1 голос
/ 29 апреля 2020

Вы передаете неправильную форму тензоров.
shape должно быть ( от do c)

  • Ввод: (N,C) где C = количество классов
  • Цель: (N), где каждое значение равно 0 ≤ targets[i] ≤ C−1

Итак, b_logits форма должно быть ([1,2]) вместо ([2]), чтобы придать ему правильную форму, вы можете использовать torch.view как b_logits.view(1,-1).

И b_labels форма должна быть ([1]).
Пример.:

b_logits = torch.tensor([0.1198, 0.1911], requires_grad=True)
b_labels = torch.tensor([1])
loss_criterion = nn.CrossEntropyLoss()

loss = loss_criterion( b_logits.view(1,-1), b_labels )
loss
tensor(0.6581, grad_fn=<NllLossBackward>)
...