报错:'Sequential'对象无'_call_spec'属性,求解决方法
解决'Sequential' object has no attribute '_call_spec'错误
问题重现
运行代码时触发错误:'Sequential' object has no attribute '_call_spec',最初使用model.predict_classes(img)获取分类索引,替换为np.argmax(model.predict(img))后问题仍未解决,相关代码如下:
import numpy as np import cv2 import pickle width = 640 height = 480 threshold = 0.80 cap = cv2.VideoCapture(0) cap.set(3, width) cap.set(4, height) pickle_in = open("model_trained_10.p", "rb") model = pickle.load(pickle_in) def preProcessing(img): img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.equalizeHist(img) img = img/255 return img while True: success, imgOriginal = cap.read() img = np.asarray(imgOriginal) img = cv2.resize(img, (32,32)) img = preProcessing(img) cv2.imshow("Processed Image", img) img = img.reshape(1,32,32) print(model) # predict classIndex = np.argmax(model.predict(img)) predictions = model.predict(img) probVal = np.amax(predictions) print(classIndex,probVal) if probVal> cv2.threshold: cv2.putText(imgOriginal, str(classIndex) + " " + str(probVal), (50,50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 1) cv2.imshow("Original Image", imgOriginal) if cv2.waitKey(1) & 0xFF == ord('q'): break
错误原因
这个错误的核心问题是用pickle直接序列化Keras模型的方式不正确。Keras/TensorFlow模型内部包含大量复杂的层结构和调用规范(比如_call_spec),pickle无法完整保存这些属性,导致加载后的模型缺失关键组件,调用predict时触发错误。
另外代码里还有两个隐藏问题:
- 输入维度不匹配:预处理后的灰度图是(32,32),reshape成(1,32,32),但多数图像分类模型期望的输入是**(batch_size, height, width, channels)**,灰度图的channels=1,所以维度应该是(1,32,32,1)
- 条件判断错误:
probVal> cv2.threshold里的cv2.threshold是OpenCV的阈值函数,应该用你自己定义的threshold变量,否则会引发类型错误
解决方案
重新用正确方式保存模型
如果你还能拿到训练好的模型,执行以下代码重新保存:# 训练完成后保存模型(TensorFlow 2.x推荐方式) model.save("model_trained_10.h5") # 或者用SavedModel格式 # model.save("model_trained_10")用Keras内置方法加载模型
替换原代码中pickle加载模型的部分:from tensorflow.keras.models import load_model # 加载h5格式模型 model = load_model("model_trained_10.h5") # 如果用SavedModel格式,直接传文件夹路径 # model = load_model("model_trained_10")修正输入维度
将img = img.reshape(1,32,32)修改为:img = img.reshape(1,32,32,1)修正条件判断变量
将if probVal> cv2.threshold:改为:if probVal > threshold:
修正后的完整代码
import numpy as np import cv2 from tensorflow.keras.models import load_model width = 640 height = 480 threshold = 0.80 cap = cv2.VideoCapture(0) cap.set(3, width) cap.set(4, height) # 改用load_model加载模型 model = load_model("model_trained_10.h5") def preProcessing(img): img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.equalizeHist(img) img = img/255 return img while True: success, imgOriginal = cap.read() if not success: break img = np.asarray(imgOriginal) img = cv2.resize(img, (32,32)) img = preProcessing(img) cv2.imshow("Processed Image", img) # 修正输入维度 img = img.reshape(1,32,32,1) # 获取预测结果 predictions = model.predict(img) classIndex = np.argmax(predictions) probVal = np.amax(predictions) print(classIndex, probVal) # 修正阈值变量引用 if probVal > threshold: cv2.putText(imgOriginal, f"{classIndex} {probVal:.2f}", (50,50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 2) cv2.imshow("Original Image", imgOriginal) if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 cap.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Mohammed Abdou
相关产品推荐
相关产品推荐

