From 22ae2b49645903b91f85c72e8209d75b0a1fe76e Mon Sep 17 00:00:00 2001 From: jessegrabowski Date: Mon, 11 Dec 2023 22:00:18 +0100 Subject: [PATCH 1/7] Restore fast convolution functions and rewrites, as well as convolution docs Restore fast convolution functions and rewrites, as well as convolution docs --- doc/library/tensor/conv.rst | 71 +- doc/tutorial/conv_arithmetic.rst | 1080 +++++++ .../arbitrary_padding_no_strides.gif | Bin 0 -> 366138 bytes .../arbitrary_padding_no_strides.pdf | Bin 0 -> 43055 bytes ...rbitrary_padding_no_strides_transposed.gif | Bin 0 -> 260574 bytes ...rbitrary_padding_no_strides_transposed.pdf | Bin 0 -> 39682 bytes .../conv_arithmetic_figures/dilation.gif | Bin 0 -> 124951 bytes .../conv_arithmetic_figures/dilation.pdf | Bin 0 -> 3006 bytes .../full_padding_no_strides.gif | Bin 0 -> 443878 bytes .../full_padding_no_strides.pdf | Bin 0 -> 46434 bytes .../full_padding_no_strides_transposed.gif | Bin 0 -> 220238 bytes .../full_padding_no_strides_transposed.pdf | Bin 0 -> 36665 bytes .../no_padding_no_strides.gif | Bin 0 -> 27814 bytes .../no_padding_no_strides.pdf | Bin 0 -> 18276 bytes .../no_padding_no_strides_transposed.gif | Bin 0 -> 127685 bytes .../no_padding_no_strides_transposed.pdf | Bin 0 -> 26889 bytes .../no_padding_strides.gif | Bin 0 -> 34509 bytes .../no_padding_strides.pdf | Bin 0 -> 21098 bytes .../no_padding_strides_transposed.gif | Bin 0 -> 196131 bytes .../no_padding_strides_transposed.pdf | Bin 0 -> 31390 bytes .../numerical_no_padding_no_strides.gif | Bin 0 -> 54826 bytes .../numerical_no_padding_no_strides.pdf | Bin 0 -> 22686 bytes .../numerical_padding_strides.gif | Bin 0 -> 89960 bytes .../numerical_padding_strides.pdf | Bin 0 -> 33397 bytes .../padding_strides.gif | Bin 0 -> 96328 bytes .../padding_strides.pdf | Bin 0 -> 31188 bytes .../padding_strides_odd.gif | Bin 0 -> 100675 bytes .../padding_strides_odd.pdf | Bin 0 -> 34627 bytes .../padding_strides_odd_transposed.gif | Bin 0 -> 303965 bytes .../padding_strides_odd_transposed.pdf | Bin 0 -> 2648 bytes .../padding_strides_transposed.gif | Bin 0 -> 202264 bytes .../padding_strides_transposed.pdf | Bin 0 -> 33020 bytes .../same_padding_no_strides.gif | Bin 0 -> 214572 bytes .../same_padding_no_strides.pdf | Bin 0 -> 35063 bytes .../same_padding_no_strides_transposed.gif | Bin 0 -> 214572 bytes .../same_padding_no_strides_transposed.pdf | Bin 0 -> 35074 bytes .../conv_arithmetic_figures/sep2D.jpg | Bin 0 -> 45203 bytes doc/tutorial/index.rst | 1 + pytensor/tensor/conv/abstract_conv.py | 2 +- pytensor/tensor/conv/conv.py | 2637 +++++++++++++++++ pytensor/tensor/conv/conv3d2d.py | 329 ++ .../tensor/conv/corr.py | 0 .../tensor/conv/corr3d.py | 0 pytensor/tensor/conv/rewriting.py | 546 ++++ tests/tensor/conv/c_code/corr3d_gemm.c | 421 --- tests/tensor/conv/c_code/corr_gemm.c | 570 ---- tests/tensor/conv/speed_test_conv.py | 451 +++ tests/tensor/conv/test_abstract_conv.py | 402 ++- tests/tensor/conv/test_conv.py | 783 +++++ tests/tensor/conv/test_conv3d2d.py | 237 ++ 50 files changed, 6421 insertions(+), 1109 deletions(-) create mode 100644 doc/tutorial/conv_arithmetic.rst create mode 100644 doc/tutorial/conv_arithmetic_figures/arbitrary_padding_no_strides.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/arbitrary_padding_no_strides.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/arbitrary_padding_no_strides_transposed.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/arbitrary_padding_no_strides_transposed.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/dilation.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/dilation.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/full_padding_no_strides.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/full_padding_no_strides.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/full_padding_no_strides_transposed.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/full_padding_no_strides_transposed.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/no_padding_no_strides.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/no_padding_no_strides.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/no_padding_no_strides_transposed.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/no_padding_no_strides_transposed.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/no_padding_strides.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/no_padding_strides.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/no_padding_strides_transposed.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/no_padding_strides_transposed.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/numerical_no_padding_no_strides.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/numerical_no_padding_no_strides.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/numerical_padding_strides.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/numerical_padding_strides.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/padding_strides.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/padding_strides.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/padding_strides_odd.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/padding_strides_odd.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/padding_strides_odd_transposed.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/padding_strides_odd_transposed.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/padding_strides_transposed.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/padding_strides_transposed.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/same_padding_no_strides.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/same_padding_no_strides.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/same_padding_no_strides_transposed.gif create mode 100644 doc/tutorial/conv_arithmetic_figures/same_padding_no_strides_transposed.pdf create mode 100644 doc/tutorial/conv_arithmetic_figures/sep2D.jpg create mode 100644 pytensor/tensor/conv/conv.py create mode 100644 pytensor/tensor/conv/conv3d2d.py rename tests/tensor/conv/c_conv_corr_ref.py => pytensor/tensor/conv/corr.py (100%) rename tests/tensor/conv/c_conv3d_corr3d_ref.py => pytensor/tensor/conv/corr3d.py (100%) create mode 100644 pytensor/tensor/conv/rewriting.py delete mode 100644 tests/tensor/conv/c_code/corr3d_gemm.c delete mode 100644 tests/tensor/conv/c_code/corr_gemm.c create mode 100644 tests/tensor/conv/speed_test_conv.py create mode 100644 tests/tensor/conv/test_conv.py create mode 100644 tests/tensor/conv/test_conv3d2d.py diff --git a/doc/library/tensor/conv.rst b/doc/library/tensor/conv.rst index 5ee238c265..3d456f28d7 100644 --- a/doc/library/tensor/conv.rst +++ b/doc/library/tensor/conv.rst @@ -1,11 +1,68 @@ -========================================= -:mod:`tensor.conv` -- Tensor Convolutions -========================================= +.. _libdoc_tensor_conv: -.. module:: tensor.conv +========================================================== +:mod:`conv` -- Ops for convolutional neural nets +========================================================== + +.. module:: conv :platform: Unix, Windows - :synopsis: Tensor Convolutions -.. moduleauthor:: LISA, PyMC Developers, PyTensor Developers + :synopsis: ops for signal processing +.. moduleauthor:: LISA + + +The recommended user interface are: + +- :func:`pytensor.tensor.conv.conv2d` for 2d convolution +- :func:`pytensor.tensor.conv.conv3d` for 3d convolution + +Pytensor will automatically use the fastest implementation in many cases. +On the CPU, the implementation is a GEMM based one. + +This auto-tuning has the inconvenience that the first call is much +slower as it tries and times each implementation it has. So if you +benchmark, it is important that you remove the first call from your +timing. + +Implementation Details +====================== + +This section gives more implementation detail. Most of the time you do +not need to read it. Pytensor will select it for you. + + +- Implemented operators for neural network 2D / image convolution: + - :func:`conv.conv2d `. + old 2d convolution. DO NOT USE ANYMORE. + + For each element in a batch, it first creates a + `Toeplitz `_ matrix in a CUDA kernel. + Then, it performs a ``gemm`` call to multiply this Toeplitz matrix and the filters + (hence the name: MM is for matrix multiplication). + It needs extra memory for the Toeplitz matrix, which is a 2D matrix of shape + ``(no of channels * filter width * filter height, output width * output height)``. + + - :func:`CorrMM ` + This is a CPU-only 2d correlation implementation taken from + `caffe's cpp implementation `_. + It does not flip the kernel. + +- Implemented operators for neural network 3D / video convolution: + - :func:`Corr3dMM ` + This is a CPU-only 3d correlation implementation based on + the 2d version (:func:`CorrMM `). + It does not flip the kernel. As it provides a gradient, you can use it as a + replacement for nnet.conv3d. For convolutions done on CPU, + nnet.conv3d will be replaced by Corr3dMM. + + - :func:`conv3d2d ` + Another conv3d implementation that uses the conv2d with data reshaping. + It is faster in some corner cases than conv3d. It flips the kernel. + +.. autofunction:: pytensor.tensor.conv.conv2d +.. autofunction:: pytensor.tensor.conv.conv2d_transpose +.. autofunction:: pytensor.tensor.conv.conv3d +.. autofunction:: pytensor.tensor.conv.conv3d2d.conv3d +.. autofunction:: pytensor.tensor.conv.conv.conv2d -.. automodule:: pytensor.tensor.conv +.. automodule:: pytensor.tensor.conv.abstract_conv :members: diff --git a/doc/tutorial/conv_arithmetic.rst b/doc/tutorial/conv_arithmetic.rst new file mode 100644 index 0000000000..14edaf2c0f --- /dev/null +++ b/doc/tutorial/conv_arithmetic.rst @@ -0,0 +1,1080 @@ +.. _conv_arithmetic: + +=============================== +Convolution arithmetic tutorial +=============================== + +.. note:: + + This tutorial is adapted from an existing `convolution arithmetic guide + `_ [#]_, with an added emphasis on + Aesara's interface. + + Also, note that the signal processing community has a different nomenclature + and a well established literature on the topic, but for this tutorial + we will stick to the terms used in the machine learning community. For a + signal processing point of view on the subject, see for instance *Winograd, + Shmuel. Arithmetic complexity of computations. Vol. 33. Siam, 1980*. + +About this tutorial +=================== + +Learning to use convolutional neural networks (CNNs) for the first time is +generally an intimidating experience. A convolutional layer's output shape is +affected by the shape of its input as well as the choice of kernel shape, zero +padding and strides, and the relationship between these properties is not +trivial to infer. This contrasts with fully-connected layers, whose output size +is independent of the input size. Additionally, so-called transposed +convolutional layers (also known as fractionally strided convolutional layers, +or -- wrongly -- as deconvolutions) have been employed in more and more work as +of late, and their relationship with convolutional layers has been explained +with various degrees of clarity. + +The relationship between a convolution operation's input shape, kernel size, +stride, padding and its output shape can be confusing at times. + +The tutorial's objective is threefold: + +* Explain the relationship between convolutional layers and transposed + convolutional layers. +* Provide an intuitive understanding of the relationship between input shape, + kernel shape, zero padding, strides and output shape in convolutional and + transposed convolutional layers. +* Clarify Aesara's API on convolutions. + +Refresher: discrete convolutions +================================ + +The bread and butter of neural networks is *affine transformations*: a +vector is received as input and is multiplied with a matrix to produce an +output (to which a bias vector is usually added before passing the result +through a nonlinearity). This is applicable to any type of input, be it an +image, a sound clip or an unordered collection of features: whatever their +dimensionality, their representation can always be flattened into a vector +before the transformation. + +Images, sound clips and many other similar kinds of data have an intrinsic +structure. More formally, they share these important properties: + +* They are stored as multi-dimensional arrays. +* They feature one or more axes for which ordering matters (e.g., width and + height axes for an image, time axis for a sound clip). +* One axis, called the channel axis, is used to access different views of the + data (e.g., the red, green and blue channels of a color image, or the left + and right channels of a stereo audio track). + +These properties are not exploited when an affine transformation is applied; in +fact, all the axes are treated in the same way and the topological information +is not taken into account. Still, taking advantage of the implicit structure of +the data may prove very handy in solving some tasks, like computer vision and +speech recognition, and in these cases it would be best to preserve it. This is +where discrete convolutions come into play. + +A discrete convolution is a linear transformation that preserves this notion of +ordering. It is sparse (only a few input units contribute to a given output +unit) and reuses parameters (the same weights are applied to multiple locations +in the input). + +Here is an example of a discrete convolution: + +.. figure:: conv_arithmetic_figures/numerical_no_padding_no_strides.* + :figclass: align-center + +The light blue grid is called the *input feature map*. A *kernel* (shaded area) +of value + +.. math:: + + \begin{pmatrix} + 0 & 1 & 2 \\ + 2 & 2 & 0 \\ + 0 & 1 & 2 + \end{pmatrix} + +slides across the input feature map. At each location, the product between each +element of the kernel and the input element it overlaps is computed and the +results are summed up to obtain the output in the current location. The final +output of this procedure is a matrix called *output feature map* (in green). + +This procedure can be repeated using different kernels to form as many output +feature maps (a.k.a. *output channels*) as desired. Note also that to keep the +drawing simple a single input feature map is being represented, but it is not +uncommon to have multiple feature maps stacked one onto another (an example of +this is what was referred to earlier as *channels* for images and sound clips). + +.. note:: + + While there is a distinction between convolution and cross-correlation from + a signal processing perspective, the two become interchangeable when the + kernel is learned. For the sake of simplicity and to stay consistent with + most of the machine learning literature, the term *convolution* will be + used in this tutorial. + +If there are multiple input and output feature maps, the collection of kernels +form a 4D array (``output_channels, input_channels, filter_rows, +filter_columns``). For each output channel, each input channel is convolved with +a distinct part of the kernel and the resulting set of feature maps is summed +elementwise to produce the corresponding output feature map. The result of this +procedure is a set of output feature maps, one for each output channel, that is +the output of the convolution. + + +The convolution depicted above is an instance of a 2-D convolution, but can be +generalized to N-D convolutions. For instance, in a 3-D convolution, the kernel +would be a *cuboid* and would slide across the height, width and depth of the +input feature map. + +The collection of kernels defining a discrete convolution has a shape +corresponding to some permutation of :math:`(n, m, k_1, \ldots, k_N)`, where + +.. math:: + + \begin{split} + n &\equiv \text{number of output feature maps},\\ + m &\equiv \text{number of input feature maps},\\ + k_j &\equiv \text{kernel size along axis $j$}. + \end{split} + +The following properties affect the output size :math:`o_j` of a convolutional +layer along axis :math:`j`: + +* :math:`i_j`: input size along axis :math:`j`, +* :math:`k_j`: kernel size along axis :math:`j`, +* :math:`s_j`: stride (distance between two consecutive positions of the + kernel) along axis :math:`j`, +* :math:`p_j`: zero padding (number of zeros concatenated at the beginning and + at the end of an axis) along axis `j`. + +For instance, here is a :math:`3 \times 3` kernel applied to a +:math:`5 \times 5` input padded with a :math:`1 \times 1` border of zeros using +:math:`2 \times 2` strides: + +.. figure:: conv_arithmetic_figures/numerical_padding_strides.* + :figclass: align-center + +The analysis of the relationship between convolutional layer properties is eased +by the fact that they don't interact across axes, i.e., the choice of kernel +size, stride and zero padding along axis :math:`j` only affects the output size +of axis :math:`j`. Because of that, this section will focus on the following +simplified setting: + +* 2-D discrete convolutions (:math:`N = 2`), +* square inputs (:math:`i_1 = i_2 = i`), +* square kernel size (:math:`k_1 = k_2 = k`), +* same strides along both axes (:math:`s_1 = s_2 = s`), +* same zero padding along both axes (:math:`p_1 = p_2 = p`). + +This facilitates the analysis and the visualization, but keep in mind that the +results outlined here also generalize to the N-D and non-square cases. + +Aesara terminology +================== + +Aesara has its own terminology, which differs slightly from the convolution +arithmetic guide's. Here's a simple conversion table for the two: + ++------------------+----------------------------------------------------------------------------------------------------+ +| Aesara | Convolution arithmetic | ++==================+====================================================================================================+ +| ``filters`` | 4D collection of kernels | ++------------------+----------------------------------------------------------------------------------------------------+ +| ``input_shape`` | (batch size (``b``), input channels (``c``), input rows (``i1``), input columns (``i2``)) | ++------------------+----------------------------------------------------------------------------------------------------+ +| ``filter_shape`` | (output channels (``c1``), input channels (``c2``), filter rows (``k1``), filter columns (``k2``)) | ++------------------+----------------------------------------------------------------------------------------------------+ +| ``border_mode`` | ``'valid'``, ``'half'``, ``'full'`` or (:math:`p_1`, :math:`p_2`) | ++------------------+----------------------------------------------------------------------------------------------------+ +| ``subsample`` | (``s1``, ``s2``) | ++------------------+----------------------------------------------------------------------------------------------------+ + +For instance, the convolution shown above would correspond to the following +Aesara call: + +.. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(1, 1, 5, 5), filter_shape=(1, 1, 3, 3), + border_mode=(1, 1), subsample=(2, 2)) + +Convolution arithmetic +====================== + +No zero padding, unit strides +----------------------------- + +The simplest case to analyze is when the kernel just slides across every +position of the input (i.e., :math:`s = 1` and :math:`p = 0`). +Here is an example for :math:`i = 4` and :math:`k = 3`: + +.. figure:: conv_arithmetic_figures/no_padding_no_strides.* + :figclass: align-center + +One way of defining the output size in this case is by the number of possible +placements of the kernel on the input. Let's consider the width axis: the kernel +starts on the leftmost part of the input feature map and slides by steps of one +until it touches the right side of the input. The size of the output will be +equal to the number of steps made, plus one, accounting for the initial position +of the kernel. The same logic applies for the height axis. + +More formally, the following relationship can be inferred: + +.. admonition:: Relationship 1 + + For any :math:`i` and :math:`k`, and for :math:`s = 1` and :math:`p = 0`, + + .. math:: + + o = (i - k) + 1. + + This translates to the following Aesara code: + + .. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2, k1, k2), + border_mode=(0, 0), subsample=(1, 1)) + # output.shape[2] == (i1 - k1) + 1 + # output.shape[3] == (i2 - k2) + 1 + +Zero padding, unit strides +-------------------------- + +To factor in zero padding (i.e., only restricting to :math:`s = 1`), let's +consider its effect on the effective input size: padding with :math:`p` zeros +changes the effective input size from :math:`i` to :math:`i + 2p`. In the +general case, Relationship 1 can then be used to infer the following +relationship: + +.. admonition:: Relationship 2 + + For any :math:`i`, :math:`k` and :math:`p`, and for :math:`s = 1`, + + .. math:: + + o = (i - k) + 2p + 1. + + This translates to the following Aesara code: + + .. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2, k1, k2), + border_mode=(p1, p2), subsample=(1, 1)) + # output.shape[2] == (i1 - k1) + 2 * p1 + 1 + # output.shape[3] == (i2 - k2) + 2 * p2 + 1 + +Here is an example for :math:`i = 5`, :math:`k = 4` and :math:`p = 2`: + +.. figure:: conv_arithmetic_figures/arbitrary_padding_no_strides.* + :figclass: align-center + +Special cases +------------- + +In practice, two specific instances of zero padding are used quite extensively +because of their respective properties. Let's discuss them in more detail. + +Half (same) padding +^^^^^^^^^^^^^^^^^^^ +Having the output size be the same as the input size (i.e., :math:`o = i`) can +be a desirable property: + +.. admonition:: Relationship 3 + + For any :math:`i` and for :math:`k` odd (:math:`k = 2n + 1, \quad n \in + \mathbb{N}`), :math:`s = 1` and :math:`p = \lfloor k / 2 \rfloor = n`, + + .. math:: + + \begin{split} + o &= i + 2 \lfloor k / 2 \rfloor - (k - 1) \\ + &= i + 2n - 2n \\ + &= i. + \end{split} + + This translates to the following Aesara code: + + .. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2, k1, k2), + border_mode='half', subsample=(1, 1)) + # output.shape[2] == i1 + # output.shape[3] == i2 + +This is sometimes referred to as *half* (or *same*) padding. Here is an example +for :math:`i = 5`, :math:`k = 3` and (therefore) :math:`p = 1`: + +.. figure:: conv_arithmetic_figures/same_padding_no_strides.* + :figclass: align-center + +Note that half padding also works for even-valued :math:`k` and for :math:`s > +1`, but in that case the property that the output size is the same as the input +size is lost. Some frameworks also implement the ``same`` convolution slightly +differently (e.g., in Keras :math:`o = (i + s - 1) // s`). + +Full padding +^^^^^^^^^^^^ + +While convolving a kernel generally *decreases* the output size with respect to +the input size, sometimes the opposite is required. This can be achieved with +proper zero padding: + +.. admonition:: Relationship 4 + + For any :math:`i` and :math:`k`, and for :math:`p = k - 1` and + :math:`s = 1`, + + .. math:: + + \begin{split} + o &= i + 2(k - 1) - (k - 1) \\ + &= i + (k - 1). + \end{split} + + This translates to the following Aesara code: + + .. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2, k1, k2), + border_mode='full', subsample=(1, 1)) + # output.shape[2] == i1 + (k1 - 1) + # output.shape[3] == i2 + (k2 - 1) + +This is sometimes referred to as *full* padding, because in this setting every +possible partial or complete superimposition of the kernel on the input feature +map is taken into account. Here is an example for :math:`i = 5`, :math:`k = 3` +and (therefore) :math:`p = 2`: + +.. figure:: conv_arithmetic_figures/full_padding_no_strides.* + :figclass: align-center + +No zero padding, non-unit strides +--------------------------------- + +All relationships derived so far only apply for unit-strided convolutions. +Incorporating non unitary strides requires another inference leap. To facilitate +the analysis, let's momentarily ignore zero padding (i.e., :math:`s > 1` and +:math:`p = 0`). Here is an example for :math:`i = 5`, :math:`k = 3` and :math:`s += 2`: + +.. figure:: conv_arithmetic_figures/no_padding_strides.* + :figclass: align-center + +Once again, the output size can be defined in terms of the number of possible +placements of the kernel on the input. Let's consider the width axis: the kernel +starts as usual on the leftmost part of the input, but this time it slides by +steps of size :math:`s` until it touches the right side of the input. The size +of the output is again equal to the number of steps made, plus one, accounting +for the initial position of the kernel. The same logic applies for the height +axis. + +From this, the following relationship can be inferred: + +.. admonition:: Relationship 5 + + For any :math:`i`, :math:`k` and :math:`s`, and for :math:`p = 0`, + + .. math:: + + o = \left\lfloor \frac{i - k}{s} \right\rfloor + 1. + + This translates to the following Aesara code: + + .. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2, k1, k2), + border_mode=(0, 0), subsample=(s1, s2)) + # output.shape[2] == (i1 - k1) // s1 + 1 + # output.shape[3] == (i2 - k2) // s2 + 1 + +The floor function accounts for the fact that sometimes the last +possible step does *not* coincide with the kernel reaching the end of the +input, i.e., some input units are left out. + +Zero padding, non-unit strides +------------------------------ + +The most general case (convolving over a zero padded input using non-unit +strides) can be derived by applying Relationship 5 on an effective input of size +:math:`i + 2p`, in analogy to what was done for Relationship 2: + +.. admonition:: Relationship 6 + + For any :math:`i`, :math:`k`, :math:`p` and :math:`s`, + + .. math:: + + o = \left\lfloor \frac{i + 2p - k}{s} \right\rfloor + 1. + + This translates to the following Aesara code: + + .. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2, k1, k2), + border_mode=(p1, p2), subsample=(s1, s2)) + # output.shape[2] == (i1 - k1 + 2 * p1) // s1 + 1 + # output.shape[3] == (i2 - k2 + 2 * p2) // s2 + 1 + +As before, the floor function means that in some cases a convolution will +produce the same output size for multiple input sizes. More specifically, if +:math:`i + 2p - k` is a multiple of :math:`s`, then any input size :math:`j = i ++ a, \quad a \in \{0,\ldots,s - 1\}` will produce the same output size. Note +that this ambiguity applies only for :math:`s > 1`. + +Here is an example for :math:`i = 5`, :math:`k = 3`, :math:`s = 2` and :math:`p += 1`: + +.. figure:: conv_arithmetic_figures/padding_strides.* + :figclass: align-center + +Here is an example for :math:`i = 6`, :math:`k = 3`, :math:`s = 2` and :math:`p += 1`: + +.. figure:: conv_arithmetic_figures/padding_strides_odd.* + :figclass: align-center + +Interestingly, despite having different input sizes these convolutions share the +same output size. While this doesn't affect the analysis for *convolutions*, +this will complicate the analysis in the case of *transposed convolutions*. + +Transposed convolution arithmetic +================================= + +The need for transposed convolutions generally arises from the desire to use a +transformation going in the opposite direction of a normal convolution, i.e., +from something that has the shape of the output of some convolution to +something that has the shape of its input while maintaining a connectivity +pattern that is compatible with said convolution. For instance, one might use +such a transformation as the decoding layer of a convolutional autoencoder or to +project feature maps to a higher-dimensional space. + +Once again, the convolutional case is considerably more complex than the +fully-connected case, which only requires to use a weight matrix whose shape +has been transposed. However, since every convolution boils down to an +efficient implementation of a matrix operation, the insights gained from the +fully-connected case are useful in solving the convolutional case. + +Like for convolution arithmetic, the dissertation about transposed convolution +arithmetic is simplified by the fact that transposed convolution properties +don't interact across axes. + +This section will focus on the following setting: + +* 2-D transposed convolutions (:math:`N = 2`), +* square inputs (:math:`i_1 = i_2 = i`), +* square kernel size (:math:`k_1 = k_2 = k`), +* same strides along both axes (:math:`s_1 = s_2 = s`), +* same zero padding along both axes (:math:`p_1 = p_2 = p`). + +Once again, the results outlined generalize to the N-D and non-square cases. + +Convolution as a matrix operation +--------------------------------- + +Take for example the convolution presented in the *No zero padding, unit +strides* subsection: + +.. figure:: conv_arithmetic_figures/no_padding_no_strides.* + :figclass: align-center + +If the input and output were to be unrolled into vectors from left to right, top +to bottom, the convolution could be represented as a sparse matrix +:math:`\mathbf{C}` where the non-zero elements are the elements :math:`w_{i,j}` +of the kernel (with :math:`i` and :math:`j` being the row and column of the +kernel respectively): + +.. math:: + + \begin{pmatrix} + w_{0,0} & 0 & 0 & 0 \\ + w_{0,1} & w_{0,0} & 0 & 0 \\ + w_{0,2} & w_{0,1} & 0 & 0 \\ + 0 & w_{0,2} & 0 & 0 \\ + w_{1,0} & 0 & w_{0,0} & 0 \\ + w_{1,1} & w_{1,0} & w_{0,1} & w_{0,0} \\ + w_{1,2} & w_{1,1} & w_{0,2} & w_{0,1} \\ + 0 & w_{1,2} & 0 & w_{0,2} \\ + w_{2,0} & 0 & w_{1,0} & 0 \\ + w_{2,1} & w_{2,0} & w_{1,1} & w_{1,0} \\ + w_{2,2} & w_{2,1} & w_{1,2} & w_{1,1} \\ + 0 & w_{2,2} & 0 & w_{1,2} \\ + 0 & 0 & w_{2,0} & 0 \\ + 0 & 0 & w_{2,1} & w_{2,0} \\ + 0 & 0 & w_{2,2} & w_{2,1} \\ + 0 & 0 & 0 & w_{2,2} \\ + \end{pmatrix}^T + +(*Note: the matrix has been transposed for formatting purposes.*) This linear +operation takes the input matrix flattened as a 16-dimensional vector and +produces a 4-dimensional vector that is later reshaped as the :math:`2 \times 2` +output matrix. + +Using this representation, the backward pass is easily obtained by transposing +:math:`\mathbf{C}`; in other words, the error is backpropagated by multiplying +the loss with :math:`\mathbf{C}^T`. This operation takes a 4-dimensional vector +as input and produces a 16-dimensional vector as output, and its connectivity +pattern is compatible with :math:`\mathbf{C}` by construction. + +Notably, the kernel :math:`\mathbf{w}` defines both the matrices +:math:`\mathbf{C}` and :math:`\mathbf{C}^T` used for the forward and backward +passes. + +Transposed convolution +---------------------- + +Let's now consider what would be required to go the other way around, i.e., map +from a 4-dimensional space to a 16-dimensional space, while keeping the +connectivity pattern of the convolution depicted above. This operation is known +as a *transposed convolution*. + +Transposed convolutions -- also called *fractionally strided convolutions* -- +work by swapping the forward and backward passes of a convolution. One way to +put it is to note that the kernel defines a convolution, but whether it's a +direct convolution or a transposed convolution is determined by how the forward +and backward passes are computed. + +For instance, the kernel :math:`\mathbf{w}` defines a convolution whose forward +and backward passes are computed by multiplying with :math:`\mathbf{C}` and +:math:`\mathbf{C}^T` respectively, but it *also* defines a transposed +convolution whose forward and backward passes are computed by multiplying with +:math:`\mathbf{C}^T` and :math:`(\mathbf{C}^T)^T = \mathbf{C}` respectively. + +.. note:: + + The transposed convolution operation can be thought of as the gradient of + *some* convolution with respect to its input, which is usually how + transposed convolutions are implemented in practice. + + Finally note that it is always possible to implement a transposed + convolution with a direct convolution. The disadvantage is that it usually + involves adding many columns and rows of zeros to the input, resulting in a + much less efficient implementation. + +Building on what has been introduced so far, this section will proceed somewhat +backwards with respect to the convolution arithmetic section, deriving the +properties of each transposed convolution by referring to the direct +convolution with which it shares the kernel, and defining the equivalent direct +convolution. + +No zero padding, unit strides, transposed +----------------------------------------- + +The simplest way to think about a transposed convolution is by computing the +output shape of the direct convolution for a given input shape first, and then +inverting the input and output shapes for the transposed convolution. + +Let's consider the convolution of a :math:`3 \times 3` kernel on a :math:`4 +\times 4` input with unitary stride and no padding (i.e., :math:`i = 4`, +:math:`k = 3`, :math:`s = 1` and :math:`p = 0`). As depicted in the convolution +below, this produces a :math:`2 \times 2` output: + +.. figure:: conv_arithmetic_figures/no_padding_no_strides.* + :figclass: align-center + +The transpose of this convolution will then have an output of shape :math:`4 +\times 4` when applied on a :math:`2 \times 2` input. + +Another way to obtain the result of a transposed convolution is to apply an +equivalent -- but much less efficient -- direct convolution. The example +described so far could be tackled by convolving a :math:`3 \times 3` kernel over +a :math:`2 \times 2` input padded with a :math:`2 \times 2` border of zeros +using unit strides (i.e., :math:`i' = 2`, :math:`k' = k`, :math:`s' = 1` and +:math:`p' = 2`), as shown here: + +.. figure:: conv_arithmetic_figures/no_padding_no_strides_transposed.* + :figclass: align-center + +Notably, the kernel's and stride's sizes remain the same, but the input of the +equivalent (direct) convolution is now zero padded. + +.. note:: + + Although equivalent to applying the transposed matrix, this visualization + adds a lot of zero multiplications in the form of zero padding. This is done + here for illustration purposes, but it is inefficient, and software + implementations will normally not perform the useless zero multiplications. + +One way to understand the logic behind zero padding is to consider the +connectivity pattern of the transposed convolution and use it to guide the +design of the equivalent convolution. For example, the top left pixel of the +input of the direct convolution only contribute to the top left pixel of the +output, the top right pixel is only connected to the top right output pixel, +and so on. + +To maintain the same connectivity pattern in the equivalent convolution it is +necessary to zero pad the input in such a way that the first (top-left) +application of the kernel only touches the top-left pixel, i.e., the padding +has to be equal to the size of the kernel minus one. + +Proceeding in the same fashion it is possible to determine similar observations +for the other elements of the image, giving rise to the following relationship: + +.. admonition:: Relationship 7 + + A convolution described by :math:`s = 1`, :math:`p = 0` and :math:`k` has an + associated transposed convolution described by :math:`k' = k`, :math:`s' = + s` and :math:`p' = k - 1` and its output size is + + .. math:: + + o' = i' + (k - 1). + + In other words, + + .. code-block:: python + + input = aesara.tensor.nnet.abstract_conv.conv2d_grad_wrt_inputs( + output, filters, filter_shape=(c1, c2, k1, k2), border_mode=(0, 0), + subsample=(1, 1)) + # input.shape[2] == output.shape[2] + (k1 - 1) + # input.shape[3] == output.shape[3] + (k2 - 1) + +Interestingly, this corresponds to a fully padded convolution with unit strides. + +Zero padding, unit strides, transposed +-------------------------------------- + +Knowing that the transpose of a non-padded convolution is equivalent to +convolving a zero padded input, it would be reasonable to suppose that the +transpose of a zero padded convolution is equivalent to convolving an input +padded with *less* zeros. + +It is indeed the case, as shown in here for :math:`i = 5`, :math:`k = 4` and +:math:`p = 2`: + +.. figure:: conv_arithmetic_figures/arbitrary_padding_no_strides_transposed.* + :figclass: align-center + +Formally, the following relationship applies for zero padded convolutions: + +.. _Relationship8: + +.. admonition:: Relationship 8 + + A convolution described by :math:`s = 1`, :math:`k` and :math:`p` has an + associated transposed convolution described by :math:`k' = k`, :math:`s' = + s` and :math:`p' = k - p - 1` and its output size is + + .. math:: + + o' = i' + (k - 1) - 2p. + + In other words, + + .. code-block:: python + + input = aesara.tensor.nnet.abstract_conv.conv2d_grad_wrt_inputs( + output, filters, filter_shape=(c1, c2, k1, k2), border_mode=(p1, p2), + subsample=(1, 1)) + # input.shape[2] == output.shape[2] + (k1 - 1) - 2 * p1 + # input.shape[3] == output.shape[3] + (k2 - 1) - 2 * p2 + +Special cases +------------- + +Half (same) padding, transposed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By applying the same inductive reasoning as before, it is reasonable to expect +that the equivalent convolution of the transpose of a half padded convolution +is itself a half padded convolution, given that the output size of a half +padded convolution is the same as its input size. Thus the following relation +applies: + +.. admonition:: Relationship 9 + + A convolution described by :math:`k = 2n + 1, \quad n \in \mathbb{N}`, + :math:`s = 1` and :math:`p = \lfloor k / 2 \rfloor = n` has an associated + transposed convolution described by :math:`k' = k`, :math:`s' = s` and + :math:`p' = p` and its output size is + + .. math:: + + \begin{split} + o' &= i' + (k - 1) - 2p \\ + &= i' + 2n - 2n \\ + &= i'. + \end{split} + + In other words, + + .. code-block:: python + + input = aesara.tensor.nnet.abstract_conv.conv2d_grad_wrt_inputs( + output, filters, filter_shape=(c1, c2, k1, k2), border_mode='half', + subsample=(1, 1)) + # input.shape[2] == output.shape[2] + # input.shape[3] == output.shape[3] + +Here is an example for :math:`i = 5`, :math:`k = 3` and (therefore) :math:`p = +1`: + +.. figure:: conv_arithmetic_figures/same_padding_no_strides_transposed.* + :figclass: align-center + +Full padding, transposed +^^^^^^^^^^^^^^^^^^^^^^^^ + +Knowing that the equivalent convolution of the transpose of a non-padded +convolution involves full padding, it is unsurprising that the equivalent of +the transpose of a fully padded convolution is a non-padded convolution: + +.. admonition:: Relationship 10 + + A convolution described by :math:`s = 1`, :math:`k` and :math:`p = k - 1` + has an associated transposed convolution described by :math:`k' = k`, + :math:`s' = s` and :math:`p' = 0` and its output size is + + .. math:: + + \begin{split} + o' &= i' + (k - 1) - 2p \\ + &= i' - (k - 1) + \end{split} + + In other words, + + .. code-block:: python + + input = aesara.tensor.nnet.abstract_conv.conv2d_grad_wrt_inputs( + output, filters, filter_shape=(c1, c2, k1, k2), border_mode='full', + subsample=(1, 1)) + # input.shape[2] == output.shape[2] - (k1 - 1) + # input.shape[3] == output.shape[3] - (k2 - 1) + +Here is an example for :math:`i = 5`, :math:`k = 3` and (therefore) :math:`p = +2`: + +.. figure:: conv_arithmetic_figures/full_padding_no_strides_transposed.* + :figclass: align-center + +No zero padding, non-unit strides, transposed +--------------------------------------------- + +Using the same kind of inductive logic as for zero padded convolutions, one +might expect that the transpose of a convolution with :math:`s > 1` involves an +equivalent convolution with :math:`s < 1`. As will be explained, this is a valid +intuition, which is why transposed convolutions are sometimes called +*fractionally strided convolutions*. + +Here is an example for :math:`i = 5`, :math:`k = 3` and :math:`s = 2`: + +.. figure:: conv_arithmetic_figures/no_padding_strides_transposed.* + :figclass: align-center + +This should help understand what fractional strides involve: zeros +are inserted *between* input units, which makes the kernel move around at +a slower pace than with unit strides. + +.. note:: + + Doing so is inefficient and real-world implementations avoid useless + multiplications by zero, but conceptually it is how the transpose of a + strided convolution can be thought of. + +For the moment, it will be assumed that the convolution is non-padded (:math:`p += 0`) and that its input size :math:`i` is such that :math:`i - k` is a multiple +of :math:`s`. In that case, the following relationship holds: + +.. _Relationship11: + +.. admonition:: Relationship 11 + + A convolution described by :math:`p = 0`, :math:`k` and :math:`s` and whose + input size is such that :math:`i - k` is a multiple of :math:`s`, has an + associated transposed convolution described by :math:`\tilde{i}'`, :math:`k' + = k`, :math:`s' = 1` and :math:`p' = k - 1`, where :math:`\tilde{i}'` is the + size of the stretched input obtained by adding :math:`s - 1` zeros between + each input unit, and its output size is + + .. math:: + + o' = s (i' - 1) + k. + + In other words, + + .. code-block:: python + + input = aesara.tensor.nnet.abstract_conv.conv2d_grad_wrt_inputs( + output, filters, filter_shape=(c1, c2, k1, k2), border_mode=(0, 0), + subsample=(s1, s2)) + # input.shape[2] == s1 * (output.shape[2] - 1) + k1 + # input.shape[3] == s2 * (output.shape[3] - 1) + k2 + +Zero padding, non-unit strides, transposed +------------------------------------------ + +When the convolution's input size :math:`i` is such that :math:`i + 2p - k` is a +multiple of :math:`s`, the analysis can extended to the zero padded case by +combining :ref:`Relationship 8 ` and +:ref:`Relationship 11 `: + +.. admonition:: Relationship 12 + + A convolution described by :math:`k`, :math:`s` and :math:`p` and whose + input size :math:`i` is such that :math:`i + 2p - k` is a multiple of + :math:`s` has an associated transposed convolution described by + :math:`\tilde{i}'`, :math:`k' = k`, :math:`s' = 1` and :math:`p' = k - p - + 1`, where :math:`\tilde{i}'` is the size of the stretched input obtained by + adding :math:`s - 1` zeros between each input unit, and its output size is + + .. math:: + + o' = s (i' - 1) + k - 2p. + + In other words, + + .. code-block:: python + + o_prime1 = s1 * (output.shape[2] - 1) + k1 - 2 * p1 + o_prime2 = s2 * (output.shape[3] - 1) + k2 - 2 * p2 + input = aesara.tensor.nnet.abstract_conv.conv2d_grad_wrt_inputs( + output, filters, input_shape=(b, c1, o_prime1, o_prime2), + filter_shape=(c1, c2, k1, k2), border_mode=(p1, p2), + subsample=(s1, s2)) + +Here is an example for :math:`i = 5`, :math:`k = 3`, :math:`s = 2` and :math:`p += 1`: + +.. figure:: conv_arithmetic_figures/padding_strides_transposed.* + :figclass: align-center + +The constraint on the size of the input :math:`i` can be relaxed by introducing +another parameter :math:`a \in \{0, \ldots, s - 1\}` that allows to distinguish +between the :math:`s` different cases that all lead to the same :math:`i'`: + +.. admonition:: Relationship 13 + + A convolution described by :math:`k`, :math:`s` and :math:`p` has an + associated transposed convolution described by :math:`a`, + :math:`\tilde{i}'`, :math:`k' = k`, :math:`s' = 1` and :math:`p' = k - p - + 1`, where :math:`\tilde{i}'` is the size of the stretched input obtained by + adding :math:`s - 1` zeros between each input unit, and :math:`a = (i + 2p - + k) \mod s` represents the number of zeros added to the top and right edges + of the input, and its output size is + + .. math:: + + o' = s (i' - 1) + a + k - 2p. + + In other words, + + .. code-block:: python + + o_prime1 = s1 * (output.shape[2] - 1) + a1 + k1 - 2 * p1 + o_prime2 = s2 * (output.shape[3] - 1) + a2 + k2 - 2 * p2 + input = aesara.tensor.nnet.abstract_conv.conv2d_grad_wrt_inputs( + output, filters, input_shape=(b, c1, o_prime1, o_prime2), + filter_shape=(c1, c2, k1, k2), border_mode=(p1, p2), + subsample=(s1, s2)) + +Here is an example for :math:`i = 6`, :math:`k = 3`, :math:`s = 2` and :math:`p += 1`: + +.. figure:: conv_arithmetic_figures/padding_strides_odd_transposed.* + :figclass: align-center + +Miscellaneous convolutions +========================== + +Dilated convolutions +-------------------- + +Those familiar with the deep learning literature may have noticed the term +"dilated convolutions" (or "atrous convolutions", from the French expression +*convolutions à trous*) appear in recent papers. Here we attempt to provide an +intuitive understanding of dilated convolutions. For a more in-depth description +and to understand in what contexts they are applied, see `Chen et al. (2014) +`_ [#]_; `Yu and Koltun (2015) +`_ [#]_. + +Dilated convolutions "inflate" the kernel by inserting spaces between the kernel +elements. The dilation "rate" is controlled by an additional hyperparameter +:math:`d`. Implementations may vary, but there are usually :math:`d - 1` spaces +inserted between kernel elements such that :math:`d = 1` corresponds to a +regular convolution. + +To understand the relationship tying the dilation rate :math:`d` and the output +size :math:`o`, it is useful to think of the impact of :math:`d` on the +*effective kernel size*. A kernel of size :math:`k` dilated by a factor +:math:`d` has an effective size + +.. math:: + + \hat{k} = k + (k - 1)(d - 1). + +This can be combined with Relationship 6 to form the following relationship for +dilated convolutions: + +.. admonition:: Relationship 14 + + For any :math:`i`, :math:`k`, :math:`p` and :math:`s`, and for a dilation + rate :math:`d`, + + .. math:: + + o = \left\lfloor \frac{i + 2p - k - (k - 1)(d - 1)}{s} \right\rfloor + 1. + + This translates to the following Aesara code using the ``filter_dilation`` + parameter: + + .. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2, k1, k2), + border_mode=(p1, p2), subsample=(s1, s2), filter_dilation=(d1, d2)) + # output.shape[2] == (i1 + 2 * p1 - k1 - (k1 - 1) * (d1 - 1)) // s1 + 1 + # output.shape[3] == (i2 + 2 * p2 - k2 - (k2 - 1) * (d2 - 1)) // s2 + 1 + +Here is an example for :math:`i = 7`, :math:`k = 3`, :math:`d = 2`, :math:`s = +1` and :math:`p = 0`: + +.. figure:: conv_arithmetic_figures/dilation.* + :figclass: align-center + +.. [#] Dumoulin, Vincent, and Visin, Francesco. "A guide to convolution + arithmetic for deep learning". arXiv preprint arXiv:1603.07285 (2016) +.. [#] Chen, Liang-Chieh, Papandreou, George, Kokkinos, Iasonas, Murphy, Kevin + and Yuille, Alan L. "Semantic image segmentation with deep convolutional + nets and fully connected CRFs". arXiv preprint arXiv:1412.7062 (2014). +.. [#] Yu, Fisher and Koltun, Vladlen. "Multi-scale context aggregation by + dilated convolutions". arXiv preprint arXiv:1511.07122 (2015) + +Grouped Convolutions +-------------------- + +In grouped convolutions with :math:`n` number of groups, the input and kernel +are split by their channels to form :math:`n` distinct groups. Each group +performs convolutions independent of the other groups to give :math:`n` +different outputs. These individual outputs are then concatenated together to give +the final output. A few examples of works using grouped convolutions are `Krizhevsky et al (2012) +`_ [#]_; +`Xie et at (2016) `_ [#]_. + +A special case of grouped convolutions is when :math:`n` equals the number of input +channels. This is called depth-wise convolutions or channel-wise convolutions. +depth-wise convolutions also forms a part of separable convolutions. + +An example to use Grouped convolutions would be: + + .. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2 / n, k1, k2), + border_mode=(p1, p2), subsample=(s1, s2), filter_dilation=(d1, d2), num_groups=n) + # output.shape[0] == b + # output.shape[1] == c1 + # output.shape[2] == (i1 + 2 * p1 - k1 - (k1 - 1) * (d1 - 1)) // s1 + 1 + # output.shape[3] == (i2 + 2 * p2 - k2 - (k2 - 1) * (d2 - 1)) // s2 + 1 + +.. [#] Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton. "ImageNet + Classification with Deep Convolutional Neural Networks". + Advances in Neural Information Processing Systems 25 (NIPS 2012) +.. [#] Saining Xie, Ross Girshick, Piotr Dollár, Zhuowen Tu, Kaiming He. + "Aggregated Residual Transformations for Deep Neural Networks". + arxiv preprint arXiv:1611.05431 (2016). + +Separable Convolutions +---------------------- + +Separable convolutions consists of two consecutive convolution operations. +First is depth-wise convolutions which performs convolutions separately for +each channel of the input. The output of this operation is the given as input +to point-wise convolutions which is a special case of general convolutions with +1x1 filters. This mixes the channels to give the final output. + +As we can see from this diagram, modified from `Vanhoucke(2014)`_ [#]_, depth-wise +convolutions is performed with :math:`c2` single channel depth-wise filters +to give a total of :math:`c2` output channels in the intermediate output where +each channel in the input separately performs convolutions with separate kernels +to give :math:`c2 / n` channels to the intermediate output, where :math:`n` is +the number of input channels. The intermediate output then performs point-wise +convolutions with :math:`c3` 1x1 filters which mixes the channels of the intermediate +output to give the final output. + +.. image:: conv_arithmetic_figures/sep2D.jpg + :align: center + +Separable convolutions is used as follows: + + .. code-block:: python + + output = aesara.tensor.nnet.separable_conv2d( + input, depthwise_filters, pointwise_filters, num_channels = c1, + input_shape=(b, c1, i1, i2), depthwise_filter_shape=(c2, 1, k1, k2), + pointwise_filter_shape=(c3, c2, 1, 1), border_mode=(p1, p2), + subsample=(s1, s2), filter_dilation=(d1, d2)) + # output.shape[0] == b + # output.shape[1] == c3 + # output.shape[2] == (i1 + 2 * p1 - k1 - (k1 - 1) * (d1 - 1)) // s1 + 1 + # output.shape[3] == (i2 + 2 * p2 - k2 - (k2 - 1) * (d2 - 1)) // s2 + 1 + +.. _Vanhoucke(2014): + http://scholar.google.co.in/scholar_url?url=http://vincent.vanhoucke.com/ + publications/vanhoucke-iclr14.pdf&hl=en&sa=X&scisig=AAGBfm0x0bgnudAqSVgZ + ALfu8uPjYOIWwQ&nossl=1&oi=scholarr&ved=0ahUKEwjLreLjr_DVAhULwI8KHWmHAM8QgAMIJigAMAA + +.. [#] Vincent Vanhoucke. "Learning Visual Representations at Scale", + International Conference on Learning Representations(2014). + + +Quick reference +=============== + +.. admonition:: Convolution relationship + + A convolution specified by + + * input size :math:`i`, + * kernel size :math:`k`, + * stride :math:`s`, + * padding size :math:`p`, + + has an output size given by + + .. math:: + + o = \left\lfloor \frac{i + 2p - k}{s} \right\rfloor + 1. + + In Aesara, this translates to + + .. code-block:: python + + output = aesara.tensor.nnet.conv2d( + input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2, k1, k2), + border_mode=(p1, p2), subsample=(s1, s2)) + # output.shape[2] == (i1 + 2 * p1 - k1) // s1 + 1 + # output.shape[3] == (i2 + 2 * p2 - k2) // s2 + 1 + +.. admonition:: Transposed convolution relationship + + A transposed convolution specified by + + * input size :math:`i`, + * kernel size :math:`k`, + * stride :math:`s`, + * padding size :math:`p`, + + has an output size given by + + .. math:: + + o = s (i - 1) + a + k - 2p, \quad a \in \{0, \ldots, s - 1\} + + where :math:`a` is a user-specified quantity used to distinguish between the + :math:`s` different possible output sizes. + + Unless :math:`s = 1`, Aesara requires that :math:`a` is implicitly passed + via an ``input_shape`` argument. For instance, if :math:`i = 3`, + :math:`k = 4`, :math:`s = 2`, :math:`p = 0` and :math:`a = 1`, then + :math:`o = 2 (3 - 1) + 1 + 4 = 9` and the Aesara code would look like + + .. code-block:: python + + input = aesara.tensor.nnet.abstract_conv.conv2d_grad_wrt_inputs( + output, filters, input_shape=(9, 9), filter_shape=(c1, c2, 4, 4), + border_mode='valid', subsample=(2, 2)) diff --git a/doc/tutorial/conv_arithmetic_figures/arbitrary_padding_no_strides.gif b/doc/tutorial/conv_arithmetic_figures/arbitrary_padding_no_strides.gif new file mode 100644 index 0000000000000000000000000000000000000000..9fbbaeaa5bcc1c5a53c19a22427b5aa632f16af3 GIT binary patch literal 366138 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�iN0F))M|>+>ebx#~-*#Yr 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

    k|PB)qW@pXd$$z_MR`DtA`oG_Xov!?03qvJud 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%0Dd~P<#4D6N zJ9_=f5eplVIK)3=wX7jP5F2@egsGOgwHsq3N~%xRhsX7itQ3!ZVlGv%OVrC1{YsP9 zs!OYjNBom(XI@`FF)ULN?T6|>*Ob1WsUSE(f<`KSBH#N*ln6mY9qK}xqJnK_^s*DG zQ+AQE%>=c1yQZ6Ov*+r-_qy3dZ?i7jR)4=iyV*LrSR$>-Nco~w>ilosuG*S7RoC_? zJo<`ehv>4kX5p`Q;mP2aO&{-_FAJ8Jz6FzQh}*Is+28%We9Ql=hJz61#I%{$=ZEL6 z_ABPg2^ng8{R1^~dh1nA4&AvpEbQki>}`6PjL|XCy#b;E^M|2yWpN3DFz_h(Kh|u(?N=1I?hc>6H+E;4souJ?l56y7=QT@U0)A8M9s6^&G@|wA+sbpFey*`Ib$_kb zUWxtnuA#oQ`xZ*fHIqqH&yPzoM;tzp0^Hzo7SGL(d~W!1E|Xvx z=>}Ik&vzT)C6($Q_?mq(3m#?}*Eg&%`5Ks}kk}qH_GNw_>`ztnZyuM(@^! zN(j&4yQY8s3{;IMBx-s7E#5lv^5y#Z&mWX_zmnmHMLF8EzA7LC-uv&JIrY=;R}vX< zj7vxHS`A~bfO>WoyMGVtDSpR?Gy0W||H;4L%CSU7ba9W!Gm!RvIHJF$x|rE#+97`| zZ1=jYj>5AyI$ag~fBjduLfLzmu9ek$>EXKj`fDYXQ~UqXMu+~b;`WeHiwdm~Lj`fJ z$<7-!vO{}^mFKH-Ro$Ror4)ijt9bfer|Ub+HJk5!1^Wz*EyULwMhq6+sLqv3sHSaO z7Ms5Zit_z!SIV_m(%bV!0wE)3Qh>y-z-37wzwU<2BmSE#^He3Z)l4`rK3