欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PyTorch中在反向传播前为什么要手动将梯度清零?

程序员文章站 2022-07-12 11:12:42
...

PyTorch中在反向传播前为什么要手动将梯度清零?

 

作者:Pascal
https://www.zhihu.com/question/303070254/answer/573037166
 

这种模式可以让梯度玩出更多花样,比如说梯度累加(gradient accumulation)

传统的训练函数,一个batch是这么训练的:

for i,(images,target) in enumerate(train_loader):
    # 1. input output
    images = images.cuda(non_blocking=True)
    target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True)
    outputs = model(images)
    loss = criterion(outputs,target)

    # 2. backward
    optimizer.zero_grad()   # reset gradient
    loss.backward()
    optimizer.step()
  1. 获取loss:输入图像和标签,通过infer计算得到预测值,计算损失函数;

  2. optimizer.zero_grad() 清空过往梯度;

  3. loss.backward() 反向传播,计算当前梯度;

  4. optimizer.step() 根据梯度更新网络参数

简单的说就是进来一个batch的数据,计算一次梯度,更新一次网络

使用梯度