提问者:小点点

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


我在pytorch中对具有2个隐藏层的MNIST数据集的全连接深度神经网络进行分类时遇到了问题。

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

对于损失,我选择PyTOrch中的nn. CrossEntropyLoss(),它(正如我所发现的)不想将one-Hot编码标签作为真正的标签,而是采用类的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()

共1个答案

匿名用户

torch. nn.CrossEntropyLoss()文档中所述:

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

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