diff options
author | Clement Farabet <clement.farabet@gmail.com> | 2013-03-20 07:23:43 +0400 |
---|---|---|
committer | Clement Farabet <clement.farabet@gmail.com> | 2013-03-20 07:23:43 +0400 |
commit | 01de69c383f08abaf867fef008294dee4c56bf2d (patch) | |
tree | ef9100ac253c1d01886ddf169b238355dd6465e1 | |
parent | edf13338e79ec336b5d5fb0b7f95fc8864f747cc (diff) |
Integrated CUDA conv routines from cuda-convnet library.
-rw-r--r-- | SpatialConvolutionCUDA.lua | 50 | ||||
-rw-r--r-- | Transpose.lua | 29 | ||||
-rw-r--r-- | init.lua | 2 |
3 files changed, 81 insertions, 0 deletions
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 + @@ -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') |