Skip to content

Commit

Permalink
Add Volumetric Dilated Max Pooling
Browse files Browse the repository at this point in the history
new file:   VolumetricDilatedMaxPooling.lua
modified:   init.lua
modified:   lib/THNN/generic/THNN.h
copied:     lib/THNN/generic/VolumetricMaxPooling.c -> lib/THNN/generic/VolumetricDilatedMaxPooling.c
modified:   lib/THNN/generic/VolumetricMaxPooling.c
modified:   lib/THNN/init.c
modified:   test.lua

Update docs
modified:   doc/convolution.md

Resolved bug in ceil mode
modified:   lib/THNN/generic/VolumetricDilatedMaxPooling.c
  • Loading branch information
kmul00 committed Aug 28, 2016
1 parent c1232cd commit ddebc72
Show file tree
Hide file tree
Showing 8 changed files with 584 additions and 354 deletions.
64 changes: 64 additions & 0 deletions VolumetricDilatedMaxPooling.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
local THNN = require 'nn.THNN'
local VolumetricDilatedMaxPooling, parent = torch.class('nn.VolumetricDilatedMaxPooling', 'nn.VolumetricMaxPooling')

function VolumetricDilatedMaxPooling:__init(kT, kW, kH, dT, dW, dH, padT, padW, padH, dilationT, dilationW, dilationH)
parent.__init(self, kT, kW, kH, dT, dW, dH, padT, padW, padH)

self.dilationT = dilationT or 1
self.dilationW = dilationW or 1
self.dilationH = dilationH or 1

end

function VolumetricDilatedMaxPooling:updateOutput(input)
local dims = input:dim()
self.itime = input:size(dims-2)
self.iheight = input:size(dims-1)
self.iwidth = input:size(dims)

self.indices = self.indices or input.new()
input.THNN.VolumetricDilatedMaxPooling_updateOutput(
input:cdata(),
self.output:cdata(),
self.indices:cdata(),
self.kT, self.kW, self.kH,
self.dT, self.dW, self.dH,
self.padT, self.padW, self.padH,
self.dilationT, self.dilationW, self.dilationH,
self.ceil_mode
)
return self.output
end

function VolumetricDilatedMaxPooling:updateGradInput(input, gradOutput)
input.THNN.VolumetricDilatedMaxPooling_updateGradInput(
input:cdata(),
gradOutput:cdata(),
self.gradInput:cdata(),
self.indices:cdata(),
self.dT, self.dW, self.dH,
self.padT, self.padW, self.padH,
self.dilationT, self.dilationW, self.dilationH
)
return self.gradInput
end

function VolumetricDilatedMaxPooling:clearState()
if self.indices then
self.indices:set()
end
return parent.clearState(self)
end

function VolumetricDilatedMaxPooling:__tostring__()
local s = string.format('%s(%dx%dx%d, %d,%d,%d', torch.type(self),
self.kT, self.kW, self.kH, self.dT, self.dW, self.dH)
if (self.padT or self.padW or self.padH) and
(self.padT ~= 0 or self.padW ~= 0 or self.padH ~= 0) then
s = s .. ', ' .. self.padT.. ',' .. self.padW .. ','.. self.padH
end
s = s .. ', ' .. self.dilationT .. ',' .. self.dilationW .. ',' .. self.dilationH
s = s .. ')'

