Подавить использование Softmax в CrossEntropyLoss для нейронной сети PyTorch - PullRequest
1 голос
/ 26 сентября 2019

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

Однако мне нужно сделать это, есть ли способподавить реализованное использование softmax в nn.CrossEntropyLoss и вместо этого использовать nn.Softmax() на моем выходном слое самой нейронной сети?

Мотивация : я использую пакет shap для анализафункции влияют впоследствии, где я могу только кормить мою обученную модель в качестве входных данных.Однако результаты не имеют никакого смысла, потому что я смотрю на несвязанные значения, а не на вероятности.

Пример : Вместо -69,36 в качестве выходного значения для одного класса моей модели я хочу что-то между 0 и 1, суммируя до 1 для всех классов.Поскольку я не могу изменить его впоследствии, результаты должны быть такими же уже во время обучения.

enter image description here

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

Документация nn.CrossEntropyLoss говорит,

Этот критерий объединяет nn.LogSoftmax () и nn.NLLLoss () в одном классе.

Я предлагаю вам использовать CrossEntropyLoss в качестве критерия потерь.Однако вы можете преобразовать выходные данные вашей модели в значения вероятности с помощью функции softmax .

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

Но если вы все еще хотитедля использования Softmax() в вашей сети, тогда вы можете использовать NLLLoss() в качестве критерия потерь, применять только log () до подачи вывода модели в функцию критерия.Аналогично, если вы используете LogSoftmax вместо этого в своей сети, вы можете применить exp () для получения значений вероятности.

Обновление :

Чтобы использовать log() на выходе Softmax, выполните:

torch.log(prob_scores + 1e-20)

Добавляя очень маленькое число (1e-20) к prob_scores, мы можем избежать проблемы log(0).

3 голосов
/ 26 сентября 2019

Вы можете использовать nn.NLLLoss().nn.CrossEntropyLoss вычисляет log softmax входных баллов и вычисляет отрицательную логарифмическую потерю правдоподобия.Если у вас уже есть вероятность входа в систему, вы можете просто использовать nn.NLLLoss().

Здесь - пример из документации PyTorchs

m = nn.LogSoftmax(dim=1)
loss = nn.NLLLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.tensor([1, 0, 4])
output = loss(m(input), target)
...