torch训练一些小细节

一、模板:

经典训练模板:

for i, (image, label) in enumerate(train_loader):
    # 1. input output
    pred = model(image)
    loss = criterion(pred, label)

    # 2. backward
    optimizer.zero_grad()   # reset gradient
    loss.backward()
    optimizer.step()

获取 loss:输入图像和标签,通过infer计算得到预测值,计算损失函数;
optimizer.zero_grad() 清空过往梯度;
loss.backward() 反向传播,计算当前梯度;
optimizer.step() 根据梯度更新网络参数

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

加入梯度累加的训练模板:

for i,(image, label) in enumerate(train_loader):
    # 1. input output
    pred = model(image)
    loss = criterion(pred, label)

    # 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

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

总结来说:梯度累加就是,每次获取1个batch的数据,计算1次梯度,梯度不清空,不断累加,累加一定次数后,根据累加的梯度更新网络参数,然后清空梯度,进行下一次循环。一定条件下,batchsize 越大训练效果越好,梯度累加则实现了 batchsize 的变相扩大,如果accumulation_steps 为 8,则batchsize ‘变相’ 扩大了8倍,使用时需要注意,学习率也要适当放大。

二、加入梯度剪切

torch.nn.utils.clip_grad_norm(parameters, max_norm, norm_type=2)
arameters (Iterable[Variable]) – 一个基于变量的迭代器,会进行归一化
max_norm (float or int) – 梯度的最大范数
norm_type(float or int) – 规定范数的类型,默认为L2
Returns:参数的总体范数(作为单个向量来看)

三、多卡训练

DistributedDataParallel训练时要加参数:

python -m torch.distributed.launch train.py

否则会报错:Error initializing torch.distributed using env:// rendezvous: environment variable RANK expected, but not set

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值