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

如何在Keras中加载预训练模型的网络结构(不含权重与偏置)

嘿,这个需求我经常碰到——想要复用成熟的模型结构,但完全用自己的数据从头训练,不想被预训练权重干扰对吧?我给你分两种场景详细说,刚好覆盖你提到的coco_mobilenet这类情况:

一、加载Keras内置基础模型(如MobileNet)只取结构

如果是Keras官方applications模块里的标准模型(比如MobileNet、ResNet这些),操作超简单:只需要在调用模型构造函数时,把weights参数设为None就行。这样Keras只会帮你创建模型的网络结构,不会下载或加载任何预训练权重。

举个例子:

from tensorflow.keras.applications import MobileNet

# 仅创建模型结构,不加载预训练权重
# input_shape要匹配你的输入数据尺寸,classes是你的任务类别数
model = MobileNet(weights=None, input_shape=(224, 224, 3), classes=10)

注意:这里的input_shape和classes要根据你自己的任务调整,和预训练模型的参数无关。

二、加载自定义/第三方预训练模型(如COCO预训练的MobileNet目标检测模型)

如果是你手里有一个已经训练好的模型文件(比如.h5格式的COCO预训练MobileNet SSD),想要保留结构但清空权重,可以用下面两种方法:

方法1:加载完整模型后重置权重

先加载带权重的模型,然后遍历每一层,用层自身的初始化器重新生成权重(这样能保持原模型设计的初始化逻辑,比用默认初始化更稳妥):

from tensorflow.keras.models import load_model

# 先加载带预训练权重的模型
full_model = load_model('coco_mobilenet_model.h5')

# 遍历所有层,重置权重和偏置
for layer in full_model.layers:
    # 重置核权重
    if hasattr(layer, 'kernel_initializer'):
        layer.kernel.assign(layer.kernel_initializer(shape=layer.kernel.shape))
    # 重置偏置(如果层有偏置的话)
    if hasattr(layer, 'bias_initializer') and layer.bias is not None:
        layer.bias.assign(layer.bias_initializer(shape=layer.bias.shape))

# 现在这个full_model就是结构保留、权重重置后的模型,直接拿来训练就行
full_model.compile(optimizer='adam', loss='your_loss_function', metrics=['accuracy'])

方法2:导出模型结构为JSON,再重新加载

这种方法更高效,因为不需要加载预训练权重到内存里,适合大模型:

from tensorflow.keras.models import load_model, model_from_json

# 先加载一次完整模型,导出结构为JSON
full_model = load_model('coco_mobilenet_model.h5')
model_structure_json = full_model.to_json()

# 从JSON加载纯结构,此时模型没有任何权重
model = model_from_json(model_structure_json)

# 注意:如果模型包含自定义层(比如目标检测模型的锚框层),需要把自定义层传入custom_objects参数
# model = model_from_json(model_structure_json, custom_objects={'CustomAnchorLayer': CustomAnchorLayer})

# 编译模型后即可开始训练
model.compile(optimizer='adam', loss='your_loss_function', metrics=['accuracy'])
额外小技巧:用clone_model快速复制结构

如果你用的是TensorFlow 2.x的SavedModel格式,或者想更简洁地复制结构,可以用tf.keras.models.clone_model函数——它会直接复制原模型的结构,权重自动用默认初始化器初始化:

from tensorflow.keras.models import load_model, clone_model

original_model = load_model('saved_model_directory')
# 克隆得到仅含结构的模型,权重全新初始化
new_model = clone_model(original_model)

# 编译后训练
new_model.compile(optimizer='adam', loss='your_loss_function', metrics=['accuracy'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:03:19