當前位置:
首頁 >
反向传播+代码实现
發布時間:2024/7/5
38
豆豆
y=wx的反向傳播代碼實現?
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)的地方都會求出來,# 然后把梯度都存在對應的待求的參數中,最終計算圖被釋放。l.backward()print("grad:",x,y,w.grad.item())#grad是修改后的w權值#data是轉化為標量 不能使用張量計算 會發生自動類型轉換w.data=w.data-0.01*w.grad.data#要單個所以要釋放,如果是連續的則不需要清零# w.data.zero_() 錯w.grad.data.zero_()print("進程輪數:",epoch,l.item()) print("訓練之后:",4,forward(4).item())y=w1x+w2x+b的反向傳播代碼實現?
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):#損失函數原型l=loss(x,y)l.backward()#pytorch中,.item()方法 是得到一個元素張量里面的元素值print("grad:",x,y,w1.grad.item(),w2.grad.item(),b.grad.item())#orch.autograd包主要功能是完成網絡反向傳播時的鏈式求導#過程大致為:先通過輸入的tensor數據類型的變量在神經網絡的前向傳播中生成一張計算圖,#然后再根據這個計算圖和輸出結果準確計算出各個參數需要更新的梯度,并通過完成反向傳播對參數進行梯度更新。#在實踐中使用autograd包中的variable類進行封裝,封裝之后計算圖中每一個節點就是一個variable對象#因此如果用X代表選中的節點,那么X.data 就是tensor數據對象,X.grad就是X的梯度對象,X.grad.data就是X的梯度數據值啦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("輪數:",epoch,l.item()) print("訓練之后:",4,forward(4).item())總結
- 上一篇: 群晖ffmpeg_群晖Video sta
- 下一篇: 报错 ValueError: too m