前向传播:
tensor中的require_grad参数:
设置为True时,会记录该tensor的计算过程;
tensor中的grad_fn属性:
用来保存计算过程;
tensor设置requires_grad=True后不保留计算过程可使用:
with torch.no_grad():
pass
反向传播:
loss.backward() #适用于loss(损失值)为一个常数时,大多数时候损失值都为一个标量(常数)
导数保存在tensor.grad中(tensor为参数矩阵)
若设置loss.backward(retain_graph=True),可进行多次backward操作,tensor.grad会累加
只是根据损失值去计算了tensor的梯度,并未更新参数
tensor.data:
在tensor的requires_grad=False(默认)情况下,tensor.data与tensor等价;
在tensor的requires_grad=True时,tensor.data值获取tensor中的数据;
tensor.numpy():
requires_grad=True时,tensor.numpy()无法直接转换,需使用tensor.detach().numpy()(等同于tensor.data.numpy())
1 import torch 2 x = torch.randn([500,1]) 3 y = 3*x+1 4 5 #随机初始化w,b 6 w = torch.rand([],requires_grad=True) 7 b = torch.rand([],requires_grad=True) 8 9 for i in range(500): 10 #去除每次计算出来的梯度值,防止梯度累加 11 for k in [w,b]: 12 if k.grad is not None: 13 k.grad.zero_() 14 y_mod = x*w+b 15 #损失函数/损失值 16 loss = (y-y_mod).pow(2).mean() 17 #反向传播 18 loss.backward() 19 #梯度下降/参数更新 20 w.data = w.data-0.1*w.grad 21 b.data = b.data-0.1*b.grad 22 if i%50 == 0: 23 print(w.grad.item(),end="\t") 24 print(b.grad.item(),end="\t") 25 print(str(w.item())+"\t"+str(b.item()))