Python keras如何将密集层转换为卷积层

时间:2016-05-01 11:58:46

标签: python machine-learning convolution keras

我在找到权重的正确映射时遇到问题,以便将密集层转换为卷积层。

这是我正在研究的ConvNet的摘录:

model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))

在MaxPooling之后,输入的形状为(512,7,7)。我想将密集层转换为卷积层,使其看起来像这样:

model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Convolution2D(4096, 7, 7, activation='relu'))

但是,我不知道如何重新塑造权重以便将扁平权重正确映射到卷积层所需的(4096,512,7,7)结构? 现在,致密层的重量具有尺寸(25088,4096)。我需要以某种方式将这些25088元素映射到(512,7,7)维度,同时保留权重到神经元的正确映射。到目前为止,我已经尝试了多种重塑方式然后进行转置,但我无法找到正确的映射。

我一直在尝试的一个例子是:

weights[0] = np.transpose(np.reshape(weights[0],(512,7,7,4096)),(3,0,1,2))

但它没有正确映射权重。我通过比较两个模型的输出来验证映射是否正确。如果正确完成,我希望输出应该是相同的。

1 个答案:

答案 0 :(得分:6)

仍在寻找解决方案?这是:

new_conv_weights = dense_weights.transpose(1,0).reshape(new_conv_shape)[:,:,::-1,::-1]

在你的情况下:

weights[0] = weights[0].transpose(1,0).reshape((4096,512,7,7))[:,:,::-1,::-1]

棘手的部分是转换flipping [:,:,:: - 1,:: - 1]。 Theano确实卷积不相关(例如与caffe不同)。因此,在Keras过滤器中:

1 0
0 0

应用于矩阵:

1 2 3 4 5
6 7 8 9 0
1 2 3 4 5

结果为矩阵:

7 8 9 0 
2 3 4 5

不是这个,正如人们所期望的那样:

1 2 3 4
6 7 8 9

为了使工作按预期工作,您需要将滤镜旋转180度。刚刚为我自己解决了这个问题,希望这对你或他人都有帮助。欢呼声。