如何在火炬的批次中正确积累渐变?

时间:2016-06-01 21:41:00

标签: neural-network deep-learning torch

我希望在几个批次中累积渐变。使用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

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

1 个答案:

答案 0 :(得分:0)

问题是由于采样,采样器以不同的顺序返回不同批次尺寸的图像,因此这两种情况下的批次包含不同的图像,因此累积的梯度不同。