迁移学习(Transfer Learning)是一种利用源任务已学知识来帮助目标任务学习的机器学习方法。
其基本思想是:
- 选择一个预训练模型,该模型在大规模数据集上已经训练好,具有较强的泛化能力。
- 利用预训练模型所学到的知识来帮助新任务学习。可以通过分层冻结、微调等方式实现。
- 添加新层来适应新任务。可以添加分类层来实现新分类任务。
- 结合新数据 fine-tune 整个模型。继续训练以提高新任务的性能。
举例来说:
假设我们要训练一个模型来对狗和猫图像进行分类。若直接从头开始训练,将需要大量标注数据集。
而利用迁移学习,我们可以:
- 选择在 ImageNet 上预训练的 VGG16 模型。该模型已经学到泛化能力很强的图像特征。
- 冻结 VGG16 的前几层,添加新的分类层来进行二分类(狗和猫)。
- 利用狗和猫图像仅训练添加的分类层。此时 benefitedVGG16 学到的特征。
- 若性能不足,解冻更多 VGG16 层,对整体模型进行 fine-tune。这将基于狗和猫图像进一步优化特征。
- 得到最终分类模型,其利用迁移学习显著减少了数据集需求,并获得更优的性能。
实现代码示例:
python
# 选择预训练模型
vgg16 = VGG16(weights='imagenet', include_top=False)
# 添加分类层
x = vgg16.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(2, activation='softmax')(x)
model = Model(inputs=vgg16.input, outputs=predictions)
# 冻结前 8 层
for layer in vgg16.layers[:8]:
layer.trainable = False
# 编译模型
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
# 仅训练顶层分类层
model.fit(train_data, train_labels, epochs=10, validation_data=(valid_data, valid_labels))
# 解冻更多层并 fine-tune
for layer in vgg16.layers[8:]:
layer.trainable = True
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_data, train_labels, epochs=30, validation_data=(valid_data, valid_labels))
# 评估模型性能
model.evaluate(test_data, test_labels)