Вычислить перекрестные энтропийные потери для классификации в pytorch - PullRequest
2 голосов
/ 23 сентября 2019

Я пытаюсь построить две нейронные сети для классификации.Один для бинарных и второй для классификации нескольких классов.Я пытаюсь использовать torch.nn.CrossEntropyLoss() в качестве функции потерь, но я пытаюсь обучить свою первую нейронную сеть, я получаю следующую ошибку:

multi-target not supported at /opt/conda/conda-bld/pytorch_1565272271120/work/aten/src/THNN/generic/ClassNLLCriterion.c:22

Из моего анализа я обнаружил, что мой набор данных имеет двапроблемы, вызвавшие ошибку.

  • Мой набор данных содержит один код в горячем виде .Я использовал одну горячую кодировку для предварительной обработки моего набора данных.Первая целевая переменная Y_binary имеет форму torch.Size([125973, 1]), заполненную нулями и 1, указывающими классы «Нет» и «Да».
  • Мои данные имеют неверные размеры? Я нашелчто я не могу использовать простой вектор с функцией кросс-энтропийной потери.Некоторые люди использовали следующий код для изменения своего целевого вектора перед передачей в функцию потерь.

out = out.permute(0, 2, 3, 1).contiguous().view(-1, class_number)

Но я не совсем понял причины этого кода.Но мне кажется, что мне нужно отслеживать следующие переменные: Class_Number, Batch_size, Dimension_Output.Для моего кода здесь указаны размеры

X_train.shape: (125973, 122)
Y_train2.shape: (125973, 1)
batch_size = 64
K = len(set(Y_train2)) # Binary classification For multi class classification use K = len(set(Y_train5))
  • Должно ли целевое значение быть одним горячим кодированием?Если нет, как я могу передать номинальную функцию в функцию потерь?
  • Если я использую изменение формы вывода, вы можете помочь мне сделать это для моего кода?

Я пытаюсьиспользовать эту функцию потерь для обеих моих нейронных сетей.

Заранее спасибо,

1 Ответ

2 голосов
/ 23 сентября 2019

Ошибка связана с использованием torch.nn.CrossEntropyLoss () , которое можно использовать, если вы хотите предсказать 1 класс из N классов.Для мультиклассовой классификации вы должны использовать torch.nn.BCEWithLogitsLoss () , который объединяет слой Sigmoid и BCELoss в одном классе.

В случае мультикласса, и если вы используете Sigmoid + BCELoss, то вам нужно, чтобы целью было кодирование в одно касание, т.е. что-то вроде этого для образца: [0 1 0 0 0 1 0 0 1 0], где 1 будет нарасположение классов присутствующих.

...