Требуется ли One-Hot Encoding для использования функции потери кросс-энтропии PyTorch? - PullRequest
0 голосов
/ 18 июня 2020

Например, если я хочу решить проблему классификации MNIST, у нас есть 10 выходных классов. В PyTorch я хотел бы использовать функцию torch.nn.CrossEntropyLoss. Должен ли я форматировать цели так, чтобы они были закодированы по очереди, или я могу просто использовать их метки классов, которые поставляются с набором данных?

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

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 объединяет обе эти операции вместе и предпочтительнее, если ваши выходные данные являются просто метками классов.

0 голосов
/ 18 июня 2020

Если вы загружаете ImageLoader для загрузки набора данных из папок, PyTorch автоматически помечает их за вас. Все, что вам нужно сделать, это структурировать папку следующим образом:

|
|__train
|   |
|   |__1
|   |_ 2
|   |_ 3
|   .
|   .
|   .
|   |_10
|
|__test
    |
    |__1
    |_ 2
    |_ 3
    .
    .
    .
    |_10

Для каждого класса должна быть отдельная папка. Если вы загружаете данные из DataFrame, вы можете использовать приведенный ниже код для их кодирования:

one_hot = torch.nn.functional.one_hot(target)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...