生活随笔
收集整理的這篇文章主要介紹了
反向传播+代码实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
y=wx的反向傳播代碼實現(xiàn)?
import torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]#w是Tensor(張量類型),Tensor中包含data和grad,data和grad也是Tensor。
# grad初始為None,調用l.backward()方法后w.grad為Tensor,
# 故更新w.data時需使用w.grad.data。
# 如果w需要計算梯度,那構建的計算圖中,跟w相關的tensor都默認需要計算梯度。
w=torch.Tensor([1.0])
#True:需要計算梯度
w.requires_grad=Truedef forward(x):return x * w# 構建計算圖
def loss(x,y):y_pred=forward(x)return (y_pred-y)*(y_pred-y)print("訓練之前:",4,forward(4).item())
for epoch in range(100):for x,y in zip(x_data,y_data):l=loss(x,y)#自動將需要梯度的地方計算出來#存儲到w中#l.backward()會把計算圖中所有需要梯度(grad)的地方都會求出來,# 然后把梯度都存在對應的待求的參數(shù)中,最終計算圖被釋放。l.backward()print("grad:",x,y,w.grad.item())#grad是修改后的w權值#data是轉化為標量 不能使用張量計算 會發(fā)生自動類型轉換w.data=w.data-0.01*w.grad.data#要單個所以要釋放,如果是連續(xù)的則不需要清零# w.data.zero_() 錯w.grad.data.zero_()print("進程輪數(shù):",epoch,l.item())
print("訓練之后:",4,forward(4).item())
y=w1x+w2x+b的反向傳播代碼實現(xiàn)?
import torchx_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
#學習率
learn_rate=0.01#True:需要計算梯度
w1=torch.tensor([1.0])
w1.requires_grad=Truew2=torch.tensor([1.0])
w2.requires_grad=Trueb=torch.tensor([1.0])
b.requires_grad=Truedef forward(x):return w1*x+w2*x+bdef loss(x,y):y_test=forward(x)return (y_test-y)*(y_test-y)print("訓練之前:",4,forward(4).item())
for epoch in range(100):for x,y in zip(x_data,y_data):#損失函數(shù)原型l=loss(x,y)l.backward()#pytorch中,.item()方法 是得到一個元素張量里面的元素值print("grad:",x,y,w1.grad.item(),w2.grad.item(),b.grad.item())#orch.autograd包主要功能是完成網(wǎng)絡反向傳播時的鏈式求導#過程大致為:先通過輸入的tensor數(shù)據(jù)類型的變量在神經(jīng)網(wǎng)絡的前向傳播中生成一張計算圖,#然后再根據(jù)這個計算圖和輸出結果準確計算出各個參數(shù)需要更新的梯度,并通過完成反向傳播對參數(shù)進行梯度更新。#在實踐中使用autograd包中的variable類進行封裝,封裝之后計算圖中每一個節(jié)點就是一個variable對象#因此如果用X代表選中的節(jié)點,那么X.data 就是tensor數(shù)據(jù)對象,X.grad就是X的梯度對象,X.grad.data就是X的梯度數(shù)據(jù)值啦w1.data=w1.data-learn_rate*w1.grad.dataw2.data=w2.data-learn_rate*w2.grad.datab.data=b.data-learn_rate*b.grad.dataw1.grad.data.zero_()w2.grad.data.zero_()b.grad.data.zero_()print("輪數(shù):",epoch,l.item())
print("訓練之后:",4,forward(4).item())
總結
以上是生活随笔為你收集整理的反向传播+代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。