Machine learning 将optim.step()与Pytorch';s数据加载器

Machine learning 将optim.step()与Pytorch';s数据加载器,machine-learning,deep-learning,pytorch,gradient-descent,Machine Learning,Deep Learning,Pytorch,Gradient Descent,学习周期通常包括: optim.zero\u grad() 损失(m,op).backward() optim.step() 但是,当数据不适合图形卡时,循环应该是什么 第一种选择: 用于数据加载器中的ip、op(TensorDataset(输入、输出), 批次大小=int(1e4),引脚内存=True): m=型号(ip.to(dev)) op=op.to(dev) 优化零度梯度() 损失(m,op).backward() optim.step() 第二种选择: optim.zero\u

学习周期通常包括:

optim.zero\u grad()
损失(m,op).backward()
optim.step()
但是,当数据不适合图形卡时,循环应该是什么

第一种选择:

用于数据加载器中的ip、op(TensorDataset(输入、输出),
批次大小=int(1e4),引脚内存=True):
m=型号(ip.to(dev))
op=op.to(dev)
优化零度梯度()
损失(m,op).backward()
optim.step()
第二种选择:

optim.zero\u grad()
对于ip,数据加载器中的op(TensorDataset(输入、输出),
批次大小=int(1e4),引脚内存=True):
m=型号(ip.to(dev))
op=op.to(dev)
损失(m,op).backward()
optim.step()
第三种选择:
调用backward()后累积梯度。

第一个选项是正确的,对应于批量梯度下降


第二个选项不起作用,因为每个步骤都会覆盖
m
op
,因此优化器步骤将只对应于基于最终批次的优化。

第一个选项是正确的,并且对应于批次梯度下降


第二个选项将不起作用,因为每个步骤都会覆盖
m
op
,因此优化器步骤将只对应于基于最终批次的优化。

使用以下步骤训练模型的正确方法:

  • 实例化一个模型,并随机初始化其权重。这只做一次
  • 实例化数据集和数据加载器,定义适当的批大小
  • 逐批迭代所有示例。每次迭代时
    3.a仅使用一批而不是整个集合(也称为“向前传递”)计算损失的随机估计值
    3.b计算模型参数的损耗梯度w.r.t(也称为“反向传递”)
    3.c根据当前梯度更新权重
  • 代码应该是这样的

    model=MyModel(…)#实例化一个模型一次
    dl=数据加载器(TensorDataset(输入、输出),批处理大小=int(1e4),引脚内存=True)
    对于范围内的ei(num_历元):
    对于ip,dl中的op:
    优化零度梯度()
    预测=模型(ip.to(dev))#向前传球
    损耗=标准(预测,op.to(dev))#估计电流损耗
    loss.backward()#向后传递-传播渐变
    optim.step()#根据当前批次更新权重
    

    请注意,在培训过程中,您会在整个培训集中迭代多次。每个这样的迭代通常被称为“历元”。

    使用以下步骤训练模型的正确方法:

  • 实例化一个模型,并随机初始化其权重。这只做一次
  • 实例化数据集和数据加载器,定义适当的批大小
  • 逐批迭代所有示例。每次迭代时
    3.a仅使用一批而不是整个集合(也称为“向前传递”)计算损失的随机估计值
    3.b计算模型参数的损耗梯度w.r.t(也称为“反向传递”)
    3.c根据当前梯度更新权重
  • 代码应该是这样的

    model=MyModel(…)#实例化一个模型一次
    dl=数据加载器(TensorDataset(输入、输出),批处理大小=int(1e4),引脚内存=True)
    对于范围内的ei(num_历元):
    对于ip,dl中的op:
    优化零度梯度()
    预测=模型(ip.to(dev))#向前传球
    损耗=标准(预测,op.to(dev))#估计电流损耗
    loss.backward()#向后传递-传播渐变
    optim.step()#根据当前批次更新权重
    

    请注意,在培训过程中,您会在整个培训集中迭代多次。每次这样的迭代通常被称为“历元”。

    >backward()-此函数在叶子中累积渐变-在调用它之前,您可能需要将它们归零。“累计梯度”==第二个选项?在每一步,通过图形累计梯度。只需在每一步执行向后传递,而不是存储整个数据集的渐变信息,图形卡上所需的内存就会少得多。>backward()-此函数将渐变累积到叶子中-调用它之前,可能需要将它们归零。“累计梯度”==第二个选项?在每一步,通过图形累计梯度。只需在每一步执行一次后退操作,而不是存储整个数据集的渐变信息,图形卡上所需的内存就会少得多。