Keras自己模型上的转移学习

时间:2019-08-05 07:06:22

标签: keras transfer

我是转学的新手,我对如何为其设置代码有一些疑问。我也阅读了其他类似问题的帖子,但是这些都没有帮助我解决问题。

我已经在自己获得的大型数据集上从头开始训练了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)

我加载以前保存的重量。

但是,我不知道如何正确进行转学。有人可以针对以下问题提供一些建议吗?

  • 我应在哪些层上加载砝码?仅用于转换层还是其他?
  • 我必须为哪些图层设置trainable = false

谢谢您的指教!

1 个答案:

答案 0 :(得分:0)

使用具有相同结构的转移学习等同于在较新的数据上重新训练模型。

具有完全相同的结构,我想不出比以前训练中存储的更好的权重初始化,因此我将按照您当前的工作来加载所有权重。

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

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

在另一个极端,您只能重新训练最后一层。在这种情况下,trianing会快得多(所涉及的计算要少得多),但是您的模型受到约束,无法像以前那样非常相似地理解数据,这将导致对新数据有更肤浅的了解。

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