PyTorch 笔记(18)— torch.optim 优化器的使用

到目前为止,代码中的神经网络权重的参数优化和更新还没有实现自动化,并且目前使用的优化方法都有固定的学习速率,所以优化函数相对简单,如果我们自己实现一些高级的参数优化算法,则优化函数部分的代码会变得较为复杂。

PyTorchtorch.optim 包中提供了非常多的可实现参数自动优化的类,比如 SGDAdaGrad
RMSPropAdam 等,这些类都可以被直接调用,使用起来也非常方便。我们使用自动化的优化函数实现方法对之前的代码进行替换,新的代码如下:

import torch as t

batch_n = 100
input_data = 10000
hidden_layer = 100
output_data = 10

epoch_n = 10000
learning_rate = 1e-4

x = t.randn(batch_n, input_data, requires_grad=False)
y = t.randn(batch_n, output_data, requires_grad=False)

loss_f = t.nn.MSELoss()

models = t.nn.Sequential(
    t.nn.Linear(input_data, hidden_layer),
    t.nn.ReLU(),
    t.nn.Linear(hidden_layer, output_data)
    )

optimzer = t.optim.Adam(models.parameters(), lr=learning_rate)

这里使用了 torch.optim 包中的 torch.optim.Adam 类作为我们的模型参数的优化函数,在 torch.optim.Adam 类中输入的是被优化的参数和学习速率的初始值,如果没有输入学习速率的初始值,那么默认使用 0.001 这个值。因为我们需要优化的是模型中的全部参数,所以传递给 torch.optim.Adam 类的参数是models.parameters

另外,Adam 优化函数还有一个强大的功能,就是可以对梯度更新使用到的学习速率进行自适应调节,所以最后得到的结果自然会比之前的代码更理想。进行模型训练的代码如下:

for epoch in range(epoch_n):
    y_pred = models(x)
    loss = loss_f(y_pred, y)
    
    print("epoch is {}, loss is {:.4f}".format(epoch, loss))
    
    optimzer.zero_grad()
    loss.backward()
    
    optimzer.step()
    if epoch >= 20:
        break

在以上代码中有几处代码和之前的训练代码不同,这是因为我们引入了优化算法,所以通过直接调用optimzer.zero_grad 来完成对模型参数梯度的归零;并且在以上代码中增加了 optimzer.step ,它的
主要功能是使用计算得到的梯度值对各个节点的参数进行梯度更新。这里只进行 20 次训练并打印每轮训练的loss 值,结果如下:

epoch is 0, loss is 1.1192
epoch is 1, loss is 0.9273
epoch is 2, loss is 0.7781
epoch is 3, loss is 0.6601
epoch is 4, loss is 0.5648
epoch is 5, loss is 0.4866
epoch is 6, loss is 0.4207
epoch is 7, loss is 0.3646
epoch is 8, loss is 0.3167
epoch is 9, loss is 0.2756
epoch is 10, loss is 0.2404
epoch is 11, loss is 0.2102
epoch is 12, loss is 0.1840
epoch is 13, loss is 0.1615
epoch is 14, loss is 0.1419
epoch is 15, loss is 0.1249
epoch is 16, loss is 0.1099
epoch is 17, loss is 0.0966
epoch is 18, loss is 0.0848
epoch is 19, loss is 0.0744
epoch is 20, loss is 0.0652

在看到这个结果后我们会很惊讶,因为使用 torch.optim.Adam 类进行参数优化后仅仅进行了 20 次训练,得到的 loss 值就已经远远低于之前进行 10000 次优化训练的结果。所以,如果对 torch.optim 中的优化算法类使用得当,就更能帮助我们优化好模型中的参数。

对比例子请参考上一篇文章。

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
torch.optim.Adam 和 torch.optim.SGD 是 PyTorch 中两种不同的优化器,它们在优化算法和使用方式上存在一些区别。 1. 优化算法: - Adam(Adaptive Moment Estimation)是一种基于梯度的优化算法,它结合了 AdaGrad 和 RMSProp 的优点。它使用动量和自适应学习率来更新参数,能够更快地收敛,并且对于稀疏梯度和噪声较大的问题有较好的表现。 - SGD(Stochastic Gradient Descent)是一种基本的随机梯度下降算法,每次更新参数时仅使用一个样本或一小批样本的梯度。它通过迭代地更新参数来最小化损失函数,适用于大规模数据集和较简单的模型。 2. 学习率调整: - Adam 使用自适应学习率,每个参数都有自己的学习率,根据梯度的历史信息来自动调整学习率。 - SGD 需要手动设置全局学习率,并且可以通过学习率衰减策略进行调整,如按照固定时间表衰减或根据验证集的性能进行衰减。 3. 参数更新方式: - Adam 通过存储每个参数的历史梯度平方的指数衰减平均来计算自适应学习率,使用动量项来加速参数更新。 - SGD 使用每个参数的梯度和学习率来更新参数,可以选择添加动量项来加速收敛。 选择 Adam 还是 SGD 取决于问题的性质和数据集的规模。在大多数情况下,Adam 通常能够更快地收敛,特别是对于复杂的模型和大规模数据集。然而,在某些情况下,SGD 可能会更好地适应局部最优解,并且具有更低的内存使用量。 需要根据具体问题和实验结果来选择合适的优化器。可以尝试不同的优化器并根据模型性能和训练速度进行比较,以确定最佳选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值