无法在Flask环境中加载Kaggle训练的深度学习模型
问题解决步骤
核心原因分析
问题根源在于Kaggle与Flask环境的TensorFlow/Keras版本不一致,同时混合使用了独立Keras和TensorFlow集成的Keras导入,导致模型加载时无法识别标准层(如BatchNormalization)。
具体修复方案
1. 统一使用TensorFlow集成的Keras导入
删除所有独立Keras(import keras)的导入语句,全部替换为TensorFlow官方的Keras模块:
from flask import Flask, render_template, request, jsonify from werkzeug.utils import secure_filename from flask_sqlalchemy import SQLAlchemy import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential, model_from_json from tensorflow.keras.layers import BatchNormalization import os import pickle import librosa
2. 加载模型时传入自定义层映射
在加载JSON模型时,明确将BatchNormalization传入custom_objects参数,让模型加载器识别该层:
json_file = open('Backend/kaggle/CNN_model.json', 'r') loaded_model_json = json_file.read() json_file.close() # 传入custom_objects解决未知层问题 loaded_model = model_from_json(loaded_model_json, custom_objects={'BatchNormalization': BatchNormalization}) loaded_model.load_weights("Backend/kaggle/best_model1_weights.h5")
3. 严格匹配Kaggle的TensorFlow版本
这是最关键的一步:
- 在Kaggle环境中运行以下代码查看版本:
import tensorflow as tf print(tf.__version__) - 在Flask的虚拟环境中安装完全相同的版本:
pip install tensorflow==<Kaggle上的版本号> - 同时确保
librosa、numpy等依赖库的版本与Kaggle环境一致,避免兼容性冲突。
4. 可选:改用完整模型保存/加载方式
如果上述步骤仍有问题,建议在Kaggle中直接保存完整模型,而非拆分JSON和权重:
# Kaggle上的保存代码 model.save("full_CNN_model.h5")
在Flask中加载时只需一行代码:
loaded_model = tf.keras.models.load_model("Backend/kaggle/full_CNN_model.h5")
这种方式无需处理自定义层,兼容性更好。
内容的提问来源于stack exchange,提问作者Frankie vara
相关产品推荐
相关产品推荐

