По большей части документация PyTorch проделывает потрясающую работу по объяснению различных функций;они обычно включают ожидаемые входные измерения, а также некоторые простые примеры.Вы можете найти описание для nn.CrossEntropyLoss()
здесь .
Чтобы перейти к вашему конкретному примеру, давайте начнем с рассмотрения ожидаемого входного измерения:
Ввод: (N, C) где C = количество классов.[...]
Чтобы добавить к этому, N обычно относится к размеру партии (количеству образцов).Чтобы сравнить это с тем, что у вас есть:
outputs.shape
>>> torch.Size([2])
Т.е. в настоящее время у нас есть только входное измерение (2,)
, а не (1,2)
, как ожидается PyTorch.Мы можем облегчить это, добавив «поддельное» измерение к нашему текущему тензору, просто используя .unsqueeze()
, например, так:
outputs = binary_model(tensor_input).unsqueeze(dim=0)
outputs.shape
>>> torch.Size([1,2])
Теперь, когда мы получили это, давайте посмотрим на ожидаемый ввод для целей:
Цель: (N) [...]
Итак, мы уже получили правильную форму для этого.Если мы попробуем это, мы все равно столкнемся с ошибкой:
RuntimeError: Expected object of scalar type Long but got scalar type Float
for argument #2 'target'.
Опять же, сообщение об ошибке довольно выразительно.Проблема здесь в том, что тензоры PyTorch (по умолчанию) интерпретируются как torch.FloatTensors
, но вместо этого входные данные должны быть целыми числами (или Long
).Мы можем просто сделать это, указав точный тип во время создания тензора:
tensor_label = torch.LongTensor([dat[1]])
Я использую PyTorch 1.0 под Linux.