diff options
author | Gregory Chanan <gchanan@fb.com> | 2016-11-15 23:50:08 +0300 |
---|---|---|
committer | Gregory Chanan <gchanan@fb.com> | 2016-11-15 23:50:08 +0300 |
commit | 1828978f428a2df6409e8e0e7851e5b932a07c0c (patch) | |
tree | 825372aa5584782f99f2c25fb4c40b22d455fdc7 | |
parent | 53e73cc687195ab42fe03ed0947a76cb515cddad (diff) |
Add contiguous checking / make tensors contiguous for
SpatialUpSamplingBilinear, PReLU, SpatialSubSampling, TemporalConvolution.
-rw-r--r-- | SpatialUpSamplingBilinear.lua | 3 | ||||
-rw-r--r-- | lib/THNN/generic/PReLU.c | 15 | ||||
-rw-r--r-- | lib/THNN/generic/SpatialSubSampling.c | 43 | ||||
-rw-r--r-- | lib/THNN/generic/TemporalConvolution.c | 7 |
4 files changed, 61 insertions, 7 deletions
diff --git a/SpatialUpSamplingBilinear.lua b/SpatialUpSamplingBilinear.lua index 54ce5b8..8f19f91 100644 --- a/SpatialUpSamplingBilinear.lua +++ b/SpatialUpSamplingBilinear.lua @@ -70,12 +70,12 @@ end function SpatialUpSamplingBilinear:updateOutput(input) assert(input:dim() == 4 or input:dim()==3, 'SpatialUpSamplingBilinear only supports 3D or 4D tensors' ) + input = makeContiguous(self, input) local inputwas3D = false if input:dim() == 3 then input=input:view(-1, input:size(1), input:size(2), input:size(3)) inputwas3D = true end - input = makeContiguous(self, input) local xdim = input:dim() local ydim = xdim - 1 self:setSize(input) @@ -98,6 +98,7 @@ function SpatialUpSamplingBilinear:updateGradInput(input, gradOutput) 'SpatialUpSamplingBilinear only support 3D or 4D tensors' ) assert(input:dim() == gradOutput:dim(), 'Input and gradOutput should be of same dimension' ) + input, gradOutput = makeContiguous(self, input, gradOutput) local inputwas3D = false if input:dim() == 3 then input = input:view(-1, input:size(1), input:size(2), input:size(3)) diff --git a/lib/THNN/generic/PReLU.c b/lib/THNN/generic/PReLU.c index 75f93e2..ba03b06 100644 --- a/lib/THNN/generic/PReLU.c +++ b/lib/THNN/generic/PReLU.c @@ -2,6 +2,16 @@ #define TH_GENERIC_FILE "generic/PReLU.c" #else +static inline void THNN_(PReLU_shapeCheck)( + THNNState *state, + THTensor *input, + THTensor *gradOutput) { + THArgCheck(THTensor_(isContiguous)(input), 2, "input must be contiguous"); + if (gradOutput != NULL) { + THArgCheck(THTensor_(isContiguous)(gradOutput), 2, "gradOuput must be contiguous"); + } +} + void THNN_(PReLU_updateOutput)( THNNState *state, THTensor *input, @@ -9,6 +19,7 @@ void THNN_(PReLU_updateOutput)( THTensor *weight, THIndex_t nOutputPlane) { + THNN_(PReLU_shapeCheck)(state, input, NULL); THTensor_(resizeAs)(output, input); if (nOutputPlane == 0) @@ -76,6 +87,7 @@ void THNN_(PReLU_updateGradInput)( THTensor *weight, THIndex_t nOutputPlane) { + THNN_(PReLU_shapeCheck)(state, input, gradOutput); THNN_CHECK_NELEMENT(input, gradOutput); THTensor_(resizeAs)(gradInput, input); @@ -161,7 +173,8 @@ void THNN_(PReLU_accGradParameters)( THIndex_t nOutputPlane, real scale) { - THNN_CHECK_NELEMENT(input, gradOutput); + THNN_(PReLU_shapeCheck)(state, input, gradOutput); + THNN_CHECK_NELEMENT(input, gradOutput); real *gradWeight_data = THTensor_(data)(gradWeight); if (nOutputPlane == 0) diff --git a/lib/THNN/generic/SpatialSubSampling.c b/lib/THNN/generic/SpatialSubSampling.c index abfbfce..1b2e222 100644 --- a/lib/THNN/generic/SpatialSubSampling.c +++ b/lib/THNN/generic/SpatialSubSampling.c @@ -2,6 +2,39 @@ #define TH_GENERIC_FILE "generic/SpatialSubSampling.c" #else +static inline void THNN_(SpatialSubSampling_shapeCheck)( + THTensor *input, + THTensor *gradOutput, + THTensor *weight, + int kW, int kH) { + int ndims = input->nDimension; + THNN_ARGCHECK(input->nDimension == 3 || input->nDimension == 4, 2, input, + "3D or 4D input tensor expected but got: %s"); + + int nInputPlane = THTensor_(size)(weight, 0); + + int dimw = 2; + int dimh = 1; + + long inputWidth; + long inputHeight; + + if (input->nDimension == 4) { + dimw++; + dimh++; + } + + inputWidth = input->size[dimw]; + inputHeight = input->size[dimh]; + + THArgCheck(input->size[dimh-1] == nInputPlane, 2, "invalid number of input planes"); + THArgCheck(inputWidth >= kW && inputHeight >= kH, 2, "input image smaller than kernel size"); + + if (gradOutput != NULL) { + THArgCheck(THTensor_(isContiguous)(gradOutput), 3, "gradOutput must be contiguous"); + } +} + void THNN_(SpatialSubSampling_updateOutput)( THNNState *state, THTensor *input, @@ -30,7 +63,7 @@ void THNN_(SpatialSubSampling_updateOutput)( long k; - THArgCheck(input->nDimension == 3 || input->nDimension == 4, 2, "3D or 4D(batch mode) tensor expected"); + THNN_(SpatialSubSampling_shapeCheck)(input, NULL, weight, kW, kH); if (input->nDimension == 4) { nbatch = input->size[0]; @@ -43,9 +76,6 @@ void THNN_(SpatialSubSampling_updateOutput)( outputWidth = (inputWidth - kW) / dW + 1; outputHeight = (inputHeight - kH) / dH + 1; - THArgCheck(input->size[dimh-1] == nInputPlane, 2, "invalid number of input planes"); - THArgCheck(inputWidth >= kW && inputHeight >= kH, 2, "input image smaller than kernel size"); - if (input->nDimension == 3) THTensor_(resize3d)(output, nInputPlane, outputHeight, outputWidth); else @@ -105,7 +135,8 @@ void THNN_(SpatialSubSampling_updateGradInput)( int kW, int kH, int dW, int dH) { - + THNN_(SpatialSubSampling_shapeCheck)(input, gradOutput, weight, kW, kH); + int dimw = 2; int dimh = 1; long nbatch = 1; @@ -188,6 +219,8 @@ void THNN_(SpatialSubSampling_accGradParameters)( int dW, int dH, real scale) { + THNN_(SpatialSubSampling_shapeCheck)(input, gradOutput, gradWeight, kW, kH); + long nbatch = 1; long dimw = 2; long dimh = 1; diff --git a/lib/THNN/generic/TemporalConvolution.c b/lib/THNN/generic/TemporalConvolution.c index e7c5142..0e8e83a 100644 --- a/lib/THNN/generic/TemporalConvolution.c +++ b/lib/THNN/generic/TemporalConvolution.c @@ -163,6 +163,9 @@ void THNN_(TemporalConvolution_updateGradInput)( nInputFrame = input->size[dimS]; nOutputFrame = gradOutput->size[dimS]; + input = THTensor_(newContiguous)(input); + gradOutput = THTensor_(newContiguous)(gradOutput); + gradOutputWindow = THTensor_(new)(); gradInputWindow = THTensor_(new)(); @@ -231,6 +234,8 @@ void THNN_(TemporalConvolution_updateGradInput)( THTensor_(free)(gradOutputWindow); THTensor_(free)(gradInputWindow); + THTensor_(free)(gradOutput); + THTensor_(free)(input); } @@ -264,6 +269,7 @@ void THNN_(TemporalConvolution_accGradParameters)( nOutputFrame = gradOutput->size[dimS]; input = THTensor_(newContiguous)(input); + gradOutput = THTensor_(newContiguous)(gradOutput); gradOutputWindow = THTensor_(new)(); inputWindow = THTensor_(new)(); @@ -347,6 +353,7 @@ void THNN_(TemporalConvolution_accGradParameters)( THTensor_(free)(gradOutputWindow); THTensor_(free)(inputWindow); + THTensor_(free)(gradOutput); THTensor_(free)(input); } |