A PyTorch Implementation for Drop an Octave
This repository contains a PyTorch implementation of the paper Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution.
You can pretty much use the OctConv2d
layers to replace your normal nn.Conv2d
layers, with a small difference. There are three types of Octave Convolutions, 'first'
, 'regular'
, and 'last'
. The "First" type takes a tensor input and returns a tuple of two tensors. The "Regular" type takes the tuple and outputs the same spec of tuple. The "Last" type takes the tuple and outputs one tensor.
Here's an example:
class OctCNN(nn.Module):
def __init__(self):
super().__init__()
self.convs = nn.Sequential(OctConv2d('first', in_channels=1, out_channels=32, kernel_size=3),
OctReLU(),
OctConv2d('regular', in_channels=32, out_channels=64, kernel_size=3),
OctReLU(),
OctConv2d('regular', in_channels=64, out_channels=128, kernel_size=3),
OctReLU(),
OctMaxPool2d(2),
OctConv2d('regular', in_channels=128, out_channels=128, kernel_size=3),
OctReLU(),
OctConv2d('last', in_channels=128, out_channels=128, kernel_size=3),
nn.ReLU(),
nn.MaxPool2d(2),
)
self.fc = nn.Sequential(nn.Linear(6272, 256),
nn.Dropout(0.5),
nn.Linear(256, 10)
)
def forward(self, x):
x = self.convs(x)
x = x.view(-1, x.size(1) * x.size(2) * x.size(3))
x = self.fc(x)
return x
Note that OctReLU
and OctMaxPool2d
are wrappers for nn.ReLU
and nn.MaxPool2d
, so that you can use OctConv2d
layer with nn.Sequential
.
- group/dilation/padding congruency
- Added ResNets
MXNet implementation by terrychenism here
Another PyTorch implementation by lxtGH here
This repo is MIT licensed.