加载Keras模型后无法访问model.output的问题求助
解决加载Keras模型后无法访问
model.output的问题 问题根源
加载保存后的Keras模型时,模型的计算图尚未完成实例化——因为没有输入数据触发过前向传播,所以model.output无法获取到已定义的输出张量,进而抛出ValueError: The layer sequential has never been called and thus has no defined output异常。而训练/构建后未保存的模型,因为已经执行过前向传播,输出张量已完成初始化,所以能正常访问。
解决方案
加载模型后,先传入一个与模型输入形状匹配的占位数据运行一次前向传播,触发模型计算图的初始化,之后就能正常访问model.output了。
测试代码修改示例
针对你提供的精简测试代码,修改如下:
import os import keras.models import numpy as np top_dir = '~/PycharmProjects/CIFAKE/data' model_file = top_dir + os.sep + "keras_model.keras" # 加载模型 model = keras.models.load_model(model_file) # 根据Xception默认输入形状生成占位数据(batch_size=1,输入尺寸299*299*3) dummy_input = np.random.rand(1, 299, 299, 3) model.predict(dummy_input) # 运行前向传播,完成模型输出初始化 # 此时可正常访问model.output model_outputs = model.output
Grad CAM场景代码修改示例
针对你的Grad CAM实现需求,调整后代码如下:
# 加载模型 model = keras.models.load_model(model_file) # 初始化模型输出 dummy_input = np.random.rand(1, 299, 299, 3) model.predict(dummy_input) # 正常构建梯度模型 grad_model = keras.models.Model( model.inputs, [model.get_layer(last_conv_layer_name).output, model.output] )
补充提示
如果不确定模型的输入形状,可通过以下代码查看:
print(model.input_shape) # 输出类似(None, 299, 299, 3),其中None代表batch维度
再根据输出的形状生成对应占位数据即可。
内容的提问来源于stack exchange,提问作者JimMat
相关产品推荐
相关产品推荐

