from akida.core import (Layer, LayerParams, LayerType, Padding, PoolType)
[docs]class DepthwiseConv2D(Layer):
"""This represents a depthwise convolutional layer.
This is like a standard convolution, except it acts on each input channel separately.
There is a single filter per input channel, so weights shape is (X, Y, F).
Being the result of a quantized operation, it is possible to apply some shifts to adjust the
inputs/outputs scales to the equivalent operation performed on floats, while maintaining a
limited usage of bits and performing the operations on integer values.
Note: this layer applies a real convolution, and not a cross-correlation. It can optionally
apply a step-wise ReLU activation to its outputs.
The layer expects a 4D tensor whose first dimension is the sample index as input.
It returns a 4D tensor whose first dimension is the sample index and the last dimension is the
number of convolution filters, so the same as input channels.
The order of the input spatial dimensions is preserved, but their value may change according to
the convolution and pooling parameters.
Args:
kernel_size (int): Integer representing the spatial dimensions of the depthwise kernel.
kernel_stride (int, optional): Integer representing the spatial convolution stride.
Defaults to 1.
padding (:obj:`Padding`, optional): type of convolution. Defaults to Padding.Same.
pool_type (:obj:`PoolType`, optional): pooling type (NoPooling, or Max). Defaults to
PoolType.NoPooling.
pool_size (int, optional): Integer representing the window size over which to take the
maximum. Defaults to -1.
pool_stride (int, optional): Integer representing the pooling stride dimensions. A value of
-1 means same as pool_size. Defaults to -1.
output_bits (int, optional): output bitwidth. Defaults to 8.
buffer_bits (int, optional): buffer bitwidth. Defaults to 32.
activation (bool, optional): enable or disable relu activation function. Defaults to True.
name (str, optional): name of the layer. Defaults to empty string.
"""
def __init__(self,
kernel_size,
kernel_stride=1,
padding=Padding.Same,
pool_type=PoolType.NoPooling,
pool_size=-1,
pool_stride=-1,
output_bits=8,
buffer_bits=32,
activation=True,
name=""):
try:
params = LayerParams(
LayerType.DepthwiseConv2D, {
"kernel_size": kernel_size,
"kernel_stride": kernel_stride,
"padding": padding,
"pool_type": pool_type,
"pool_size": pool_size,
"pool_stride": pool_stride,
"output_bits": output_bits,
"buffer_bits": buffer_bits,
"activation": activation
})
# Call parent constructor to initialize C++ bindings
# Note that we invoke directly __init__ instead of using super, as
# specified in pybind documentation
Layer.__init__(self, params, name)
except BaseException:
self = None
raise