如何在 Torch 中正确地跨批次累积梯度?
How to correctly accumulate gradients across batches in 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
还值得一提的是,我在比较结果时手动设置了随机种子以确定性,所以差异不是由于网络的随机初始化。
问题是由于采样,samperiter返回图像的顺序不同batch size,所以这两种情况下的batch包含不同的图像,因此累积的梯度不同。
我想累积多个批次的梯度。 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
还值得一提的是,我在比较结果时手动设置了随机种子以确定性,所以差异不是由于网络的随机初始化。
问题是由于采样,samperiter返回图像的顺序不同batch size,所以这两种情况下的batch包含不同的图像,因此累积的梯度不同。