Keras implementation of the Octave Convolution blocks from the paper Drop an Octave: Reducing Spatial Redundancy in Convolutional Neural Networks with Octave Convolution.
Octave Convolutions
are a semi-drop-in-replacement for regular convolution layers.
They are implemented in 3 major steps:
Use the initial_octconv
block from octave_conv.py
to initialize the Octave convolution blocks. This function accepts a single input tensor, and returns two output tensors : The high frequency pathway and low frequency pathway tensors, in that order
ip = Input(...)
x_high, x_low = initial_conv(ip, ...)
Once the two frequency pathways have been obtained, use any number of octconv_block
from octave_conv.py
to make the network larger.
NOTE:
Each of these blocks accept two input tensors, and emits two output tensors.
x_high, x_low = octconv_block(x_high, x_low, ...)
x_high, x_low = octconv_block(x_high, x_low, ...)
x_high, x_low = octconv_block(x_high, x_low, ...)
Once you are finished adding octconv_block
s, merge the two frequency pathways using final_octconv
from octave_conv.py
.
This block accepts two input tensors and one output tensor.
x = final_octconv(x_high, x_low, ...)
...
This code is heavily based on the MXNet implementation by terrychenism at https://github.com/terrychenism/OctaveConv.
- Keras 2.2.4+
- Tensorflow 1.13+ (2.0 support depends on when Keras will support it) / Theano (not tested) / CNTK (not tested)