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

9

我有一个问题,就是找不到正确的权重映射方法,以便将密集层转换为卷积层。

以下是我正在研究的 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个回答

7

还在寻找解决方案吗?这里就是:

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]

这里有一个棘手的问题,就是卷积过滤器要翻转 [:,:,::-1,::-1]。与其他框架(例如caffe)不同,Theano实现的是卷积而非相关操作。因此,在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度。我自己解决了这个问题,希望这对您或其他人有所帮助。干杯。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接