blob: 3f0f87f9f0ec004339706a330a68eeab8b5220e1 [file] [log] [blame]
``mx.nd.Correlation``
==========================================
Description
----------------------
Applies correlation to inputs.
The correlation layer performs multiplicative patch comparisons between two feature maps.
Given two multi-channel feature maps :math:`f_{1}, f_{2}`, with :math:`w`, :math:`h`, and :math:`c` being their width, height, and number of channels,
the correlation layer lets the network compare each patch from :math:`f_{1}` with each patch from :math:`f_{2}`.
For now we consider only a single comparison of two patches. The 'correlation' of two patches centered at :math:`x_{1}` in the first map and
:math:`x_{2}` in the second map is then defined as:
.. math::
c(x_{1}, x_{2}) = \sum_{o \in [-k,k] \times [-k,k]} <f_{1}(x_{1} + o), f_{2}(x_{2} + o)>
for a square patch of size :math:`K:=2k+1`.
Note that the equation above is identical to one step of a convolution in neural networks, but instead of convolving data with a filter, it convolves data with other
data. For this reason, it has no training weights.
Computing :math:`c(x_{1}, x_{2})` involves :math:`c * K^{2}` multiplications. Comparing all patch combinations involves :math:`w^{2}*h^{2}` such computations.
Given a maximum displacement :math:`d`, for each location :math:`x_{1}` it computes correlations :math:`c(x_{1}, x_{2})` only in a neighborhood of size :math:`D:=2d+1`,
by limiting the range of :math:`x_{2}`. We use strides :math:`s_{1}, s_{2}`, to quantize :math:`x_{1}` globally and to quantize :math:`x_{2}` within the neighborhood
centered around :math:`x_{1}`.
The final output is defined by the following expression:
.. math::
out[n, q, i, j] = c(x_{i, j}, x_{q})
where :math:`i` and :math:`j` enumerate spatial locations in :math:`f_{1}`, and :math:`q` denotes the :math:`q^{th}` neighborhood of :math:`x_{i,j}`.
Arguments
------------------
+----------------------------------------+------------------------------------------------------------+
| Argument | Description |
+========================================+============================================================+
| ``data1`` | NDArray-or-Symbol. |
| | |
| | Input data1 to the correlation. |
+----------------------------------------+------------------------------------------------------------+
| ``data2`` | NDArray-or-Symbol. |
| | |
| | Input data2 to the correlation. |
+----------------------------------------+------------------------------------------------------------+
| ``kernel.size`` | int (non-negative), optional, default=1. |
| | |
| | kernel size for Correlation must be an odd number |
+----------------------------------------+------------------------------------------------------------+
| ``max.displacement`` | int (non-negative), optional, default=1. |
| | |
| | Max displacement of Correlation |
+----------------------------------------+------------------------------------------------------------+
| ``stride1`` | int (non-negative), optional, default=1. |
| | |
| | stride1 quantize data1 globally |
+----------------------------------------+------------------------------------------------------------+
| ``stride2`` | int (non-negative), optional, default=1. |
| | |
| | stride2 quantize data2 within the neighborhood centered |
| | around |
| | data1 |
+----------------------------------------+------------------------------------------------------------+
| ``pad.size`` | int (non-negative), optional, default=0. |
| | |
| | pad for Correlation |
+----------------------------------------+------------------------------------------------------------+
| ``is.multiply`` | boolean, optional, default=1. |
| | |
| | operation type is either multiplication or subduction |
+----------------------------------------+------------------------------------------------------------+
Value
----------
``out`` The result mx.ndarray
Link to Source Code: http://github.com/apache/incubator-mxnet/blob/1.6.0/src/operator/correlation.cc#L198