PyTorch 笔记(18)— torch.optim 优化器的使用
到目前為止,代碼中的神經網絡權重的參數優化和更新還沒有實現自動化,并且目前使用的優化方法都有固定的學習速率,所以優化函數相對簡單,如果我們自己實現一些高級的參數優化算法,則優化函數部分的代碼會變得較為復雜。
在 PyTorch 的 torch.optim 包中提供了非常多的可實現參數自動優化的類,比如 SGD 、AdaGrad 、
RMSProp 、Adam 等,這些類都可以被直接調用,使用起來也非常方便。我們使用自動化的優化函數實現方法對之前的代碼進行替換,新的代碼如下:
import torch as tbatch_n = 100
input_data = 10000
hidden_layer = 100
output_data = 10epoch_n = 10000
learning_rate = 1e-4x = 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 笔记(18)— torch.optim 优化器的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “慵坐但含情”上一句是什么
- 下一篇: 什么非所宜下一句是什么啊?