python - 模型使用 SGD 进行学习,但不使用 Adam

标签 python machine-learning pytorch adam sgd

我正在查看一个基本的 PyTorch MNIST 示例 here并注意到当我将优化器从 SGD 更改为 Adam 时,模型没有收敛。具体来说,我将第 106 行更改为

optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)

optimizer = optim.Adam(model.parameters(), lr=args.lr)

我认为这不会对模型产生影响。使用 SGD,损失在大约四分之一个纪元后迅速降至较低值。然而对于 Adam,即使在 10 个 epoch 之后,损失也根本没有下降。我很好奇为什么会发生这种情况;在我看来,它们应该具有几乎相同的性能。

我在Win10/Py3.6/PyTorch1.01/CUDA9上运行了这个

为了节省您一点点代码挖掘的时间,这里是超参数:

  • lr=0.01
  • 动量=0.5
  • batch_size=64

最佳答案

Adam 以其开箱即用的默认参数而闻名,在几乎所有框架中,学习率都为 0.001(请参阅 KerasPyTorch 中的默认值) ,和 Tensorflow ),这确实是 Adam paper 中建议的值.

所以,我建议更改为

optimizer = optim.Adam(model.parameters(), lr=0.001)

或者简单地

optimizer = optim.Adam(model.parameters())

为了将 lr 保留为默认值(尽管我会说我很惊讶,因为 MNIST 如今以实际处理您可能放入的任何内容而闻名)。

关于python - 模型使用 SGD 进行学习,但不使用 Adam,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55770783/

相关文章:

python - Python原始套接字更改符号

python - TensorFlow:如果我在图形中处理二次计算,是否会消耗更多内存?

python - 为什么这个线性分类器算法是错误的?

python - 在 Tensorflow 对象检测 API 中裁剪图像并显示

keras - 相当于 pyTorch 中的 embeddings_regularizer

pytorch - 1x1 卷积作为 Pytorch 中的分类层

python - B船游戏跟进: How to have the computer randomnize their ships?

python - 将整数转换为负数

python - 同时处理 TCP 和 UDP 的 Twisted 协议(protocol)

python - pytorch cnn步幅错误