美文网首页
pytorch梯度累加

pytorch梯度累加

作者: vieo | 来源:发表于2020-05-14 13:51 被阅读0次

    pytorch梯度累加

    通常的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()
    
    

    实现梯度累加

    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.1 loss regularization
        loss = loss/accumulation_steps
        # 2.2 back propagation
        loss.backward()
    
        # 3. update parameters of net
        if((i+1)%accumulation_steps)==0:
            # optimizer the net
            optimizer.step()        # update parameters of net
            optimizer.zero_grad()   # reset gradient
    
    

    1、获取loss:输入图像和标签,通过infer计算得到预测值,计算损失函数;
    2、loss.backward() 反向传播,计算当前梯度;
    3、多次循环步骤1-2,不清空梯度,使梯度累加在已有梯度上;
    4、梯度累加了一定次数后,先 optimizer.step() 根据累计的梯度更新网络参数,然后 optimizer.zero_grad() 清空过往梯度,为下一波梯度累加做准备;
    总结来说:梯度累加就是,每次获取1个batch的数据,计算1次梯度,梯度不清空,不断累加,累加一定次数后,根据累加的梯度更新网络参数,然后清空梯度,进行下一次循环。

    一定条件下,batchsize越大训练效果越好,梯度累加则实现了batchsize的变相扩大,如果 accumulation_steps 为8,则batchsize '变相' 扩大了8倍,是我们这种乞丐实验室解决显存受限的一个不错的trick,使用时需要注意,学习率也要适当放大。

    更多内容:
    pytorch梯度累加

    相关文章

      网友评论

          本文标题:pytorch梯度累加

          本文链接:https://www.haomeiwen.com/subject/abdtohtx.html