torch testJacobian 仅支持 DoubleTensor,不支持 CudaTensor

我在使用这个模块进行神经网络的工作: https://github.com/qassemoquab/stnbhwd/blob/master/AffineGridGeneratorBHWD.lua

当我使用 CudaTensor 输入进行 :cuda() 运行时,nn.Jacobian.testJacobian 非常大,但是使用相同的 DoubleTensor 输入时则不会发生这种情况。

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

:double() 运行的 :backward 和 :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 方法中... 继续调试。

点赞
用户117844
用户117844

这是预期的(不是错误或漏洞)。 Jacobian 测试需要足够高的精度,而 Float 精度(CudaTensor)无法提供这种精度。

2016-04-11 15:17:56