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 中的优化算法类使用得当,就更能帮助我们优化好模型中的参数。

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

你可能感兴趣的:(PyTorch)