如何使用mx.sym.Correlation?

时间:2017-11-05 14:28:55

标签: mxnet

假设我有一个网络输出的两个特征图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

1 个答案:

答案 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
},