如何使用已保存的训练权重提取Keras中训练好的U-Net模型中间层输出
解决Keras预训练U-Net提取中间层输出的方案
你之前操作失败的核心原因是手动构建的中间层输出模型和原始训练模型的层结构、层命名不一致,导致权重无法匹配。不需要单独构建新结构加载权重,直接基于完整加载的原始预训练模型生成提取模型即可,具体步骤如下:
- 步骤1:完整加载已训练的U-Net模型
如果是保存的包含结构和权重的完整模型,直接加载:
from keras.models import load_model # 若有自定义损失、自定义层,需通过custom_objects参数传入 original_model = load_model('trained_unet.h5', custom_objects={'your_custom_obj': your_custom_obj})
如果是单独保存的权重文件,先构建和训练时完全一致的完整U-Net结构,再加载权重:
# build_unet()为训练时使用的模型构建函数,保证层顺序、命名和训练时100%一致 original_model = build_unet() original_model.load_weights('unet_weights.h5')
- 步骤2:定位目标中间层
打印所有层的名称,找到你需要提取输出的目标层:
for layer in original_model.layers: print(layer.name)
- 步骤3:构建中间层提取模型
基于已加载权重的原始模型直接生成提取模型,无需重新加载权重:
from keras.models import Model # 替换为你找到的目标层名称 target_layer = original_model.get_layer('target_layer_name') extract_model = Model(inputs=original_model.input, outputs=target_layer.output)
- 步骤4:推理获取中间层输出
传入和训练时预处理规则一致的输入图像,即可得到输出:
# input_img预处理后维度应为(批次大小, 高度, 宽度, 通道数) intermediate_output = extract_model.predict(input_img)
注意:如果需要同时提取多个中间层的输出,将
outputs参数设置为层输出的列表即可:extract_model = Model(inputs=original_model.input, outputs=[layer1.output, layer2.output])
内容的提问来源于stack exchange,提问作者aronno
相关产品推荐
相关产品推荐

