Keras 在自己的模型上进行迁移学习
Keras Transfer Learning on own model
我是迁移学习的新手,我对如何为其设置代码有一些疑问。我还阅读了其他有类似问题的帖子,但其中 none 帮助我解决了问题。
我在自己获得的大型数据集上从头开始训练了 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 Layer 还是也用于其他层?
- 我必须设置哪些图层
trainable = false
?
感谢任何建议!
使用具有相同结构的迁移学习相当于在更新的数据上重新训练您的模型。
具有完全相同的结构,我想不出比你从之前的训练中存储的更好的权重初始化,所以我会像你目前所做的那样加载所有权重。
要重新训练的层数的选择应基于您的特定数据。
在一种极端情况下,您可以重新训练整个模型(所有层)。在这种情况下,您将调整对数据的更深入理解以更好地适应新数据集。该过程的计算负担会很高,因为您必须计算所有梯度以更新所有参数。
另一个极端,你只能重新训练最后一层。在这种情况下,试验会快得多(涉及的计算少得多),但您的模型被限制以与以前非常相似的方式理解数据,这导致对新数据的理解更加肤浅。
通常,最佳选择介于两者之间,但这始终取决于您的特定数据。
我是迁移学习的新手,我对如何为其设置代码有一些疑问。我还阅读了其他有类似问题的帖子,但其中 none 帮助我解决了问题。
我在自己获得的大型数据集上从头开始训练了 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 Layer 还是也用于其他层?
- 我必须设置哪些图层
trainable = false
?
感谢任何建议!
使用具有相同结构的迁移学习相当于在更新的数据上重新训练您的模型。
具有完全相同的结构,我想不出比你从之前的训练中存储的更好的权重初始化,所以我会像你目前所做的那样加载所有权重。
要重新训练的层数的选择应基于您的特定数据。
在一种极端情况下,您可以重新训练整个模型(所有层)。在这种情况下,您将调整对数据的更深入理解以更好地适应新数据集。该过程的计算负担会很高,因为您必须计算所有梯度以更新所有参数。
另一个极端,你只能重新训练最后一层。在这种情况下,试验会快得多(涉及的计算少得多),但您的模型被限制以与以前非常相似的方式理解数据,这导致对新数据的理解更加肤浅。
通常,最佳选择介于两者之间,但这始终取决于您的特定数据。