Должен ли я использовать softmax в качестве выхода при использовании кросс-энтропийной потери в pytorch? - PullRequest
1 голос
/ 14 апреля 2019

У меня проблема с классификацией полностью подключенной глубокой нейронной сети с 2 скрытыми слоями для набора данных MNIST в pytorch .

Я хочу использовать tanh в качестве активаций в обоих скрытых слоях, но в конце я должен использовать softmax .

Для потери я выбираю nn.CrossEntropyLoss() в pytorch, который (как я выяснил) не хочет принимать метки с горячим кодированием в качестве истинных меток, но вместо этого принимает LongTensor классов.

Моя модель nn.Sequential(), и когда я в итоге использую softmax, это дает мне худшие результаты с точки зрения точности данных тестирования.почему?

import torch
import torch.nn as nn

inputs, n_hidden0, n_hidden1, out = 784, 128, 64, 10
n_epochs = 500
model = nn.Sequential(nn.Linear(inputs, n_hidden0, bias = True), 
                 nn.Tanh(), 
                 nn.Linear(n_hidden0, n_hidden1, bias = True),
                 nn.Tanh(),
                 nn.Linear(n_hidden1, out, bias = True),
                 nn.Softmax()  # SHOULD THIS BE THERE?
                 )

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum = 0.5)

for epoch in range(n_epochs):
    y_pred = model(X_train)
    loss = criterion(y_pred, Y_train)
    print('epoch: ', epoch+1,' loss: ', loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

Спасибо за любую помощь:)

1 Ответ

2 голосов
/ 14 апреля 2019

Как указано в torch.nn.CrossEntropyLoss() документ:

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

Следовательно, вы должны не использовать softmax раньше.

...