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

Posted

技术标签:

【中文标题】在pytorch中使用交叉熵损失时我应该使用softmax作为输出吗?【英文标题】:Should I use softmax as output when using cross entropy loss in pytorch? 【发布时间】:2019-09-04 14:51:07 【问题描述】:

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

我想在两个隐藏层中都使用 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。

【讨论】:

以上是关于在pytorch中使用交叉熵损失时我应该使用softmax作为输出吗?的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch使用交叉熵作为语义分割损失函数遇到的坑

Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解

如何在 PyTorch 中计算自举交叉熵损失?

pytorch 中的交叉熵损失如何工作?

Pytorch - 使用一种热编码和 softmax 的(分类)交叉熵损失

使用 PyTorch 的交叉熵损失函数是不是需要 One-Hot Encoding?