在pytorch中使用交叉熵损失时,我应该使用softmax作为输出吗?

问题描述 投票:1回答:1

我有一个问题,即在pytorch中为MNIST数据集的2个隐藏层分类完全连接的深度神经网络。

我想在两个隐藏层中使用tanh作为激活,但最后,我应该使用softmax。

对于损失,我在pytorch中选择nn.CrossEntropyLoss(),(我已经发现)不想将单热编码标签作为真正的标签,而是采用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()

谢谢你的帮助 :)

python pytorch mnist softmax
1个回答
2
投票

正如torch.nn.CrossEntropyLoss() doc中所述:

这个标准将nn.LogSoftmax()nn.NLLLoss()组合在一个单一的类中。

因此,您之前不应使用softmax。

© www.soinside.com 2019 - 2024. All rights reserved.