乐闻世界logo
搜索文章和话题

TensorFlow 中的迁移学习如何实现,有哪些预训练模型可用

2026年2月21日 17:07

TensorFlow 中的迁移学习如何实现,有哪些预训练模型可用

迁移学习是一种将预训练模型的知识迁移到新任务的技术,可以显著提高模型性能并减少训练时间。TensorFlow 提供了丰富的预训练模型和便捷的迁移学习工具。

迁移学习的基本概念

什么是迁移学习

迁移学习是指利用在一个大型数据集上预训练的模型,将其学到的特征提取能力迁移到新的、可能较小的数据集上。这种方法特别适用于:

  • 数据集较小的情况
  • 新任务与预训练任务相似
  • 需要快速获得良好性能的场景

迁移学习的优势

  • 减少训练时间
  • 提高模型性能
  • 降低对大量标注数据的需求
  • 利用已有的研究成果

TensorFlow Hub 预训练模型

使用 TensorFlow Hub 加载预训练模型

python
import tensorflow as tf import tensorflow_hub as hub # 加载预训练模型 model_url = "https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/4" pretrained_model = hub.KerasLayer(model_url, trainable=False) # 构建迁移学习模型 model = tf.keras.Sequential([ pretrained_model, tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')

常用的 TensorFlow Hub 模型

图像分类模型

python
# MobileNet V2 mobilenet_v2 = hub.KerasLayer( "https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/4" ) # EfficientNet efficientnet = hub.KerasLayer( "https://tfhub.dev/google/efficientnet/b0/feature-vector/1" ) # ResNet resnet = hub.KerasLayer( "https://tfhub.dev/tensorflow/resnet_50/feature_vector/1" ) # Inception inception = hub.KerasLayer( "https://tfhub.dev/google/imagenet/inception_v3/feature_vector/4" )

文本处理模型

python
# BERT bert = hub.KerasLayer( "https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/4" ) # Universal Sentence Encoder use = hub.KerasLayer( "https://tfhub.dev/google/universal-sentence-encoder/4" ) # ELMo elmo = hub.KerasLayer( "https://tfhub.dev/google/elmo/3" )

Keras Applications 预训练模型

使用 Keras Applications

python
from tensorflow.keras.applications import ( VGG16, VGG19, ResNet50, ResNet101, ResNet152, InceptionV3, InceptionResNetV2, MobileNet, MobileNetV2, DenseNet121, DenseNet169, DenseNet201, EfficientNetB0, EfficientNetB1, EfficientNetB2, NASNetMobile, NASNetLarge )

基本迁移学习流程

python
import tensorflow as tf from tensorflow.keras import layers, models from tensorflow.keras.applications import VGG16 # 加载预训练模型(不包括顶层) base_model = VGG16( weights='imagenet', include_top=False, input_shape=(224, 224, 3) ) # 冻结预训练层 base_model.trainable = False # 添加自定义分类头 model = models.Sequential([ base_model, layers.GlobalAveragePooling2D(), layers.Dense(256, activation='relu'), layers.Dropout(0.5), layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile( optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] ) # 训练模型 model.fit(train_dataset, epochs=10, validation_data=val_dataset)

微调预训练模型

python
# 解冻部分层进行微调 base_model.trainable = True # 冻结前面的层,只微调后面的层 for layer in base_model.layers[:15]: layer.trainable = False # 使用较低的学习率进行微调 model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), loss='sparse_categorical_crossentropy', metrics=['accuracy'] ) # 继续训练 model.fit(train_dataset, epochs=5, validation_data=val_dataset)

完整的迁移学习示例

图像分类迁移学习

python
import tensorflow as tf from tensorflow.keras import layers, models, applications import tensorflow_datasets as tfds # 加载数据集 dataset, info = tfds.load('cats_vs_dogs', with_info=True, as_supervised=True) train_data, test_data = dataset['train'], dataset['test'] # 数据预处理 def preprocess(image, label): image = tf.image.resize(image, (224, 224)) image = tf.keras.applications.resnet50.preprocess_input(image) return image, label train_data = train_data.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE) test_data = test_data.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE) # 加载预训练模型 base_model = applications.ResNet50( weights='imagenet', include_top=False, input_shape=(224, 224, 3) ) # 冻结预训练层 base_model.trainable = False # 构建模型 inputs = tf.keras.Input(shape=(224, 224, 3)) x = base_model(inputs, training=False) x = layers.GlobalAveragePooling2D()(x) x = layers.Dense(256, activation='relu')(x) x = layers.Dropout(0.5)(x) outputs = layers.Dense(1, activation='sigmoid')(x) model = models.Model(inputs, outputs) # 编译模型 model.compile( optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'] ) # 训练模型 history = model.fit( train_data, epochs=10, validation_data=test_data ) # 微调模型 base_model.trainable = True model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), loss='binary_crossentropy', metrics=['accuracy'] ) history_fine = model.fit( train_data, epochs=5, validation_data=test_data )

文本分类迁移学习

