旨在从一个任务上学到的特征能在新的,相似的任务上泛化。多用于少样本问题。
步骤
- 从先前训练过的模型中获取网络层
- 固定这些网络层的参数,以免在以后的训练中被破坏
- 在被fixed的网络的顶部添加一些新的可训练层
- 在新的数据集上训练新的网路层
- (可选)以小的学习率在新的数据集上更新全量网路达到fine-tuning。在这一步前,一定要确保新的网络层在新数据上收敛。否则,大gradient会将底层预先训练好的网络破坏。
还有一种方法是
利用预先训练好的网络作为特征抽取,将输出作为新模型的输入。
好处在于您只对新数据运行一次pretrained模型,而不是每个训练轮次都运行一次,所以它更快。
举例
在大数据量的ImageNet数据集预训练,之后在Kaggle “cats vs dogs” 分类数据上实现迁移
代码
fixed网络参数可通过将layer.trainable 设置成 False 完成,同时子层网络也变得不可训练。
举例
r_model = keras.Sequential(
[
keras.Input(shape=(5,)),
keras.layers.Dense(5, activation="sigmoid"),
keras.layers.Dense(5, activation="sigmoid"),
]
)
model = keras.Sequential(
[keras.Input(shape=(5,)), inner_model, keras.layers.Dense(5, activation="relu"),]
)
model.trainable = False # Freeze the outer model
assert inner_model.trainable == False # All layers in `model` are now frozen
assert inner_model.layers[0].trainable == False
参考
https://keras.io/guides/transfer_learning/