#pt#课堂记录_04反向传播
1)这里的h和x都是向量,h是六维的向量(六行一列),x是五维的向量(五行一列)
权重,第一部分有30个(5*6),第二部分42个,第三部分49个。
2)以下为计算式的计算图绿色为计算模块 mm为乘,add为加
3)链式求导的过程 反向传播,先要知道损失loss对z的偏导,我们要知道损失对x的导数和损失对w权重的导数


先走前馈的过程,再走反向的过程这样我们就能得到梯度,同时我们也要保存loss,我们需要loss进行可视化或者生成日志
4)所有数值都保存在tensor里面,不论多少维

在计算时,我们用l.item把l取出来,这样计算图不会太大。
下一步是对权重梯度清零。
6)以下是代码
1 import numpy as np 2 import torch 3 4 x_data = [1,2,3] 5 y_data = [2,4,6] 6 7 w = torch.Tensor([1.0]) 8 w.requires_grad =True #它需要计算梯度 9 10 def forward(x): 11 return w*x #把x自动类型转换为tensor 12 13 def loss(x,y): 14 y_pred = forward(x) 15 return (y_pred - y)**2 16 17 print('predict(before)',4,forward(4).item()) ##item是把数字拿出来直接变成标量 18 19 for epoch in range(100): 20 for x,y in zip(x_data,y_data): 21 l = loss(x,y) 22 l.backward() #会自动把刚刚的链路上需要求导的都求出来, 23 #这里变量是w,所以会把梯度存在w里 24 print('\t grad :',x,y,w.grad.item()) 25 w.data=w.data -0.01 *w.grad.data #取张量的data不会产生计算图 26 #权重更新要用data 27 28 w.grad.data.zero_() #权重里的梯度的数据清零 29 print('progress:',epoch,l.item()) 30 31 print('predict(after)',4,forward(4).item)

浙公网安备 33010602011771号