在Pytorch的DataLoader中使用optim.step()

时间:2019-07-30 21:36:06

标签: machine-learning deep-learning pytorch gradient-descent

通常,学习周期包含:

optim.zero_grad()
loss(m, op).backward()
optim.step()

但是数据不适合显示卡的周期应该是什么?

第一个选项:

for ip, op in DataLoader(TensorDataset(inputs, outputs),
                          batch_size=int(1e4), pin_memory=True):
    m = model(ip.to(dev))
    op = op.to(dev)
    optim.zero_grad()
    loss(m, op).backward()
    optim.step()

第二个选项:

optim.zero_grad()
for ip, op in DataLoader(TensorDataset(inputs, outputs),
                          batch_size=int(1e4), pin_memory=True):
    m = model(ip.to(dev))
    op = op.to(dev)
    loss(m, op).backward()
optim.step()

第三个选项: 调用向后()后累积渐变。

2 个答案:

答案 0 :(得分:0)

第一个选项是正确的,并且与批量梯度下降相对应。

第二个选项将不起作用,因为mop在每一步都将被覆盖,因此您的优化器步骤将仅对应于基于最终批次的优化。

答案 1 :(得分:0)

使用Stochastic Gradient Descent (SGD)训练模型的正确方法是遵循以下步骤:

  1. 实例化一个模型,并随机初始化其权重。只能完成一次。
  2. 实例化数据集和数据加载器,定义适当的batch_size
  3. 逐个批处理所有示例。每次迭代
    3.a仅使用一批而不是整个批次(也称为“向前通过”)来计算损失的随机估计值
    3.b计算不包含模型参数(也称为“向后传递”)的损耗的梯度
    3.c根据当前梯度更新权重

这是代码的外观

model = MyModel(...)  # instantiate a model once
dl = DataLoader(TensorDataset(inputs, outputs), batch_size=int(1e4), pin_memory=True)
for ei in range(num_epochs):
  for ip, op in dl:
    optim.zero_grad()
    predict = model(ip.to(dev))  # forward pass
    loss = criterion(predict, op.to(dev)) # estimate current loss
    loss.backward()  # backward pass - propagate gradients
    optim.step()  # update the weights based on current batch

请注意,在训练过程中,您会在整个训练集中进行多次迭代。每个这样的迭代通常称为“时代”。