Должен ли я использовать softmax в качестве вывода при использовании кросс-энтропийной потери в pytorch?

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

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

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

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

import torch
from torch import 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()

person pikachu    schedule 14.04.2019    source источник


Ответы (1)


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

Этот критерий сочетает в себе nn.LogSoftmax() и _ 3_ в одном классе.

Таким образом, вам не следует использовать softmax раньше.

person Berriel    schedule 14.04.2019