TensorFlow模型保存加载后预测报错:AttributeError: 'list'无'keys'属性
解决TensorFlow加载模型后predict报错:AttributeError: 'list' object has no attribute 'keys'
我之前也踩过这个坑!大概率是你加载模型后拿到的不是正经的Keras模型实例,而是个列表,所以调用predict的时候才会触发这个错误。结合TensorFlow的常见使用场景,我整理了几个排查和解决的方向:
检查模型加载后的对象类型
先在加载模型后加一行代码确认类型:model = tf.keras.models.load_model("你的模型路径") print(type(model))如果输出是类似
<class 'list'>,那说明加载逻辑返回了模型列表(比如你保存了多个模型权重或者用了特殊的保存方式),这时候需要取列表里的第一个模型实例再调用predict:model = model[0] predictions = model.predict(你的输入数据)确认保存和加载的方式匹配
TensorFlow有几种模型保存格式,保存和加载方式不匹配也会导致异常:- 如果用
model.save("my_model.h5")保存HDF5格式,必须用tf.keras.models.load_model("my_model.h5")加载,这样会直接返回Keras模型实例 - 如果用
tf.saved_model.save(model, "my_saved_model")保存SavedModel格式,要是直接用tf.saved_model.load()加载,返回的是SavedModel对象,不能直接调用predict,这时候可以改用tf.keras.models.load_model("my_saved_model")来加载成Keras模型,或者用签名函数做预测:loaded_model = tf.saved_model.load("my_saved_model") infer_func = loaded_model.signatures["serving_default"] result = infer_func(tf.constant(你的输入数据))
- 如果用
排查输入数据的格式
虽然你的错误提示指向列表没有keys方法,但也有可能是输入数据的问题:如果你的模型是多输入模型,期望接收字典格式的输入,但你传入了列表,也可能触发类似错误。比如模型输入层有两个命名输入,那应该这样传参:predictions = model.predict({"input_1": data1, "input_2": data2})而不是直接传
[data1, data2](除非模型的输入是按顺序的列表输入)。检查模型路径是否正确
看看你构建模型路径的时候有没有出错,比如SYM、TYPE这些变量拼接路径时,会不会指向了包含多个模型文件的文件夹,导致load_model返回了模型列表?可以打印出最终的模型路径确认一下。
这里给你一个标准的保存-加载-预测流程参考:
# 训练完成后保存模型 model.save("trained_model.h5") # 后续加载模型并预测 loaded_model = tf.keras.models.load_model("trained_model.h5") # 假设输入数据是numpy数组或张量 test_data = np.random.rand(1, 10) # 示例输入 predictions = loaded_model.predict(test_data) print(predictions)
内容的提问来源于stack exchange,提问作者T.Melino
相关产品推荐
相关产品推荐

