Colab可正常加载h5模型,本地Flask调用load_model报配置格式错误
解决Colab训练的H5模型本地Flask加载报错:ValueError: Improperly formatted model config
我之前也碰到过一模一样的问题!这大概率是Colab与本地环境的TensorFlow/Keras版本不匹配导致的——尤其是MobileNet这类预训练模型的保存和加载,对版本一致性要求特别高。下面是我亲测有效的解决方法:
方法1:对齐Colab与本地的TensorFlow版本
这是最直接的解决方案:
- 先在Colab里运行以下命令,查看当前使用的TensorFlow版本:
import tensorflow as tf print(tf.__version__) - 然后在本地Flask环境中,安装完全相同版本的TensorFlow:
注意:现在Keras已经整合进TensorFlow了,不需要单独安装pip install tensorflow==x.x.x # 把x.x.x替换成Colab里的版本号keras包,直接用from tensorflow.keras.models import load_model即可。
方法2:改用SavedModel格式保存模型
H5格式在跨版本时容易出现配置解析问题,而SavedModel是TensorFlow官方推荐的更稳定的格式:
- 在Colab中修改模型保存代码:
# 去掉.h5后缀,保存为文件夹格式 model.save('chest-xray-pneumonia') - 下载整个
chest-xray-pneumonia文件夹到本地(确保包含里面的assets、variables等子文件夹,不要漏文件) - 本地Flask中加载模型:
from tensorflow.keras.models import load_model new_model = load_model(os.path.join(app.config['UPLOAD_FOLDER'],"chest-xray-pneumonia"))
方法3:手动构建模型结构后加载权重
如果上面两种方法都不行,可以通过“先复刻模型结构,再单独加载权重”的方式绕开配置解析问题:
- 在本地Flask的
main.py中,完全复制你在Colab里写的模型构建代码:
这种方式相当于本地重新搭建了和Colab完全一致的模型骨架,只把训练好的参数“填”进去,能彻底避免模型配置不兼容的问题。from tensorflow.keras.applications import MobileNet from tensorflow.keras.layers import GlobalAveragePooling2D, Dense from tensorflow.keras.models import Model # 复刻Colab中的模型结构 base_model = MobileNet(weights='imagenet', include_top=False) x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(1024, activation='relu')(x) x = Dense(1024, activation='relu')(x) x = Dense(512, activation='relu')(x) preds = Dense(2, activation='softmax')(x) model = Model(inputs=base_model.input, outputs=preds) # 加载训练好的权重(注意这里用load_weights而不是load_model) model.load_weights(os.path.join(app.config['UPLOAD_FOLDER'], "chest-xray-pneumonia.h5"))
额外注意事项
- 确保本地环境已经安装了
pillow等图像处理依赖,避免预测时出现其他报错:pip install pillow - 如果使用方法3,第一次运行时会自动下载MobileNet的预训练权重,可能需要等待一会。
内容的提问来源于stack exchange,提问作者user2342708
相关产品推荐
相关产品推荐

