我正在使用这个模块研究神经网络:https://github.com/qassemoquab/stnbhwd/blob/master/AffineGridGeneratorBHWD.lua
nn.Jacobian.testJacobian很大,当我运行模块:cuda()时带有CudaTensor输入,但不是当我运行它时:double()使用相同的DoubleTensor输入
前进为:double()运行和a:cuda()运行非常接近。
:对于a:double()运行和a:cuda()运行的向后是非常不同的,所以问题出在updateGradInput方法的某个地方,我认为:
function AGG:updateGradInput(_transformMatrix, _gradGrid)
local transformMatrix, gradGrid
if _transformMatrix:nDimension()==2 then
transformMatrix = addOuterDim(_transformMatrix)
gradGrid = addOuterDim(_gradGrid)
else
transformMatrix = _transformMatrix
gradGrid = _gradGrid
end
local batchsize = transformMatrix:size(1)
local flattenedGradGrid = gradGrid:view(batchsize, self.width*self.height, 2)
local flattenedBatchGrid = self.batchGrid:view(batchsize, self.width*self.height, 3)
self.gradInput:resizeAs(transformMatrix):zero()
self.gradInput:bmm(flattenedGradGrid:transpose(2,3), flattenedBatchGrid)
if _transformMatrix:nDimension()==2 then
self.gradInput = self.gradInput:select(1,1)
end
return self.gradInput
end
bmm方法是我唯一不熟悉的方法,所以我测试了它,它给出了类似的结果:double()和:cuda()。
有人有类似问题的经验吗?在此期间我会继续尝试追查问题......
修改 为了说明差异的程度:
th> input = torch.randn(5,2,3)
th> cuda_input = torch.CudaTensor(5,2,3):copy(input)
th> module = nn.AffineGridGeneratorBHWD(50,50)
th> nn.Jacobian.testJacobian(module:double(), input)
5.9742433222709e-10
th> nn.Jacobian.testJacobian(module:cuda(), cuda_input)
0.31908118724823
我可能错误地认为updateGradInput方法中存在的问题....仍在探讨。
答案 0 :(得分:1)
这是预期的(并没有错误或错误)。雅可比测试需要足够高的精度和Float preicison(CudaTensor)不能给你。