动手学深度学习-2.5-自动微分


  • 一个是向量另外一个是标量,求导之后还是向量;
    一个是向量硬外一个是向量,求导之后变为矩阵。


BP算法


由此可见反向很耗费资源,因为需要储存中间结果


import torch

x = torch.arange(4.0)
x

→ tensor([0., 1., 2., 3.])


//在我们计算 y 关于 x 的梯度之前,我们需要一个地方来存储梯度。 
重要的是,我们不会在每次对一个参数求导时都分配新的内存。 
因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽。

x.requires_grad_(True)  
# 等价于x=torch.arange(4.0,requires_grad=True)
# require_grad_()方法的主要使用场景是告诉自动梯度机制开始记录追踪这个张量tensor的操作.
  如果张量tensor的属性requires_grad=False(因为这个张量是从DataLoader中获得到的,或者这个张量需要 
  预处理或初始化),该张量执行tensor.requires_grad_()方法将会让自动梯度autograd开始跟踪并记录这个 
  张量上的运算操作.

x.grad
  •  x.requires_grad_(True)   # 等价于x=torch.arange(4.0,requires_grad=True)
    是因为担心更新相同的参数会重新分配内存。
    所以这段代码的本质就是告诉电脑需要一个地方来储存梯度
  • y = 2 * torch.dot(x, x)
    y
    →tensor(28., grad_fn=<MulBackward0>) #告诉y是从x计算过来的
    
y.backward() #求导
x.grad #访问导数

→tensor([ 0.,  4.,  8., 12.])

  • 在默认情况下,PyTorch会累积梯度,我们需要清除之前的值
    x.grad.zero_()   #下划线_表示重写内容,相当于把所有的梯度都用0代替
    y = x.sum()
    y.backward()
    x.grad

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值