【问题标题】:Partially freeze a layer in Tensorflow部分冻结 Tensorflow 中的图层
【发布时间】:2022-07-25 03:27:26
【问题描述】:

我一直在寻找一种方法来部分冻结 Keras 模型中的图层。如果我要冻结一个图层,我只需将trainable 属性设置为False,如下所示:

model.get_layer('myLayer').trainable = False

但是,让我们以具有n 节点的密集层为例。有没有办法将第一个 i 节点设置为不可训练,让剩余的 n-i 可训练?

我无法在文档中找到任何内容。我能想到的唯一解决方案是:

  1. 保存我想要部分冻结的层x 的权重,
  2. 训练模型,使 x 层可训练,
  3. 在训练后重新加载我一开始不想训练的节点的权重。

有没有更好的方法来实现这一点?我也不确定这个策略是否完全正确。

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    使用model.layers[ ] 从经过训练的模型中获取层,使其不可训练。 例如,

    model=tf.keras.Sequential([
                       tf.keras.Input(shape=(28,28,1)),
                       tf.keras.layers.Conv2D(32,kernel_size=(3,3),activation='relu'),
                       tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
                       tf.keras.layers.Conv2D(64,kernel_size=(3,3),activation='relu'),
                       tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
                       tf.keras.layers.Flatten(),
                       tf.keras.layers.Dropout(0.5),
                       tf.keras.layers.Dense(10,activation='softmax')])
    

    训练此模型后,要使前六层不可训练,使它们连续并通过提供 input_shape 构建模型。

    model1=model.layers[:6]
    model1=tf.keras.Sequential(model1)
    model1.build((None,28,28,1)) 
    
    #Setting trainable = False will make them non-trainable.
    model1.trainable = False
    

    现在,您可以向要训练的模型添加层。

    model1.add(tf.keras.layers.Dense(10,activation='softmax'))
    

    请参考这个gist。谢谢。

    【讨论】:

      【解决方案2】:

      这是我想出的解决方案,尽管与我要求的有点不同,但可能对某人有用。

      我想要实现的是创建一个模型,我可以使用任务增量学习技术进行增量训练。没有使用这种方法的经验,我的第一个想法是:

      • “通常”训练前 N 个类,最后一个 Dense 层具有 N 个节点。
      • 添加额外的 N 个类,用 2N 个节点中的一个新的 Dense 层替换最后一个 Dense 层,并将旧层的先前训练的类权重复制到新层。

      由于必须逐步训练新类,我不得不冻结最后一层的前 N ​​个节点,同时训练新的 N 个节点:因此部分冻结单个层。

      但是,我意识到将节点添加到现有的最后一层并不是正确的方法(至少对于任务增量学习而言)。 我通过为每组新类的模型添加一个新头来解决它。所以最后一层。这种方法可以很简单地冻结旧的头,它们是适当的独立层,同时训练新的。

      这是对我想要实现的目标有效的解决方案,但它并没有真正回答“如何部分冻结单层”的问题,所以我不会接受这个作为答案。

      【讨论】:

        猜你喜欢
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多