使用Pickle转储Keras模型时出现NotFoundError及模型未成功保存问题排查
问题分析与解决方案
先帮你揪出代码里的几个核心问题,这就是模型没成功保存、还报错的原因:
- 加载模型时参数传错了:
pickle.load(model)这里应该传打开的文件对象file,而不是model变量,这一步直接会导致加载逻辑报错 - 用pickle保存Keras模型本身就不合适:Keras模型包含TensorFlow计算图、权重等复杂的底层结构,pickle这种通用序列化工具没法完整处理这些内容,这就是文件创建了但模型没被正确写入的根本原因,还会引发
NotFoundError这类序列化错误
修正后的完整代码
Keras官方提供了专门的模型保存/加载API,比pickle靠谱太多,直接用这个就解决问题了:
import os import tensorflow as tf # 检查模型文件是否存在(改用.h5格式,这是Keras模型的标准保存格式) if os.path.exists("trained_model.h5"): print("loading trained model") # 用Keras官方方法加载完整模型 model = tf.keras.models.load_model("trained_model.h5") else: print('creating and training a new model') model = tf.keras.models.Sequential() model.add(tf.keras.layers.Flatten(input_shape=(28,28))) model.add(tf.keras.layers.Dense(units=256, activation=tf.nn.relu)) model.add(tf.keras.layers.Dense(units=256, activation=tf.nn.relu)) model.add(tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=4) # 用官方方法保存完整模型(包含结构、权重、编译配置) model.save("trained_model.h5")
额外说明
model.save()会把模型的结构、训练好的权重、甚至编译时的优化器和损失函数配置一起保存,加载后直接就能用,不用重新编译- 如果只想单独保存权重,可以用
model.save_weights("model_weights.h5"),但加载时需要先重建模型结构再调用model.load_weights(),你的场景用完整模型保存更省心 - 另外你原来的代码里
pickle.dump(model, file))多了一个右括号,这也是个小语法错误,修正后的代码里已经去掉了
内容的提问来源于stack exchange,提问作者Lars Jacobs
相关产品推荐
相关产品推荐

