python - 在pytorch中使用交叉熵损失时我应该使用softmax作为输出吗?
问题描述
我在对pytorch 中的 MNIST 数据集使用 2 个隐藏层的完全连接的深度神经网络进行分类时遇到问题。
我想在两个隐藏层中都使用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()
解决方案
推荐阅读
- mysql - 创建具有两个以上外键的联结表是反模式吗?
- php - 由于添加了地址结尾,从 facebook 重定向导致错误
- javascript - 如何使用 Typescript 索引匿名对象
- node.js - npx
在命令行上运行,但不在 package.json 脚本部分中 - visual-studio - Visual Studio Task Runner Explorer - ReferenceError: primordials is not defined
- sql - 使用带有存在/不存在的 case 语句进行更新
- c++ - 我应该声明所有不抛出 noexcept 的成员/函数吗?
- java - 返回 StringIndexOutOfBoundException 的字符串
- r - R中的官员包
- react-native - 如何在本机反应中执行后台任务