如何使用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)
假设我有两个由网络输出的特征图 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)