'Initializes a Conv2DBase block.
Arguments:
depth: The output depth of the block (i.e. #filters); if negative, the
output depth will be set to be the same as the input depth.
filter_size: The size of the 2D filter. If it\'s specified as an integer,
it\'s going to create a square filter. Otherwise, this is a tuple
specifying the height x width of the filter.
strides: A tuple specifying the y and x stride.
padding: One of the valid padding modes allowed by tf.nn.conv2d, or
\'REFLECT\'/\'SYMMETRIC\' for mirror padding.
bias: An initializer for the bias, or a Bias class object. If None, there
will be no bias in this block. See BiasAdd block.
act: Optional activation function applied to the output.
atrous_rate: optional input rate for ATrous convolution. If not None, this
will be used and the strides will be ignored.
conv: The convolution function to use (e.g. tf.nn.conv2d).
name: The name for this conv2d op.'

def __init__(self, depth, filter_size, strides, padding, bias=None, act=None, atrous_rate=None, conv=tf.nn.conv2d, name=None):

    super(Conv2DBase, self).__init__(name)
    with self._BlockScope():
        self._act = (act if act else PassThrough())
        self._bias = (BiasAdd(bias) if bias else PassThrough())
        self._kernel_shape = np.zeros((4,), dtype=np.int32)
        self._kernel_shape[:2] = filter_size
        self._kernel_shape[3] = depth
        self._strides = np.ones((4,), dtype=np.int32)
        self._strides[1:3] = strides
        self._strides = list(self._strides)
        self._padding = padding
        self._kernel = None
        self._conv = conv
        self._atrous_rate = atrous_rate
