nn.CrossEntropyLoss
ожидает целочисленные метки. Что он делает внутренне, так это то, что он вообще не заканчивает однократным кодированием метки класса, а использует метку для индексации в выходной вектор вероятности для расчета потерь, если вы решите использовать этот класс в качестве окончательной метки. Эта небольшая, но важная деталь упрощает вычисление потерь и является операцией, эквивалентной выполнению однократного кодирования, измеряя выходные потери для каждого выходного нейрона, поскольку каждое значение в выходном слое будет равно нулю, за исключением нейрона, индексированного в целевом классе. . Следовательно, нет необходимости в горячем кодировании ваших данных, если у вас уже есть метки.
В документации это довольно ясно: https://pytorch.org/docs/master/generated/torch.nn.CrossEntropyLoss.html. В документации вы увидите targets
, которое является частью входных параметров. Это ваши ярлыки, и они описаны как:
Цели
Это для меня совершенно ясно о том, как должен быть сформирован вход и что ожидается. Если вы на самом деле хотите закодировать данные в горячем режиме, вам нужно будет использовать nn.functional.log_softmax
в качестве конечного выходного слоя, а затем использовать nn.NLLLoss
, что предполагает, что целевые метки будут закодированы в горячем режиме. Для быстрого кодирования ваших этикеток вы можете использовать torch.nn.functional.one_hot
для преобразования ваших этикеток. Однако nn.CrossEntropyLoss
объединяет обе эти операции вместе и предпочтительнее, если ваши выходные данные являются просто метками классов.