溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

pytorch怎么實現(xiàn)梯度下降和反向傳播

發(fā)布時間:2023-05-05 15:24:39 來源:億速云 閱讀:132 作者:iii 欄目:開發(fā)技術

這篇文章主要講解了“pytorch怎么實現(xiàn)梯度下降和反向傳播”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“pytorch怎么實現(xiàn)梯度下降和反向傳播”吧!

反向傳播

這里說一下我的理解,反向傳播是相對于前向計算的,以公式J(a,b,c)=3(a+bc)為例,前向計算相當于向右計算J(a,b,c)的值,反向傳播相當于反過來通過y求變量a,b,c的導數,如下圖

pytorch怎么實現(xiàn)梯度下降和反向傳播

手動完成線性回歸

import torch
import numpy as np
from matplotlib import pyplot as plt
"""
假設模型為y=w*x+b
我們給出的訓練數據是通過y=3*x+1,得到的,其中w=3,b=1
通過訓練y=w*x+b觀察訓練結果是否接近于w=3,b=1
"""
# 設置學習率
learning_rate=0.01
#準備數據
x=torch.rand(500,1) #隨機生成500個x作為訓練數據
y_true=x*3+1 #根據模型得到x對應的y的實際值
#初始化參數
w=torch.rand([1,1],requires_grad=True) #初始化w
b=torch.rand(1,requires_grad=True,dtype=torch.float32) #初始化b
#通過循環(huán),反向傳播,更新參數
for i in range(2000):
    # 通過模型計算y_predict
    y_predict=torch.matmul(x,w)+b #根據模型得到預測值
    #計算loss
    loss=(y_true-y_predict).pow(2).mean()
    #防止梯度累加,每次計算梯度前都將其置為0
    if w.grad is not None:
        w.grad.data.zero_()
    if b.grad is not None:
        b.grad.data.zero_()
    #通過反向傳播,記錄梯度
    loss.backward()
    #更新參數
    w.data=w.data-learning_rate*w.grad
    b.data=b.data-learning_rate*b.grad
    # 這里打印部分值看一看變化
    if i%50==0:
        print("w,b,loss:",w.item(),b.item(),loss.item())
#設置圖像的大小
plt.figure(figsize=(20,8))
#將真實值用散點表示出來
plt.scatter(x.numpy().reshape(-1),y_true.numpy().reshape(-1))
#將預測值用直線表示出來
y_predict=torch.matmul(x,w)+b
plt.plot(x.numpy().reshape(-1),y_predict.detach().numpy().reshape(-1),c="r")
#顯示圖像
plt.show()

pytorch API完成線性回歸

優(yōu)化器類

優(yōu)化器(optimizer),可以理解為torch為我們封裝的用來進行更新參數的方法,比如常見的隨機梯度下降(stochastic gradient descent,SGD)

優(yōu)化器類都是由torch.optim提供的,例如

  • torch.optim.SGD(參數,學習率)

  • torch.optim.Adam(參數,學習率)

注意:

  • 參數可以使用model.parameters()來獲取,獲取模型中所有requires_grad=True的參數

  • 優(yōu)化類的使用方法

①實例化

②所有參數的梯度,將其置為0

③反向傳播計算梯度

④更新參數值

實現(xiàn)

import torch
from torch import nn
from torch import optim
from matplotlib import pyplot as plt
import numpy as np
# 1.定義數據,給出x
x=torch.rand(50,1)
# 假定模型為y=w*x+b,根據模型給出真實值y=x*3+0.8
y=x*3+0.8
# print(x)
#2.定義模型
class Lr(torch.nn.Module):
    def __init__(self):
        super(Lr, self).__init__()
        self.linear = torch.nn.Linear(1, 1)
    def forward(self, x):
        out = self.linear(x)
        return out
# 3.實例化模型、loss、優(yōu)化器
model=Lr()
criterion=nn.MSELoss()
# print(list(model.parameters()))
optimizer=optim.SGD(model.parameters(),lr=1e-3)
# 4.訓練模型
for i in range(30000):
    out=model(x) #獲取預測值
    loss=criterion(y,out) #計算損失
    optimizer.zero_grad() #梯度歸零
    loss.backward() #計算梯度
    optimizer.step() #更新梯度
    if (i+1)%100 ==0:
        print('Epoch[{}/{}],loss:{:.6f}'.format(i,30000,loss.data))
# 5.模型評估
model.eval() #設置模型為評估模式,即預測模式
predict=model(x)
predict=predict.data.numpy()
plt.scatter(x.data.numpy(),y.data.numpy(),c="r")
plt.plot(x.data.numpy(),predict)
plt.show()

感謝各位的閱讀,以上就是“pytorch怎么實現(xiàn)梯度下降和反向傳播”的內容了,經過本文的學習后,相信大家對pytorch怎么實現(xiàn)梯度下降和反向傳播這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI