Pytorch实现线性回归

前向传播:

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

 

posted on 2019-07-19 22:38  南华  阅读(870)  评论(0编辑  收藏  举报