使用预存瓶颈值的迁移学习:完整模型推理的正确实现方式
如何组合预训练基础模型与瓶颈训练的顶层模型进行推理?
你找对了核心方向,就是把预训练的基础模型和训练好的顶层模型拼接起来,让基础模型的输出直接作为顶层模型的输入,构建一个端到端的推理模型。这种方式既复用了瓶颈训练时节省的时间,又能实现从原始图像到最终预测的完整流程,而且不需要冻结基础层(毕竟我们只是用它做前向传播,不涉及训练)。
具体实现步骤
下面是完整的代码示例,一步步来:
加载预训练的基础模型
保持和你生成瓶颈值时一致的配置:include_top=False,使用ImageNet预训练权重:from keras.applications.xception import Xception base_model = Xception(weights='imagenet', include_top=False)加载训练好的顶层模型
就是你用瓶颈值训练并保存的那个小型模型:from keras.models import load_model # 替换成你的模型实际保存路径 loaded_top_model = load_model('path/to/your/saved_top_model.h5')小提示:如果训练时用了自定义层、自定义损失或指标,加载时需要通过
custom_objects参数指定,比如load_model(..., custom_objects={'MyCustomLayer': MyCustomLayer})。拼接两个模型,构建完整推理模型
把基础模型的输出直接传入顶层模型,创建新的端到端模型:from keras.models import Model # 获取基础模型的输出特征(也就是你之前保存的瓶颈值对应的特征) base_model_output = base_model.output # 将基础模型的输出作为顶层模型的输入,得到最终预测结果 final_predictions = loaded_top_model(base_model_output) # 构建完整模型:输入是原始图像,输出是最终分类结果 full_inference_model = Model(inputs=base_model.input, outputs=final_predictions)
推理示例
现在你可以直接用这个完整模型处理原始图像了,记得遵循Xception要求的预处理规则:
from keras.applications.xception import preprocess_input import numpy as np from PIL import Image # 加载并预处理图像(Xception要求输入尺寸至少71x71,通常用299x299) img = Image.open('test_image.jpg').resize((299, 299)) img_array = np.expand_dims(np.array(img), axis=0) # 增加batch维度 preprocessed_img = preprocess_input(img_array) # 执行推理 predictions = full_inference_model.predict(preprocessed_img) # 解析预测结果,比如取概率最高的类别 predicted_class = np.argmax(predictions, axis=1)[0]
为什么这种方式有效?
- 基础模型的输出形状和你训练顶层模型时的输入形状(
bottleneck_shape)完全匹配,所以可以直接对接。 - 顶层模型的权重已经通过瓶颈值训练完成,不需要再调整;基础模型保持预训练权重,也不需要修改。
- 和冻结基础层训练完整模型的方式相比,你在训练阶段已经通过瓶颈值节省了大量计算时间,推理阶段这个组合模型的效果和直接训练完整模型完全一致,但不需要重复完整训练流程。
内容的提问来源于stack exchange,提问作者Moondra
相关产品推荐
相关产品推荐

