当我像这样加载pickle文件时,它警告我没有导入这样的库
keras.saving.pickle_utils
。不过,这段代码可以在 Google Colab 上运行。我不知道我的错误是什么。你能帮助我吗?我使用张量流2.13.0
这是我的 Flask 后端服务器的源代码
from flask import Flask,request,jsonify
import numpy as np
import pickle
import joblib
app = Flask(__name__)
file= open('model.pkl','rb')
model = joblib.load(file)
@app.route('/')
def index():
return "Hello world"
@app.route('/predict',methods=['POST'])
def predict():
N = float(request.form.get('N',False))
P = float(request.form.get('P',False))
K = float(request.form.get('K',False))
temperature = float(request.form.get('temperature',False))
humidity = float(request.form.get('humidity',False))
ph=float(request.form.get('ph',False))
rainfall=float(request.form.get('rainfall',False))
input_query = np.array([[N,P,K,temperature,humidity,ph,rainfall]])
result = model.predict(input_query)[0]
return jsonify({'placement':str(result)})
if __name__ == '__main__':
app.run(debug=True)
我的错误是:
Traceback (most recent call last):
File "C:\Users\Admin\a.py", line 9, in <module>
model = joblib.load(file)
^^^^^^^^^^^^^^^^^
File "C:\Users\Admin\AppData\Local\Programs\Python\Python311\Lib\site-packages\joblib\numpy_pickle.py", line 648, in load
obj = _unpickle(fobj)
^^^^^^^^^^^^^^^
File "C:\Users\Admin\AppData\Local\Programs\Python\Python311\Lib\site-packages\joblib\numpy_pickle.py", line 577, in _unpickle
obj = unpickler.load()
^^^^^^^^^^^^^^^^
File "C:\Users\Admin\AppData\Local\Programs\Python\Python311\Lib\pickle.py", line 1213, in load
dispatch[key[0]](self)
File "C:\Users\Admin\AppData\Local\Programs\Python\Python311\Lib\pickle.py", line 1538, in load_stack_global
self.append(self.find_class(module, name))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Admin\AppData\Local\Programs\Python\Python311\Lib\pickle.py", line 1580, in find_class
__import__(module, level=0)
ModuleNotFoundError: No module named 'keras.saving.pickle_utils'
我最近遇到了完全相同的问题:
我的经历: 我从
训练了我的模型tensorflow.keras.models 使用 Sequential、Dropout、BatchNormalization 等
得到我想要的结果后,我继续使用 joblib 将模型保存到磁盘。模型保存得很好,但是当我从 API 反序列化模型以进行预测时,我遇到了确切的错误
ModuleNotFoundError:没有名为“keras. saving.pickle_utils”的模块
经过大量研究和阅读 keras 文档 .
我按照以下指示解决了该问题 keras 文档。
解决方案:
因此,对于此错误,如果您的模型是从tensorflow.keras.models构建的,根据他们的文档,您必须使用keras函数保存模型,例如
model.save('path/to/location.keras')
注意: # 该文件需要以 .keras 扩展名结尾,这与 joblib 和 pickle 函数不同,您可以为保存的模型提供任何扩展名。
以这种方式保存的 keras 模型可以使用相同的 keras 函数进行 pickle,例如
model = keras.models.load_model('path/to/location.keras')
如果您已导入名称空间,例如:
import tensorflow as tf
然后你可以通过这样调用函数来加载你的模型:
model = tf.keras.models.load_model('path/to/location.keras')
对此原因的进一步研究表明 Keras 模型由多个组件组成:
Keras API 将所有这些部分以统一格式保存在一起,并以 .keras 扩展名进行标记。这是一个 zip 存档,包含以下内容:
您可以从 Keras
获得更全面的指南发布此内容以防对某人有帮助。
这可能是由于使用不同版本的张量流保存和加载模型。我尝试使用tensorflow 2.15.0加载keras模型历史对象时遇到此错误。
history_file = (f"D:/path/to/file/history.pkl")
with open(history_file, "rb") as pickle_obj:
history = pickle.load(pickle_obj)
我很幸运仍然保存着模型的requirements.txt,并且看到模型是使用tensorflow 2.8.0创建的。我相应地降级了。 也许这会为您解决错误。
我偶然发现了一个新错误,但它可能特定于我的设置:
FileNotFoundError: Unsuccessful TensorSliceReader constructor: Failed to find any matching files for ram://ec599a0a-4de6-4c7f-858e-749e9699780c/variables/variables
You may be trying to load on a different device from the computational device. Consider setting the `experimental_io_device` option in `tf.saved_model.LoadOptions` to the io_device such as '/job:localhost'.
这个建议是正确的,计算设备确实不同,因为我从 Linux 设备存储了这个模型,现在尝试使用 Windows 加载它。我在 WSL 中设置了所有内容,它直接运行了。