什么是迁移学习?实例讲解

迁移学习(Transfer Learning)是一种利用源任务已学知识来帮助目标任务学习的机器学习方法。

其基本思想是:

  1. 选择一个预训练模型,该模型在大规模数据集上已经训练好,具有较强的泛化能力。
  2. 利用预训练模型所学到的知识来帮助新任务学习。可以通过分层冻结、微调等方式实现。
  3. 添加新层来适应新任务。可以添加分类层来实现新分类任务。
  4. 结合新数据 fine-tune 整个模型。继续训练以提高新任务的性能。

举例来说:
假设我们要训练一个模型来对狗和猫图像进行分类。若直接从头开始训练,将需要大量标注数据集。

而利用迁移学习,我们可以:

  1. 选择在 ImageNet 上预训练的 VGG16 模型。该模型已经学到泛化能力很强的图像特征。
  2. 冻结 VGG16 的前几层,添加新的分类层来进行二分类(狗和猫)。
  3. 利用狗和猫图像仅训练添加的分类层。此时 benefitedVGG16 学到的特征。
  4. 若性能不足,解冻更多 VGG16 层,对整体模型进行 fine-tune。这将基于狗和猫图像进一步优化特征。
  5. 得到最终分类模型,其利用迁移学习显著减少了数据集需求,并获得更优的性能。

实现代码示例:

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)