火炬testJacobian与DoubleTensor合作,而不是与CudaTensor合作

时间:2016-04-11 14:57:56

标签: lua neural-network torch

我正在使用这个模块研究神经网络: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方法中存在的问题....仍在探讨。

1 个答案:

答案 0 :(得分:1)

这是预期的(并没有错误或错误)。雅可比测试需要足够高的精度和Float preicison(CudaTensor)不能给你。