22 Keras进阶之Fine-tuning
系列进度
Keras 入门 · 第 22 / 28 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
Fine-tuning 是谨慎地继续训练预训练模型。学习率要低,解冻要少,验证集要盯紧。
我会先保存微调前模型,再逐步解冻。微调变差时能回滚,才敢做更深层调整。
在上一节中,我们探讨了如何利用自定义回调函数来增强Keras模型的训练过程。这一节,我们将深入讨论Fine-tuning,一种在迁移学习中常用的技术。Fine-tuning涉及到对预训练模型进行微调,以适应新的任务或数据集。
什么是Fine-tuning?
Fine-tuning是一种迁移学习的方法,其中我们首先在一个大型数据集(通常是类似于ImageNet的数据库)上训练一个深度学习模型,以获得良好的特征表示。然后,我们将在特定任务上对该模型进行微调,以改善在该任务上的性能。
做 Keras Fine-tuning 时,先看预训练模型、冻结层、自定义分类头、学习率、数据增强和验证曲线。
Fine-tuning的过程包括以下几步:
- 加载预训练的模型。
- 冻结某些层(通常是底层),保持其权重不变。
- 修改模型的最后几层以适应新的任务。
- 使用新的数据集对模型进行训练,以优化新的层的权重。
案例:Fine-tuning预训练的VGG16模型
我们将使用Keras中的VGG16模型来演示Fine-tuning的过程。该模型在ImageNet数据集上进行预训练。
《Keras进阶之Fine-tuning》可以按“场景、概念、动作、结果”来读。先把这四件事对齐,再回到正文里的参数、代码或流程。
步骤1:加载预训练模型
from keras.applications import VGG16
# 加载VGG16模型,包含预训练的权重,不包含顶部的全连接层
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
步骤2:冻结底层
我们通常会冻结模型的底层,以保持这些层从原始任务中学到的图像特征。
for layer in base_model.layers:
layer.trainable = False
步骤3:添加自定义层
在预训练模型的顶部添加自定义层以适应我们的特定任务。例如,如果我们想要对图像进行分类,我们可能会添加几个全连接层。
from keras import models, layers
# 创建新的模型
model = models.Sequential()
# 添加预训练模型的底层
model.add(base_model)
# 添加自定义层
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(10, activation='softmax')) # 假设我们有10个分类
步骤4:编译模型
在编译模型时,我们可以选择合适的优化器和损失函数。
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
步骤5:训练模型
使用我们的新数据集对模型进行训练,但只训练自定义添加的层。
from keras.preprocessing.image import ImageDataGenerator
# 定义数据生成器
train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'data/train',
target_size=(224, 224),
batch_size=32,
class_mode='categorical'
)
# 训练模型
model.fit(train_generator, epochs=10)
重要注意事项
在Fine-tuning中,一个重要的超参数是学习率。通常情况下,使用较小的学习率进行微调,以防止破坏预训练的权重。
from keras.optimizers import Adam
# 使用较小的学习率进行微调
model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
评估模型
Fine-tuning后,我们可以使用验证集来评估模型的性能。
# 使用验证数据生成器
validation_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = validation_datagen.flow_from_directory(
'data/validation',
target_size=(224, 224),
batch_size=32,
class_mode='categorical'
)
# 评估模型
loss, accuracy = model.evaluate(validation_generator)
print(f'Loss: {loss}, Accuracy: {accuracy}')
学完《Keras进阶之Finetuning》后,不妨换一个自己的场景试一次,重点观察输入、处理和输出是否能对应起来。
如果想把《Keras进阶之Finetuning》用到自己的任务里,可以先缩小场景,只验证一个最关键的判断点。
结论
通过以上步骤,我们可以成功实现Keras中预训练模型的Fine-tuning,以提高特定任务上的性能。Fine-tuning使我们能够充分利用现有的知识并为新任务减少训练时间和数据需求。
在下一节中,我们将探索如何在TensorFlow中使用Keras,进一步拓展我们对Keras框架的理解和应用。希望你在Fine-tuning过程中能有良好的体验!
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
Keras进阶之Fine-tuning适合谁读?
这是 Keras 入门 系列第 22 / 28 篇,适合正在学习Keras 入门,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇Keras 入门教程要多久?
按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读