torch testJacobian 适用于 DoubleTensor,不适用于 CudaTensor

torch testJacobian works with DoubleTensor, not with CudaTensor

我正在使用此模块开发神经网络:https://github.com/qassemoquab/stnbhwd/blob/master/AffineGridGeneratorBHWD.lua

nn.Jacobian.testJacobian 当我 运行 模块作为带有 CudaTensor 输入的 :cuda() 时很大,但当我 运行 模块作为 :double() 使用相同的 DoubleTensor 时则不是输入

:double() 运行 和 :cuda() 运行 的 :forward 非常接近。

:double() 运行 和 :cuda() 运行 的 :backward 截然不同,所以问题出在 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 方法中的问题....还在摸索。

这是预期的(不是错误或错误)。雅可比测试需要足够高的精度,而 Float preicison (CudaTensor) 无法满足您的要求。