【问题标题】:Editing layers in trained network keras在训练有素的网络 keras 中编辑图层
【发布时间】:2018-11-28 22:34:03
【问题描述】:

我有一个经过训练的图像去马赛克模型,我想通过移除超过指定层中的过滤器来使其更小。

例如,我想采用以下模型(摘录):

    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”。这两个模型将是相同的,除了我上面提到的层。 我正在寻找一种方法来初始化新模型,其中所有层的旧模型权重除外,已更改的层除外。然后将像往常一样训练新模型以收敛。

【问题讨论】:

  • 您的意思是在不重新训练模型的情况下进行更改吗?因为这基本上是不可能的。
  • 不,我将使用新图层进行再培训。它本质上是一个新模型,只是将所有其他层初始化为预训练的值。我已经在问题帖子中澄清了。

标签: tensorflow keras


【解决方案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)

【讨论】:

  • 谢谢,看起来很完美!只是为了我自己的目的澄清一下, transferLayers[...] 只是我想保留的任何层的索引?
  • @FCOS ,如果您创建完全相同的模型(只是更改过滤器的数量),是的,您可以使用层索引。但是,如果您更改更多内容,请参阅答案中的补充
  • 谢谢,太好了。结构将保持不变,纯粹是减少过滤器。非常感谢。
猜你喜欢
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2019-07-05
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多