使用 VGG16 和 ResNet50 作为基础模型
keras.applications.VGG16(weights='imagenet', include_top=False),以及添加自定义顶层。
使用 VGG16 和 ResNet50 作为基础模型 是 CoddyKit 上的免费 Learn AI with Python 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn AI with Python 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn AI with Python 课程共包含 4 节课。
Keras 应用模块
tf.keras.applications提供数十种预训练架构,您只需一行代码即可下载。两个经典架构是VGG16(由简单的 3x3 卷积堆叠而成,层数很深)和ResNet50(使用残差连接,层数更深且准确率更高)。
将 VGG16 作为基础网络加载
加载带有 ImageNet 权重但不包含分类头的 VGG16,以便添加您自己的分类头。
from tensorflow.keras.applications import VGG16
base = VGG16(
weights="imagenet", # download pretrained weights
include_top=False, # drop the 1000-class classifier
input_shape=(224, 224, 3) # standard ImageNet input size
)理解参数
weights="imagenet":加载预训练权重,而不是随机权重。include_top=False:移除原始的 Dense 分类器,以便添加您自己的分类器。input_shape=(224,224,3):高度、宽度以及 3 个 RGB 通道。
设置 include_top=False 正是使模型能够复用于新任务的关键。
冻结基础网络
设置 base.trainable = False,使预训练卷积权重在第一阶段训练期间保持不变。只有您新建的分类头会进行学习。
base.trainable = False
print(len(base.trainable_weights)) # -> 0 when frozenGlobalAveragePooling2D
基础网络会输出类似 (7, 7, 512) 的三维特征图。GlobalAveragePooling2D会在空间网格上对每个通道求平均,将其压缩为每个通道一个向量,此处向量长度为 512。
它替代了庞大的 Flatten + Dense 结构,大幅减少参数并降低过拟合。
from tensorflow.keras.layers import GlobalAveragePooling2D
# (batch, 7, 7, 512) -> (batch, 512)
pooled = GlobalAveragePooling2D()(base.output)添加 Dense 输出头
添加一个大小与类别数量相匹配的 Dense 层。多分类任务使用 softmax,二分类任务使用 sigmoid。
from tensorflow.keras import layers, Model
x = base.output
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.3)(x)
outputs = layers.Dense(10, activation="softmax")(x)
model = Model(inputs=base.input, outputs=outputs)切换到 ResNet50
ResNet50 使用相同的接口。它的残差(跳跃)连接使模型能够在不出现梯度消失的情况下训练得更深,通常在速度相近的情况下比 VGG16 获得更高的 ImageNet 准确率。
from tensorflow.keras.applications import ResNet50
base = ResNet50(
weights="imagenet",
include_top=False,
input_shape=(224, 224, 3)
)
base.trainable = FalseVGG16 与 ResNet50
- VGG16:约 1.38 亿个参数,简单统一的 3x3 堆叠,占用内存较多,易于理解。
- ResNet50:约 2500 万个参数,使用残差块,层数更深,通常准确率更高且更加轻量。
对于大多数现代迁移学习任务,ResNet50 是更强的默认选择。
匹配预处理
每个模型系列都有自己的 preprocess_input。VGG16 会减去 RGB 值的均值,而 ResNet50 使用类似 Caffe 风格的缩放方式。请始终导入与您的基础网络匹配的版本。
from tensorflow.keras.applications.resnet50 import preprocess_input
x = preprocess_input(image_batch) # required for correct results编译模型
基础网络冻结后,请使用常规优化器调用 compile,并训练分类头。
model.compile(
optimizer="adam",
loss="categorical_crossentropy",
metrics=["accuracy"]
)
model.fit(train_ds, validation_data=val_ds, epochs=10)检查架构
调用 model.summary(),确认基础网络已被冻结(不可训练参数数量较大),并且只有分类头可训练。这项健全性检查可以及早发现设置错误。
model.summary()
# Look at "Trainable params" vs "Non-trainable params"快速检查
请检查您对使用 Keras 构建迁移学习模型的掌握程度。
回顾
您使用 weights="imagenet"、include_top=False 和 input_shape=(224,224,3) 加载了VGG16和ResNet50,使用 base.trainable=False 冻结了基础网络,使用GlobalAveragePooling2D汇聚特征,并添加了 Dense 输出头。
ResNet50 是更强的默认选择。接下来:解冻层以进行微调。
常见问题解答
「使用 VGG16 和 ResNet50 作为基础模型」课时是免费的吗?
是的 — 「使用 VGG16 和 ResNet50 作为基础模型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn AI with Python 课程的其余内容,请升级到 CoddyKit PRO。 Learn AI with Python 课程共包含 4 节课。
「使用 VGG16 和 ResNet50 作为基础模型」这节课中我会学到什么?
keras.applications.VGG16(weights='imagenet', include_top=False),以及添加自定义顶层。 你通过在浏览器中直接运行的动手代码来练习 Learn AI with Python,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn AI with Python 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn AI with Python 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 VGG16 和 ResNet50 作为基础模型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn AI with Python 课中编写并运行代码吗?
能。每节 Learn AI with Python 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 迁移学习的概念与策略
- 使用 VGG16 和 ResNet50 作为基础模型
- 微调:解冻与重新训练
- 用于边缘部署的 MobileNet 与 EfficientNet