From 01de69c383f08abaf867fef008294dee4c56bf2d Mon Sep 17 00:00:00 2001 From: Clement Farabet Date: Tue, 19 Mar 2013 23:23:43 -0400 Subject: Integrated CUDA conv routines from cuda-convnet library. --- SpatialConvolutionCUDA.lua | 50 ++++++++++++++++++++++++++++++++++++++++++++++ Transpose.lua | 29 +++++++++++++++++++++++++++ init.lua | 2 ++ 3 files changed, 81 insertions(+) create mode 100644 SpatialConvolutionCUDA.lua create mode 100644 Transpose.lua diff --git a/SpatialConvolutionCUDA.lua b/SpatialConvolutionCUDA.lua new file mode 100644 index 0000000..ccc0284 --- /dev/null +++ b/SpatialConvolutionCUDA.lua @@ -0,0 +1,50 @@ +local SpatialConvolutionCUDA, parent = torch.class('nn.SpatialConvolutionCUDA', 'nn.Module') + +function SpatialConvolutionCUDA:__init(nInputPlane, nOutputPlane, kW, kH, dW, dH) + parent.__init(self) + + dW = dW or 1 + dH = dH or 1 + + self.nInputPlane = nInputPlane + self.nOutputPlane = nOutputPlane + self.kW = kW + self.kH = kH + self.dW = dW + self.dH = dH + + self.weight = torch.Tensor(nInputPlane, kH, kW, nOutputPlane) + self.gradWeight = torch.Tensor(nInputPlane, kH, kW, nOutputPlane) + + self:reset() +end + +function SpatialConvolutionCUDA:reset(stdv) + if stdv then + stdv = stdv * math.sqrt(3) + else + stdv = 1/math.sqrt(self.kW*self.kH*self.nInputPlane) + end + self.weight:uniform(-stdv, stdv) +end + +function SpatialConvolutionCUDA:updateOutput(input) + return input.nn.SpatialConvolutionCUDA_updateOutput(self, input) +end + +function SpatialConvolutionCUDA:updateGradInput(input, gradOutput) + return input.nn.SpatialConvolutionCUDA_updateGradInput(self, input, gradOutput) +end + +function SpatialConvolutionCUDA:accGradParameters(input, gradOutput, scale) + return input.nn.SpatialConvolutionCUDA_accGradParameters(self, input, gradOutput, scale) +end + +function SpatialConvolutionCUDA:copy(sc) + local weight = sc.weight:clone() + weight:resize(sc.nOutputPlane, sc.nInputPlane * sc.kH * sc.kW) + weight = weight:t():contiguous() + weight:resize(sc.nInputPlane, sc.kH, sc.kW, sc.nOutputPlane) + self.weight:copy(weight) +end + diff --git a/Transpose.lua b/Transpose.lua new file mode 100644 index 0000000..a43729b --- /dev/null +++ b/Transpose.lua @@ -0,0 +1,29 @@ +local Transpose, parent = torch.class('nn.Transpose', 'nn.Module') + +-- transpose dimensions: +-- n = nn.Transpose({1,4},{1,3}) +-- will transpose dims 1 and 4, then 1 and 3... + +function Transpose:__init(...) + parent.__init(self) + self.permutations = {...} +end + +function Transpose:updateOutput(input) + for _,perm in ipairs(self.permutations) do + input = input:transpose(perm[1],perm[2]) + end + self.output:resizeAs(input):copy(input) + return self.output +end + +function Transpose:updateGradInput(input, gradOutput) + local ndim = gradOutput:nDimension() + for i = #self.permutations,1,-1 do + local perm = self.permutations[i] + gradOutput = gradOutput:transpose(perm[1],perm[2]) + end + self.gradInput:resizeAs(gradOutput):copy(gradOutput) + return self.gradInput +end + diff --git a/init.lua b/init.lua index 587412f..c6e9df9 100644 --- a/init.lua +++ b/init.lua @@ -13,6 +13,7 @@ include('Reshape.lua') include('Select.lua') include('Narrow.lua') include('Replicate.lua') +include('Transpose.lua') include('Copy.lua') include('Min.lua') @@ -59,6 +60,7 @@ include('SpatialConvolution.lua') include('SpatialFullConvolution.lua') include('SpatialFullConvolutionMap.lua') include('SpatialConvolutionMM.lua') +include('SpatialConvolutionCUDA.lua') include('SpatialConvolutionMap.lua') include('SpatialSubSampling.lua') include('SpatialMaxPooling.lua') -- cgit v1.2.3