Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/torch/nn.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Chanan <gchanan@fb.com>2016-11-15 23:50:08 +0300
committerGregory Chanan <gchanan@fb.com>2016-11-15 23:50:08 +0300
commit1828978f428a2df6409e8e0e7851e5b932a07c0c (patch)
tree825372aa5584782f99f2c25fb4c40b22d455fdc7
parent53e73cc687195ab42fe03ed0947a76cb515cddad (diff)
Add contiguous checking / make tensors contiguous for
SpatialUpSamplingBilinear, PReLU, SpatialSubSampling, TemporalConvolution.
-rw-r--r--SpatialUpSamplingBilinear.lua3
-rw-r--r--lib/THNN/generic/PReLU.c15
-rw-r--r--lib/THNN/generic/SpatialSubSampling.c43
-rw-r--r--lib/THNN/generic/TemporalConvolution.c7
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);
}