【问题标题】:Keras Transfer Learning on own modelKeras 在自己的模型上迁移学习
【发布时间】:2023-03-19 04:53:01
【问题描述】:

我是迁移学习的新手,我在如何设置代码方面遇到了一些问题。我还阅读了其他类似问题的帖子,但这些都没有帮助我解决我的问题。

我已经在自己获得的大型数据集上从头开始训练 CNN。为此,我只将权重保存在 hdf5 文件中。

现在,我想使用相同的 CNN 架构来构建一个模型,用于对其他数据进行分类,但可用的数据较少。

这是新模型的架构:

# Input
inputs = Input(shape =(200, 1), name = 'ip_inputs')

# Feature Extraction
conv1 = Conv1D(40, 3, kernel_initializer = 'he_normal', activation = 'relu', strides = 2, padding = 'same', name = 'ip_C1') (inputs)
batchnorm1 = BatchNormalization(name = 'ip_BN1') (conv1)


# Flatten
flatten = Flatten(name = 'ip_F') (batchnorm1)

# Classification
dense1 = Dense(300, activation = 'relu', kernel_initializer = 'he_normal', name = 'ip_FC1') (flatten)
dropout1 = Dropout(0.4, name =  'D1') (dense1)
dense2 = Dense(300, activation = 'relu', kernel_initializer = 'he_normal', name = 'ip_FC2') (dropout1)
dropout2 = Dropout(0.3, name = 'D2') (dense2)

predictions = Dense(16, activation='softmax', kernel_initializer = 'he_normal', name = 'ip_FC6') (dropout2)

# Model
model = Model(inputs=inputs, outputs=predictions)

我从头开始训练的旧模型具有相似的架构,但输入和输出形状不同。

与

model.load_weights(weights_path, by_name = True)

我加载了我之前保存的权重。

但是,我不知道如何正确地进行迁移学习。有人可以就以下问题提出一些建议:

  • 我应该为哪些层加载权重?仅适用于 Conv 层还是也适用于其他层?
  • 我必须为哪些层设置trainable = false?

感谢您的建议!

【问题讨论】:

    标签: keras transfer


    【解决方案1】:

    使用具有相同结构的迁移学习相当于使用更新的数据重新训练您的模型。

    具有完全相同的结构,我想不出比您在之前的训练中存储的更好的权重初始化,所以我会像您当前所做的那样加载所有的权重。

    要重新训练的层数的选择应基于您的特定数据。

    在一个极端情况下,您可以重新训练整个模型(所有层)。在这种情况下,您将调整您对数据的更深层次的理解,以更好地适应新数据集。该过程的计算负担会很高,因为您必须计算所有梯度才能更新所有参数。

    在另一个极端,你只能重新训练最后一层。在这种情况下,trianing 会快得多(涉及的计算量要少得多),但您的模型受限于以与以前非常相似的方式理解数据,这导致对新数据的理解更加肤浅。

    通常,最佳选择介于两者之间,但这始终取决于您的特定数据。

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2021-06-03
      • 2018-12-22
      • 2020-05-13
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      相关资源
      最近更新 更多