当我运行文件时,出现了以下错误:
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 应用中使用不兼容的版本引起的。以下是我解决它的方法:
-
TensorFlow 版本不匹配:
- 模型是使用 TensorFlow v2.12.0 训练的,但我安装在 Flask 应用中的是 TensorFlow v2.13.0。
- 为了解决这个问题,我将 TensorFlow 版本降级到与训练时使用的版本一致。你可以通过运行以下命令来实现:
pip install tensorflow==2.12.0
-
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
- 对于 Windows:
- 在虚拟环境中安装 Python v3.10.9:
pip install python==3.10.9
- 如果还没有安装
应用这些更改后,我的 Flask 应用中的 TensorFlow 版本和 Python 版本与模型兼容。这解决了我的问题,希望对你也有帮助。
请注意,确保模型、TensorFlow 和 Python 之间的版本兼容性,以避免将来出现此类问题。