如何使用mx.sym.Correlation?

How to use mx.sym.Correlation?

假设我有两个由网络输出的特征图 F1 和 F2。我想计算 F1 和 F2 的卷积。假设 F1 的形状为 (1, C, 10, 10),F2 的形状为 (1, C, 3, 3),如果 pad = 0,stride = 1 和 dilate = 1。但是,这样我只能将 batchsize 设置为 1,因为卷积层的内核与 batchsize 无关,所以我不能用一批输出数据设置权重。

如何使用 MXNet 实现这个?

我想出了一种使用 mx.sym.Correlation 的可能方法,但我无法通过阅读文档了解相关运算符的计算方式。 或者,我可以将mx.sym.Convolution层的权重设置为F2,将数据设置为F1吗?训练时会不会影响毕业生的传播?

[更新] 我想要做的就像下面的例子:

通过相关性,我的意思是 F2 就像一个在 F1 上滑动的相关核(或卷积核)。例如,

     1 1 1 2 2
F1 = 2 3 4 1 1
     0 0 0 2 3 

     0 1 0
F2 = 1 0 1
     0 1 0

那么,关联结果应该是

R = F1 * F2 = 7 5 9 

哪里

    1 1 1   0 1 0
7 = 2 3 4 x 1 0 1 = 1 + 2 + 4 + 0
    0 0 0   0 1 0

    1 1 2   0 1 0
5 = 3 4 1 x 1 0 1 = 1 + 3 + 1 + 0
    0 0 2   0 1 0

    1 2 2   0 1 0
9 = 4 1 1 x 1 0 1 = 2 + 4 + 1 + 2
    0 2 3   0 1 0

在上面的例子中,stride = 1, pad = 0, dilate = 0

您应该可以为此直接使用 mx.sym.Convolution(batch_size >= 1)。

使用 mx.nd.NDArray 以便我们可以更轻松地检查数组,最终输出形状为 (batch_size, num_filters, 8, 8),即 (1, 1, 8, 8).

您可以将 mx.nd 替换为 mx.sym 以使用 mx.sym.Symbol。内核权重将是可训练的。

import mxnet as mx
import numpy as np

num_batches = 1
num_channels = 3 # called C in question
num_filters = 1
kernel_shape = (3, 3)
data_shape = (10, 10)

data = mx.nd.random_uniform(shape=(num_batches, num_channels) + data_shape)
# called f1 in question
print("data (f1) shape: " + str(data.shape))
# >>>> data (f1) shape: (1, 3, 10, 10)

weights = mx.nd.random_uniform(shape=(num_filters, num_channels) + kernel_shape)
# called f2 in question
print("weights (f2) shape: " + str(weights.shape))
# >>>> weights (f2) shape: (1, 3, 3, 3)

conv = mx.nd.Convolution(data=data, weight=weights, num_filter=num_filters, kernel=kernel_shape, no_bias=True)
print("convolution output shape: " + str(conv.shape))
# >>>> convolution output shape: (1, 1, 8, 8)