【问题标题】:How to correctly accumulate gradients across batches in Torch?如何在 Torch 中正确地跨批次累积梯度?
【发布时间】:2016-06-02 22:19:17
【问题描述】:

我想在多个批次中累积渐变。使用 iter_size 进行训练是 2,batch_size 16 应该与我设置 iter_size = 1 和 batch_size = 32 相同。我怀疑我的代码中遗漏了一些东西,因为两种情况的 gradParams 都不相同。如果您能帮助我找出问题所在,我将不胜感激。这是我的代码:

   local params, gradParams = net:getParameters()
   local iter_size = 2
   local batch_size = 16
   local iter = 0
   net:zeroGradParameters()
   for i, input, target in trainset:sampleiter(batch_size) do
      iter = iter + 1
      -- forward
      local input = input:cuda()
      local target = target:cuda()
      local output = net:forward(input)
      local loss = criterion:forward(output, target)
      local gradOutput = criterion:backward(output, target)
      local gradInput = net:backward(input, gradOutput)
      -- update
      if iter == iter_size then
          gradParams:mul(1.0/iter_size)
          net:updateGradParameters(0.9)
          net:updateParameters(0.01)
          iter = 0
          net:zeroGradParameters()
      end
   end

还值得一提的是,我在比较结果时手动设置了随机种子来确定性,因此差异不是由于网络的随机初始化造成的。

【问题讨论】:

    标签: neural-network deep-learning torch


    【解决方案1】:

    问题是由于采样,对于不同的batch size,sampleiter返回的图像顺序不同,所以这两种情况下的batch包含不同的图像,因此累积的梯度不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2018-03-28
      • 2021-01-04
      • 2023-03-27
      • 2020-12-28
      • 1970-01-01
      • 2020-09-15
      相关资源
      最近更新 更多