return s
end
25 changes: 25 additions & 0 deletions doc/convolution.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ a kernel for computing the weighted average in a neighborhood ;
* [VolumetricFullConvolution](#nn.VolumetricFullConvolution) : a 3D full convolution over an input video (a sequence of images) ;
* [VolumetricDilatedConvolution](#nn.VolumetricDilatedConvolution) : a 3D dilated convolution over an input image ;
* [VolumetricMaxPooling](#nn.VolumetricMaxPooling) : a 3D max-pooling operation over an input video.
* [VolumetricDilatedMaxPooling](#nn.VolumetricDilatedMaxPooling) : a 3D dilated max-pooling operation over an input video ;
* [VolumetricAveragePooling](#nn.VolumetricAveragePooling) : a 3D average-pooling operation over an input video.
* [VolumetricMaxUnpooling](#nn.VolumetricMaxUnpooling) : a 3D max-unpooling operation.
* [VolumetricReplicationPadding](#nn.VolumetricReplicationPadding) : Pads a volumetric feature map with the value at the edge of the input borders. ;
Expand Down Expand Up @@ -1022,6 +1023,30 @@ Applies 3D max-pooling operation in `kTxkWxkH` regions by step size
`dTxdWxdH` steps. The number of output features is equal to the number of
input planes / dT. The input can optionally be padded with zeros. Padding should be smaller than half of kernel size. That is, `padT < kT/2`, `padW < kW/2` and `padH < kH/2`.

<a name="nn.VolumetricDilatedMaxPooling"></a>
### VolumetricDilatedMaxPooling ###

```lua
module = nn.VolumetricDilatedMaxPooling(kT, kW, kH [, dT, dW, dH, padT, padW, padH, dilationT, dilationW, dilationH])
```

Also sometimes referred to as **atrous pooling**.
Applies 3D dilated max-pooling operation in `kTxkWxkH` regions by step size
`dTxdWxdH` steps. The number of output features is equal to the number of
input planes. If `dilationT`, `dilationW` and `dilationH` are not provided, this is equivalent to performing normal `nn.VolumetricMaxPooling`.

If the input image is a 4D tensor `nInputPlane x depth x height x width`, the output
image size will be `nOutputPlane x otime x oheight x owidth` where

```lua
otime = op((depth - (dilationT * (kT - 1) + 1) + 2*padT) / dT + 1)
owidth = op((width - (dilationW * (kW - 1) + 1) + 2*padW) / dW + 1)
oheight = op((height - (dilationH * (kH - 1) + 1) + 2*padH) / dH + 1)
```

`op` is a rounding operator. By default, it is `floor`. It can be changed
by calling `:ceil()` or `:floor()` methods.

<a name="nn.VolumetricAveragePooling"></a>
### VolumetricAveragePooling ###

Expand Down
1 change: 1 addition & 0 deletions init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ require('nn.VolumetricConvolution')
require('nn.VolumetricFullConvolution')
require('nn.VolumetricDilatedConvolution')
require('nn.VolumetricMaxPooling')
require('nn.VolumetricDilatedMaxPooling')
require('nn.VolumetricMaxUnpooling')
require('nn.VolumetricAveragePooling')
require('nn.VolumetricBatchNormalization')
Expand Down
20 changes: 20 additions & 0 deletions lib/THNN/generic/THNN.h
Original file line number Diff line number Diff line change
Expand Up @@ -1122,6 +1122,26 @@ TH_API void THNN_(VolumetricMaxPooling_updateGradInput)(
int dT, int dW, int dH,
int pT, int pW, int pH);

TH_API void THNN_(VolumetricDilatedMaxPooling_updateOutput)(
THNNState *state,
THTensor *input,
THTensor *output,
THTensor *indices,
int kT, int kW, int kH,
int dT, int dW, int dH,
int pT, int pW, int pH,
int dilationT, int dilationW, int dilationH,
bool ceilMode);
TH_API void THNN_(VolumetricDilatedMaxPooling_updateGradInput)(
THNNState *state,
THTensor *input,
THTensor *gradOutput,
THTensor *gradInput,
THTensor *indices,
int dT, int dW, int dH,
int pT, int pW, int pH,
int dilationT, int dilationW, int dilationH);

TH_API void THNN_(VolumetricMaxUnpooling_updateOutput)(
THNNState *state,
THTensor *input,
Expand Down
Loading

0 comments on commit ddebc72

Please sign in to comment.