python
import tensorflow as tf import tensorflow_hub as hub from tensorflow.keras import layers, models # 加载预训练的 BERT 模型 bert_model = hub.KerasLayer( "https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/4", trainable=False ) # 构建模型 text_input = tf.keras.layers.Input(shape=(), dtype=tf.string, name='text') preprocessed_text = bert_model(text_input) x = layers.Dense(128, activation='relu')(preprocessed_text['pooled_output']) x = layers.Dropout(0.5)(x) output = layers.Dense(1, activation='sigmoid')(x) model = models.Model(text_input, output) # 编译模型 model.compile( optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'] ) # 准备数据 train_texts = ["This is a positive sentence", "This is a negative sentence"] train_labels = [1, 0] # 训练模型 model.fit( train_texts, train_labels, epochs=10, batch_size=32 )

高级迁移学习技巧

1. 特征提取

python
# 只使用预训练模型作为特征提取器 base_model = applications.VGG16(weights='imagenet', include_top=False) # 提取特征 def extract_features(images): features = base_model.predict(images) return features # 在提取的特征上训练简单的分类器 train_features = extract_features(train_images) classifier = tf.keras.Sequential([ layers.Dense(256, activation='relu'), layers.Dense(10, activation='softmax') ]) classifier.fit(train_features, train_labels, epochs=10)

2. 渐进式解冻

python
# 逐步解冻层 base_model = applications.ResNet50(weights='imagenet', include_top=False) base_model.trainable = False # 第一阶段:只训练分类头 model = build_model(base_model) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy') model.fit(train_data, epochs=5) # 第二阶段:解冻最后几层 base_model.trainable = True for layer in base_model.layers[:-10]: layer.trainable = False model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), loss='sparse_categorical_crossentropy' ) model.fit(train_data, epochs=5) # 第三阶段:解冻更多层 for layer in base_model.layers[:-20]: layer.trainable = False model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=1e-6), loss='sparse_categorical_crossentropy' ) model.fit(train_data, epochs=5)

3. 学习率调度

python
# 使用学习率调度器 initial_learning_rate = 1e-3 decay_steps = 1000 decay_rate = 0.9 lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay( initial_learning_rate, decay_steps, decay_rate ) optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule) model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy')

4. 混合精度训练

python
from tensorflow.keras import mixed_precision # 启用混合精度 policy = mixed_precision.Policy('mixed_float16') mixed_precision.set_global_policy(policy) # 构建模型 base_model = applications.EfficientNetB0(weights='imagenet', include_top=False) base_model.trainable = False model = tf.keras.Sequential([ base_model, layers.GlobalAveragePooling2D(), layers.Dense(10, activation='softmax') ]) # 使用损失缩放优化器 optimizer = mixed_precision.LossScaleOptimizer( tf.keras.optimizers.Adam() ) model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy')

5. 数据增强

python
# 添加数据增强 data_augmentation = tf.keras.Sequential([ layers.RandomFlip('horizontal'), layers.RandomRotation(0.2), layers.RandomZoom(0.2), layers.RandomContrast(0.1) ]) # 构建模型 inputs = tf.keras.Input(shape=(224, 224, 3)) x = data_augmentation(inputs) x = base_model(x, training=False) x = layers.GlobalAveragePooling2D()(x) outputs = layers.Dense(10, activation='softmax')(x) model = models.Model(inputs, outputs)

常见预训练模型对比

模型参数量特点适用场景
VGG16138M结构简单,易于理解学术研究,特征提取
ResNet5025M残差连接,深度网络通用图像分类
MobileNetV23.5M轻量级,适合移动端移动应用,实时推理
EfficientNetB05.3M高效的缩放策略平衡性能和效率
InceptionV323MInception 模块复杂图像分类
DenseNet1218M密集连接医学图像分析
BERT110MTransformer 架构自然语言处理
GPT-2117M-1.5B生成式预训练文本生成

迁移学习最佳实践

  1. 选择合适的预训练模型:根据任务需求选择模型
  2. 合理冻结层:初期冻结所有预训练层,逐步解冻
  3. 使用较低的学习率:微调时使用较小的学习率
  4. 数据增强:对小数据集进行数据增强
  5. 监控过拟合:使用验证集监控模型性能
  6. 逐步解冻:采用渐进式解冻策略
  7. 学习率调度:使用学习率衰减策略
  8. 混合精度训练:加速训练过程

迁移学习应用场景

1. 医学图像诊断

python
# 使用预训练的 ImageNet 模型进行医学图像分类 base_model = applications.DenseNet121(weights='imagenet', include_top=False) # 添加医学图像特定的分类头

2. 目标检测

python
# 使用预训练的骨干网络进行目标检测 backbone = applications.ResNet50(weights='imagenet', include_top=False) # 添加检测头(如 Faster R-CNN, YOLO 等)

3. 语义分割

python
# 使用预训练模型进行图像分割 base_model = applications.MobileNetV2(weights='imagenet', include_top=False) # 添加分割头(如 U-Net, DeepLabV3+ 等)

4. 文本分类

python
# 使用预训练的 BERT 模型进行文本分类 bert = hub.KerasLayer("https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/4") # 添加分类层

5. 情感分析

python
# 使用预训练的文本模型进行情感分析 use = hub.KerasLayer("https://tfhub.dev/google/universal-sentence-encoder/4") # 添加情感分类层

总结

TensorFlow 提供了丰富的迁移学习工具和预训练模型:

  • TensorFlow Hub:提供大量预训练模型
  • Keras Applications:内置经典预训练模型
  • 灵活的微调策略:支持各种微调方法
  • 广泛的应用场景:图像、文本、音频等

掌握迁移学习技术将帮助你快速构建高性能的深度学习模型。

标签:Tensorflow