如何在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
相关产品推荐
相关产品推荐

