проблема, когда я использую кросс-энтропийную потерю как функцию потерь - PullRequest
0 голосов
/ 26 апреля 2020

когда я использую кросс-энтропийную потерю в качестве функции потерь, я получаю это измерение вне диапазона ошибок

Traceback (most recent call last):
  File "e:\testcode\cnn.py", line 122, in <module>
    loss = loss_func(output, b_y)   # cross entropy loss
  File "D:\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\modules\module.py", line 532, in __call__
    result = self.forward(*input, **kwargs)
  File "D:\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\modules\loss.py", line 916, in forward
    ignore_index=self.ignore_index, reduction=self.reduction)
  File "D:\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\functional.py", line 2021, in cross_entropy
    return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)
  File "D:\Anaconda3\envs\pytorch\lib\site-packages\torch\nn\functional.py", line 1317, in log_softmax
    ret = input.log_softmax(dim)
IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)

, а функция потерь равна

loss = loss_func(output, b_y) 

значение выхода равно

tensor([-0.3507,  0.2214,  0.3781,  0.3057], grad_fn=<SelectBackward>)

значение b_y равно

tensor([3])

1 Ответ

0 голосов
/ 26 апреля 2020

Первый аргумент, передаваемый CrossEntropyLoss, должен быть двухмерным тензором в форме [batch size x number of classes]. Если вы рассчитываете потери только для одной партии, unsqueeze логиты, прежде чем передавать их в функцию потерь.

logits = torch.tensor([-0.3507,  0.2214,  0.3781,  0.3057]).unsqueeze(0)
targets = torch.tensor([3])
loss_func = torch.nn.CrossEntropyLoss()

loss_func(logits, targets)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...