【问题标题】:Python keras how to transform a dense layer into a convolutional layerPython keras如何将密集层转换为卷积层
【发布时间】:2016-08-26 06:30:07
【问题描述】:

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

这是我正在研究的 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))

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

【问题讨论】:

    标签: python machine-learning convolution keras


    【解决方案1】:

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

    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]。 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 度。刚刚为自己解决了这个问题,希望这对您或其他人有所帮助。干杯。

    【讨论】:

      猜你喜欢
      • 2017-04-30
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多