在经过培训的网络keras中编辑图层

时间:2018-11-28 22:34:04

标签: tensorflow keras

我有一个训练有素的图像去马赛克模型,我想通过删除指定图层上的滤镜来使其更小。

例如,我想采用以下模型(练习):

    conv1 = Conv2D(32, self.kernel_size, activation='relu', padding='same')(chnl4_input)
    conv2 = Conv2D(32, self.kernel_size, strides=(2, 2), activation='relu', padding='same')(conv1)

    conv5 = Conv2D(64, self.kernel_size, activation='relu', padding='same')(conv2)
    conv6 = Conv2D(64, self.kernel_size, activation='relu', padding='same')(conv5)

    up1 = concatenate([UpSampling2D(size=(2, 2))(conv6), conv1], axis=-1)
    conv7 = Conv2D(64, self.kernel_size, activation='relu', padding='same')(up1)

我想将conv5和conv6层更改为此:

    conv1 = Conv2D(32, self.kernel_size, activation='relu', padding='same')(chnl4_input)
    conv2 = Conv2D(32, self.kernel_size, strides=(2, 2), activation='relu', padding='same')(conv1)

    conv5 = Conv2D(32, self.kernel_size, activation='relu', padding='same')(conv2)
    conv6 = Conv2D(32, self.kernel_size, activation='relu', padding='same')(conv5)

    up1 = concatenate([UpSampling2D(size=(2, 2))(conv6), conv1], axis=-1)
    conv7 = Conv2D(64, self.kernel_size, activation='relu', padding='same')(up1)

我环顾四周,但是没有看到任何明显的方法可以做到这一点。 I found this类似问题的示例,但是该解决方案专门提到新层必须具有与旧层相同数量的过滤器,这对我不利。

如果有人知道我该怎么做,我将非常感激。

[编辑]:为明确起见,我有一个现有模型,例如“模型A”。 我想创建一个新模型“ B型”。除了我上面提到的层之外,这两个模型将是相同的。 我正在寻找一种使用旧模型权重初始化所有层(除了已更改的层之外)的新模型的方法。然后,新模型将按照常规训练为收敛。

1 个答案:

答案 0 :(得分:1)

建立一个新模型(结构完全相同,只更改过滤器数量)并正确传递权重:

transferLayers = [0,1,2,3,4,8,9] #indices must be chosen by you properly

for layer in transferLayers:
    newModel.layers[layer].set_weights(oldModel.layers[layer].get_weights())

conv7会出现问题,该问题将接收不同的输入蚂蚁,因此其权重矩阵的大小也不同。

如果更改模型结构怎么办

然后,您可能应该创建两个索引列表,一个用于旧模型,一个用于新模型。

或者您可以重新创建旧模型,在其图层中添加名称:

  • 完全相同地重新创建训练模型,但在每个图层中都添加名称
  • 转移权重:namedTrainingModel.set_weights(unnamedTraininModel.get_weights())
  • 然后创建更改的模型,将相同的名称添加到未更改的图层,将新名称添加到更改的图层

按名称传输权重:

namedTrainingModel.save_weights('filename')    
changedModel.load_weights('filename', by_name=True)