#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)

 

posted @ 2021-09-28 22:19  tanyayangyang  阅读(64)  评论(0)    收藏  举报