您好,登錄后才能下訂單哦!
這篇文章主要講解了“pytorch怎么實現梯度下降和反向傳播”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“pytorch怎么實現梯度下降和反向傳播”吧!
這里說一下我的理解,反向傳播是相對于前向計算的,以公式J(a,b,c)=3(a+bc)為例,前向計算相當于向右計算J(a,b,c)的值,反向傳播相當于反過來通過y求變量a,b,c的導數,如下圖
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 #通過循環,反向傳播,更新參數 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()
優化器(optimizer),可以理解為torch為我們封裝的用來進行更新參數的方法,比如常見的隨機梯度下降(stochastic gradient descent,SGD)
優化器類都是由torch.optim提供的,例如
torch.optim.SGD(參數,學習率)
torch.optim.Adam(參數,學習率)
注意:
參數可以使用model.parameters()來獲取,獲取模型中所有requires_grad=True的參數
優化類的使用方法
①實例化
②所有參數的梯度,將其置為0
③反向傳播計算梯度
④更新參數值
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、優化器 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怎么實現梯度下降和反向傳播”的內容了,經過本文的學習后,相信大家對pytorch怎么實現梯度下降和反向傳播這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。