程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

python面试题(22)

字典(0)

标签  

python面试(18)

字典(0)

日期归档  

2023-05(3)

Pytorch 梯度计算

发布于2019-08-20 12:31     阅读(1206)     评论(0)     点赞(21)     收藏(1)


使用Pytorch计算梯度或者求导,有两种方法:

以均方误差为例,模型pred = w*x:

  1. import torch
  2. from torch.nn import functional as F
  3. # pred = x*w
  4. x = torch.ones(1)
  5. # dim=1,长度为1,值初始化为2
  6. w = torch.full([1], 2)
  7. # 实际输出
  8. y = torch.ones(1)
  9. mse = F.mse_loss(x * w, y)
  10. print(mse)

 输出结果:

tensor(1.)

1. 使用torch.autograd.grad() 

  1. # MSE对参数w自动求导
  2. # 第一个参数是损失函数,第二个参数是该损失函数要求梯度的参数列表
  3. # 返回结果grad_val是梯度列表,列表记录了每一个Tensor的grade信息
  4. grad_val = torch.autograd.grad(mse, [w])

发生错误:

RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

 

这个错误是因为在前面定义w时,没有设定其需要梯度信息,所以PyTorch在建图的时候就没有设置它具有梯度信息。

可以在定义完w后将其设置为需要梯度信息:

w.requires_grad_()

 也可以在建立Tensor时用参数指明它需要梯度信息:

w = torch.full([1], 2, requires_grad=True)

将得到的求导结果grad_val 输出,可以得到: 

(tensor([2.]),)

 

2. 使用loss.backward()

使用loss对象的backward()方法,让PyTorch做反向的传播,将需要grad信息的Tensor求出这个loss关于它的导数出来。

  1. import torch
  2. from torch.nn import functional as FF
  3. # pred = x*w
  4. x = torch.ones(1)
  5. # dim=1,长度为1,值初始化为2
  6. w = torch.full([1], 2, requires_grad=True)
  7. # 实际输出
  8. y = torch.ones(1)
  9. mse = FF.mse_loss(x * w, y)
  10. # 图的反向传播, 自动求出该图上所有的需要计算梯度的参数相对于这个MSE的梯度
  11. # 计算出的梯度不会跟第一种方法一样返回一个梯度列表(列表记录了每一个Tensor的grade信息),而是将梯度信息附加到每个Tensor的成员变量grad中
  12. mse.backward()
  13. print(w.grad)

输出结果:

(tensor([2.]),)

 注意,这个API会将之前的梯度信息覆盖掉,所以多次调用这个loss对象的.backward()方法时会报错,如果要再次调用以生成新的梯度信息,要给它一个参数:

mse.backward(retain_graph=True)

 

 



所属网站分类: 技术文章 > 博客

作者:外星人入侵

链接:https://www.pythonheidong.com/blog/article/49258/3221bd42ea53344bd1e8/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)