【发布时间】:2016-08-01 19:48:23
【问题描述】:
我正在使用此模块开发神经网络:https://github.com/qassemoquab/stnbhwd/blob/master/AffineGridGeneratorBHWD.lua
nn.Jacobian.testJacobian 在我使用 CudaTensor 输入作为 :cuda() 运行模块时很大,但当我使用相同的 DoubleTensor 输入作为 :double() 运行它时则不是
:double() 运行的 :forward 和 :cuda() 运行非常接近。
: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 方法上弄错了.... 还在纠结。
【问题讨论】:
标签: lua neural-network torch