diff options
author | Sergey Zagoruyko <zagoruyko2@gmail.com> | 2016-04-23 21:44:31 +0300 |
---|---|---|
committer | Sergey Zagoruyko <zagoruyko2@gmail.com> | 2016-04-23 21:44:31 +0300 |
commit | fd12753169c5742b9390988f32947386f3820c79 (patch) | |
tree | 68bdcb004f41d8e1957b90b5f537b7dca94a3100 | |
parent | d976c1060a7ad804f4c1988a7bf49980d8fc5bfb (diff) | |
parent | 93ab1c9947eabc16a31faa865bf8bbef87282930 (diff) |
Merge pull request #171 from szagoruyko/R5-gradInput-move
[R5] Move gradInput:resizeAs(input) everywhere
-rw-r--r-- | BatchNormalization.lua | 2 | ||||
-rw-r--r-- | Pointwise.lua | 8 | ||||
-rw-r--r-- | Pooling.lua | 7 | ||||
-rw-r--r-- | Pooling3D.lua | 9 | ||||
-rw-r--r-- | SpatialConvolution.lua | 2 | ||||
-rw-r--r-- | SpatialCrossMapLRN.lua | 7 | ||||
-rw-r--r-- | SpatialFullConvolution.lua | 6 | ||||
-rw-r--r-- | SpatialSoftMax.lua | 7 | ||||
-rw-r--r-- | VolumetricConvolution.lua | 8 |
9 files changed, 19 insertions, 37 deletions
diff --git a/BatchNormalization.lua b/BatchNormalization.lua index a342063..83597d3 100644 --- a/BatchNormalization.lua +++ b/BatchNormalization.lua @@ -48,7 +48,6 @@ function BatchNormalization:createIODescriptors(input) local nFeature = self.running_mean:numel() self.iSize = input:size() self.output:resizeAs(input) - self.gradInput:resizeAs(input) self.iDesc = cudnn.toDescriptor(input) self.oDesc = cudnn.toDescriptor(self.output) local biasSize = torch.ones(self.nDim):totable() @@ -88,6 +87,7 @@ end local function backward(self,input,gradOutput, scale) assert(gradOutput:isContiguous()) self:createIODescriptors(input) + self.gradInput:resizeAs(input) scale = scale or 1 scaleTens:fill(scale) errcheck('cudnnBatchNormalizationBackward', diff --git a/Pointwise.lua b/Pointwise.lua index 92b3e45..93298ad 100644 --- a/Pointwise.lua +++ b/Pointwise.lua @@ -12,7 +12,6 @@ function Pointwise:createIODescriptors(input) assert(self.mode, 'mode is not set. (trying to use base class?)'); assert(input:isContiguous(), 'Non-contiguous inputs not supported yet'); if not self.inplace then - self.gradInput:resizeAs(input) self.output:resizeAs(input) end @@ -60,7 +59,12 @@ function Pointwise:updateGradInput(input, gradOutput) gradOutput = self._gradOutput end self:createIODescriptors(input) - if self.inplace then self.output:set(input); self.gradInput:set(gradOutput) end + if self.inplace then + self.output:set(input); + self.gradInput:set(gradOutput) + else + self.gradInput:resizeAs(input) + end errcheck('cudnnActivationBackward', cudnn.getHandle(), self.activDesc[0], one:data(), diff --git a/Pooling.lua b/Pooling.lua index d004563..45afccb 100644 --- a/Pooling.lua +++ b/Pooling.lua @@ -53,9 +53,6 @@ function Pooling:createIODescriptors(input) input:size(1) ~= self.iSize[1] or input:size(2) ~= self.iSize[2] or input:size(3) ~= self.iSize[3] or input:size(4) ~= self.iSize[4] then self.iSize = input:size() - -- resize gradInput - self.gradInput:resizeAs(input) - -- resize output local oW, oH if self.ceil_mode then oW = math.ceil((input:size(4)+self.padW*2 - self.kW)/self.dW + 1) @@ -70,9 +67,6 @@ function Pooling:createIODescriptors(input) self.iDesc = cudnn.toDescriptor(input) self.oDesc = cudnn.toDescriptor(self.output) if not batch then - self.gradInput = self.gradInput:view(self.gradInput:size(2), - self.gradInput:size(3), - self.gradInput:size(4)) self.output = self.output:view(self.output:size(2), self.output:size(3), self.output:size(4)) @@ -102,6 +96,7 @@ function Pooling:updateGradInput(input, gradOutput) self._gradOutput:resizeAs(gradOutput):copy(gradOutput) gradOutput = self._gradOutput end + self.gradInput:resizeAs(input) if not self.poolDesc then self:resetPoolDescriptors() end self:createIODescriptors(input) errcheck('cudnnPoolingBackward', diff --git a/Pooling3D.lua b/Pooling3D.lua index cce67c3..e4c0218 100644 --- a/Pooling3D.lua +++ b/Pooling3D.lua @@ -58,8 +58,6 @@ function Pooling:createIODescriptors(input) or input:size(3) ~= self.iSize[3] or input:size(4) ~= self.iSize[4] or input:size(5) ~= self.iSize[5] then self.iSize = input:size() - -- resize gradInput - self.gradInput:resizeAs(input) -- resize output local oW, oH, oT if self.ceil_mode then @@ -77,10 +75,6 @@ function Pooling:createIODescriptors(input) self.iDesc = cudnn.toDescriptor(input) self.oDesc = cudnn.toDescriptor(self.output) if not batch then - self.gradInput = self.gradInput:view(self.gradInput:size(2), - self.gradInput:size(3), - self.gradInput:size(4), - self.gradInput:size(5)) self.output = self.output:view(self.output:size(2), self.output:size(3), self.output:size(4), @@ -105,6 +99,9 @@ function Pooling:updateOutput(input) end function Pooling:updateGradInput(input, gradOutput) + if not self.gradInput then return end + self.gradInput:resizeAs(input) + assert(gradOutput:dim() == 4 or gradOutput:dim() == 5); if not gradOutput:isContiguous() then self._gradOutput = self._gradOutput or gradOutput.new() diff --git a/SpatialConvolution.lua b/SpatialConvolution.lua index b92dd57..1fd3ea0 100644 --- a/SpatialConvolution.lua +++ b/SpatialConvolution.lua @@ -388,8 +388,8 @@ end function SpatialConvolution:updateGradInput(input, gradOutput) if not self.gradInput then return end - self.gradInput:resizeAs(input) + input, gradOutput = makeContiguous(self, input, gradOutput) assert(gradOutput:dim() == 3 or gradOutput:dim() == 4, 'gradOutput has to be 3D or 4D'); if not self.weightDesc then self:resetWeightDescriptors() end diff --git a/SpatialCrossMapLRN.lua b/SpatialCrossMapLRN.lua index f6e7cd9..1f4ba33 100644 --- a/SpatialCrossMapLRN.lua +++ b/SpatialCrossMapLRN.lua @@ -36,15 +36,11 @@ function LRN:createIODescriptors(input) input:size(1) ~= self.iSize[1] or input:size(2) ~= self.iSize[2] or input:size(3) ~= self.iSize[3] or input:size(4) ~= self.iSize[4] then self.iSize = input:size() - self.gradInput:resizeAs(input) self.output:resizeAs(input) -- create input/output descriptor self.iDesc = cudnn.toDescriptor(input) if not batch then - self.gradInput = self.gradInput:view(self.gradInput:size(2), - self.gradInput:size(3), - self.gradInput:size(4)) self.output = self.output:view(self.output:size(2), self.output:size(3), self.output:size(4)) @@ -70,6 +66,9 @@ function LRN:updateOutput(input) end function LRN:updateGradInput(input, gradOutput) + if not self.gradInput then return end + self.gradInput:resizeAs(input) + assert(gradOutput:dim() == 3 or gradOutput:dim() == 4); if not gradOutput:isContiguous() then self._gradOutput = self._gradOutput or gradOutput.new() diff --git a/SpatialFullConvolution.lua b/SpatialFullConvolution.lua index 887e85b..cfbd61d 100644 --- a/SpatialFullConvolution.lua +++ b/SpatialFullConvolution.lua @@ -75,8 +75,6 @@ function SpatialFullConvolution:createIODescriptors(input) or input:size(3) ~= self.iSize[3] or input:size(4) ~= self.iSize[4] then self.iSize = input:size() - -- resize gradInput - if self.gradInput then self.gradInput:resizeAs(input); end assert(self.nInputPlane == input:size(2), 'input has to contain: ' .. self.nInputPlane .. ' feature maps, but received input of size: ' @@ -291,9 +289,6 @@ function SpatialFullConvolution:createIODescriptors(input) end if not batch then - self.gradInput = self.gradInput:view(self.gradInput:size(2), - self.gradInput:size(3), - self.gradInput:size(4)) self.output = self.output:view(self.output:size(2), self.output:size(3), self.output:size(4)) @@ -329,6 +324,7 @@ end function SpatialFullConvolution:updateGradInput(input, gradOutput) if not self.gradInput then return end + self.gradInput:resizeAs(input) assert(gradOutput:dim() == 3 or gradOutput:dim() == 4, 'gradOutput has to be 3D or 4D'); assert(gradOutput:isContiguous(), 'gradOutput has to be contiguous') diff --git a/SpatialSoftMax.lua b/SpatialSoftMax.lua index 4b3a488..167eb1f 100644 --- a/SpatialSoftMax.lua +++ b/SpatialSoftMax.lua @@ -35,22 +35,16 @@ function SpatialSoftMax:createIODescriptors(input) input:size(1) ~= self.iSize[1] or input:size(2) ~= self.iSize[2] or input:size(3) ~= self.iSize[3] or input:size(4) ~= self.iSize[4] then self.iSize = input:size() - self.gradInput:resizeAs(input) self.output:resizeAs(input) self.iDesc = cudnn.toDescriptor(input) self.oDesc = cudnn.toDescriptor(self.output) if not singleDim and not batch then - self.gradInput = self.gradInput:view(self.gradInput:size(2), - self.gradInput:size(3), - self.gradInput:size(4)) self.output = self.output:view(self.output:size(2), self.output:size(3), self.output:size(4)) elseif singleDim and not batch then - self.gradInput = self.gradInput:view(self.gradInput:size(2)) self.output = self.output:view(self.output:size(2)) elseif singleDim and batch then - self.gradInput = self.gradInput:view(self.gradInput:size(1), self.gradInput:size(2)) self.output = self.output:view(self.output:size(1), self.output:size(2)) end end @@ -72,6 +66,7 @@ function SpatialSoftMax:updateOutput(input) end function SpatialSoftMax:updateGradInput(input, gradOutput) + self.gradInput:resizeAs(input) if not gradOutput:isContiguous() then self._gradOutput = self._gradOutput or gradOutput.new() self._gradOutput:resizeAs(gradOutput):copy(gradOutput) diff --git a/VolumetricConvolution.lua b/VolumetricConvolution.lua index e9efb64..fd5e9c7 100644 --- a/VolumetricConvolution.lua +++ b/VolumetricConvolution.lua @@ -76,8 +76,6 @@ function VolumetricConvolution:createIODescriptors(input) or input:size(3) ~= self.iSize[3] or input:size(4) ~= self.iSize[4] or input:size(5) ~= self.iSize[5] then self.iSize = input:size() - -- resize gradInput - if self.gradInput then self.gradInput:resizeAs(input); end -- create input descriptor self.iDesc = cudnn.toDescriptor(input) -- create conv descriptor @@ -287,10 +285,6 @@ function VolumetricConvolution:createIODescriptors(input) ----------------------------------------------------------------------- if not batch then - self.gradInput = self.gradInput:view(self.gradInput:size(2), - self.gradInput:size(3), - self.gradInput:size(4), - self.gradInput:size(5)) self.output = self.output:view(self.output:size(2), self.output:size(3), self.output:size(4), @@ -337,6 +331,8 @@ end function VolumetricConvolution:updateGradInput(input, gradOutput) if not self.gradInput then return end + self.gradInput:resizeAs(input) + input, gradOutput = makeContiguous(self, input, gradOutput) assert(gradOutput:dim() == 4 or gradOutput:dim() == 5, 'gradOutput has to be a 4D or 5D tensor'); |