在 Flask 中从 .h5 文件加载 Keras (TensorFlow) 模型时出错

当我运行文件时,出现了以下错误:

python app.py2023-09-03 22:09:58.412966: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.To enable the following instructions: SSE SSE2 SSE3 SSE4.1 SSE4.2 AVX, in other operations, rebuild TensorFlow with the appropriate compiler flags.Traceback (most recent call last):  File "C:\Users\Osama\python enviroment\app.py", line 95, in <module>    model = load_local_model()            ^^^^^^^^^^^^^^^^^^  File "C:\Users\Osama\python enviroment\app.py", line 29, in load_local_model    model = load_model(model_path)            ^^^^^^^^^^^^^^^^^^^^^^  File "C:\Users\Osama\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\saving\saving_api.py", line 238, in load_model    return legacy_sm_saving_lib.load_model(           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File "C:\Users\Osama\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\utils\traceback_utils.py", line 70, in error_handler    raise e.with_traceback(filtered_tb) from None  File "C:\Users\Osama\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\utils\generic_utils.py", line 102, in func_load    code = marshal.loads(raw_code)           ^^^^^^^^^^^^^^^^^^^^^^^ValueError: bad marshal data (unknown type code)

这是完整的代码:

import osimport uuidimport requestsfrom PIL import Imageimport tensorflow as tffrom tensorflow.keras.models import load_modelfrom tensorflow.keras.preprocessing.image import load_img, img_to_arrayfrom flask import Flask, request, jsonifyfrom werkzeug.utils import secure_filenamefrom dotenv import load_dotenvimport jsonload_dotenv()app = Flask(__name__)BASE_DIR = os.path.dirname(os.path.abspath(__file__))model = NoneALLOWED_EXT = {'jpg', 'jpeg', 'png', 'jfif'}classes = ['Meningioma', 'Glioma', 'Pituitary']def allowed_file(filename: str) -> bool:    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTdef load_local_model() -> tf.keras.Model:    model_path = os.path.join(BASE_DIR, 'model.h5')    model = load_model(model_path)    return modeldef predict(filename: str, model) -> tuple[list[str], list[float]]:    img = load_img(filename, target_size=(256, 256))    img = img_to_array(img)    img = img.reshape(1, 256, 256, 3)    img = img.astype('float32')    img = img / 255.0    result = model.predict(img)    dict_result = {}    for i in range(len(classes)):        dict_result[result[0][i]] = classes[i]    res = result[0]    res.sort()    res = res[::-1]    prob = res[:3]    prob_result = []    class_result = []    for i in range(len(prob)):        prob_result.append(round(prob[i] * 100, 3))        class_result.append(dict_result[prob[i]])    return class_result, prob_result@app.route('/predict', methods=['POST'])def predict_image():    if 'file' not in request.files:        return jsonify({'error': 'No file found in the request'})    file = request.files['file']    if file.filename == '':        return jsonify({'error': 'No file selected'})    if file and allowed_file(file.filename):        filename = secure_filename(file.filename)        unique_filename = str(uuid.uuid4())        img_path = os.path.join(            BASE_DIR, 'static/images', unique_filename + '.jpg')        file.save(img_path)        class_result, prob_result = predict(img_path, model)        predictions = {            "class1": class_result[0],            "class2": class_result[1],            "class3": class_result[1],            "prob1": prob_result[0],            "prob2": prob_result[1],            "prob3": prob_result[2],        }        return jsonify(predictions)        return jsonify({'message': 'serve is working'})    else:        return jsonify({'error': 'Invalid file format'})if __name__ == "__main__":    # Load model locally    model = load_local_model()    print("Model loaded.")    app.run(host='0.0.0.0', port=int(os.getenv('PORT', 5000)), debug=False)

如果你想查看文件结构,这里是 GitHub 仓库的链接。

我没有使用 Python 的经验,因为我是一名前端开发者,所以可能代码中有些问题,但我已经尝试了一切:ChatGpt、Bing,当然也花了几个小时在 Stackoverflow 上。

感谢你的时间 ❤️


回答:

问题是由我在 Flask 应用中使用不兼容的版本引起的。以下是我解决它的方法:

  1. TensorFlow 版本不匹配:

    • 模型是使用 TensorFlow v2.12.0 训练的,但我安装在 Flask 应用中的是 TensorFlow v2.13.0。
    • 为了解决这个问题,我将 TensorFlow 版本降级到与训练时使用的版本一致。你可以通过运行以下命令来实现:
      pip install tensorflow==2.12.0
  2. Python 版本不匹配:

    • 模型是使用 Python v3.10.9 构建的,而我在 Flask 应用中使用的是 Python v3.11.3。
    • 为了确保兼容性,我通过创建虚拟环境并安装 Python v3.10.9 来切换到正确的 Python 版本。以下是步骤:
      • 如果还没有安装 virtualenv,请先安装:
        pip install virtualenv
      • 创建虚拟环境:
        virtualenv myenv
      • 激活虚拟环境:
        • 对于 Windows:
          myenv\Scripts\activate
        • 对于 Linux/macOS:
          source myenv/bin/activate
      • 在虚拟环境中安装 Python v3.10.9:
        pip install python==3.10.9

应用这些更改后,我的 Flask 应用中的 TensorFlow 版本和 Python 版本与模型兼容。这解决了我的问题,希望对你也有帮助。

请注意,确保模型、TensorFlow 和 Python 之间的版本兼容性,以避免将来出现此类问题。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注