ModuleNotFoundError:没有名为“keras. saving.pickle_utils”的模块

问题描述 投票:0回答:2

当我像这样加载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'
python flask keras
2个回答
1
投票

我最近遇到了完全相同的问题:

我的经历: 我从

训练了我的模型

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 存档,包含以下内容:

  1. 基于 JSON 的配置文件(config.json):记录模型、图层和其他可跟踪对象的配置。
  2. 基于 H5 的状态文件,例如 model.weights.h5(针对整个模型),其中包含层及其权重的目录键。
  3. JSON 格式的元数据文件,存储诸如当前 Keras 版本之类的内容。

您可以从 Keras

获得更全面的指南

0
投票

发布此内容以防对某人有帮助。

这可能是由于使用不同版本的张量流保存和加载模型。我尝试使用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 中设置了所有内容,它直接运行了。

© www.soinside.com 2019 - 2024. All rights reserved.