You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras中微调VGG16时冻结/解冻层的逻辑疑问

Keras微调VGG16时两种训练层设置方式的差异原因

我在使用Keras的VGG16进行卷积神经网络微调时,想要实现冻结除最后3层外的所有层的效果。

第一种写法可以正常生效:

conv_base.trainable = True
for layer in conv_base.layers[:-4]:
    layer.trainable = False

但换成仅单独设置最后3层为可训练的写法时,却无法达到预期效果:

for layer in conv_base.layers[-3:]:
    layer.trainable = True

原因分析

核心问题在于Keras中层的trainable属性存在继承优先级:

  1. 加载预训练的VGG16时,默认整个conv_base(VGG16的基础模型)的trainable属性是False,这意味着所有子层都会被默认冻结,无论子层自身的trainable设置是什么。
  2. 第一种写法先将conv_base.trainable = True,解除了父级的冻结限制,此时所有子层的trainable会默认继承True状态;之后再手动冻结倒数第4层及之前的所有层,最后3层自然保持可训练状态,符合需求。
  3. 第二种写法没有修改conv_base的trainable状态,始终是默认的False。这时即使单独将最后3层的trainable设为True,父级的不可训练设置会覆盖子层的配置,这些层依然会被冻结,所以无法生效。

验证方式

你可以打印每一层的实际生效状态来确认:

# 查看conv_base的整体可训练状态
print(conv_base.trainable)
# 查看每一层的可训练状态及实际生效状态
for layer in conv_base.layers:
    print(f"层名称: {layer.name}, 自身trainable: {layer.trainable}, 实际生效trainable: {layer.trainable and conv_base.trainable}")

内容的提问来源于stack exchange,提问作者Osama Abuhamdan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:54:55