当前位置: 首页 > 知识库问答 >
问题:

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

龚征
2023-03-14

为了将密集层转换为卷积层,我很难找到权重的正确映射。

这是我正在制作的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个答案

申屠无尘
2023-03-14

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

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]

棘手的部分是conv过滤器翻转[:,:,::-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度。刚刚为我自己解决了这个问题,希望这对你或其他人有所帮助。干杯。

 类似资料:
  • 我想做一些类似于完全卷积网络的论文(https://people.eecs.berkeley.edu/~jonlong/long\u shelhamer\u fcn。pdf)使用Keras。我有一个网络,它最终将要素地图展平,并将其穿过几个密集的图层。我想将权重从这样的网络加载到一个网络中,在这个网络中,密集层被等效卷积所取代。 Keras附带的VGG16网络可以作为一个示例,其中最后一个MaxP

  • 卷积神经网络有一个批量过滤器, 持续不断的在图片上滚动收集图片里的信息,每一次收集的时候都只是收集一小块像素区域, 然后把收集来的信息进行整理, 这时候整理出来的信息有了一些实际上的呈现, 比如这时的神经网络能看到一些边缘的图片信息, 然后在以同样的步骤, 用类似的批量过滤器扫过产生的这些边缘信息, 神经网络从这些边缘信息里面总结出更高层的信息结构,比如说总结的边缘能够画出眼睛,鼻子等等. 再经过

  • Convolution1D层 keras.layers.convolutional.Convolution1D(nb_filter, filter_length, init='uniform', activation='linear', weights=None, border_mode='valid', subsample_length=1, W_regularizer=None, b_regu

  • Conv1D层 keras.layers.convolutional.Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zero

  • 卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer)的神经网络。本章中介绍的卷积神经网络均使用最常见的二维卷积层。它有高和宽两个空间维度,常用来处理图像数据。本节中,我们将介绍简单形式的二维卷积层的工作原理。 二维互相关运算 虽然卷积层得名于卷积(convolution)运算,但我们通常在卷积层中使用更加直观的互相关(cro

  • [source] Conv1D keras.layers.Conv1D(filters, kernel_size, strides=1, padding='valid', data_format='channels_last', dilation_rate=1, activation=None, use_bias=True, kernel_initializer='glorot_uniform',