假设我有一个网络输出的两个特征图F1和F2。我想计算F1和F2的卷积。假设F1具有形状(1,C,10,10),F2具有形状(1,C,3,3),并且如果pad = 0,则所需结果应具有形状(1,1,8,8),stride = 1,dilate = 1.但是,这样我只能将batchsize设置为1,因为Convolution层的内核与batchsize无关,所以我不能用一批输出数据设置权重。
如何使用MXNet实现此目的?
我提出了一种使用mx.sym.Correlation的可能方法,但我无法通过阅读doc来了解关联运算符的计算方法。 或者,我可以将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
答案 0 :(得分:2)
您应该可以直接使用mx.nd
(使用batch_size> = 1)。
使用mx.nd.NDArray以便我们可以更轻松地检查数组,最终的输出形状是(batch_size,num_filters,8,8),即(1,1,8,8)。
您可以使用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)
。内核权重可以训练。
CreationDate: {
type: DataTypes.DATE,
allowNull: true
},