h5模型转ONNX报keras无applications属性错误求解
报错信息
AttributeError: module 'tensorflow.python.keras' has no attribute 'applications'
问题场景
在Google Colab平台尝试将Keras格式的.h5模型转换为ONNX格式时触发上述报错,复现代码如下:
from tensorflow.python.keras import backend as K from tensorflow.python.keras.models import load_model import onnx import keras2onnx onnx_model_name = 'fish-resnet50.onnx' model = load_model('model-resnet50-final.h5') onnx_model = keras2onnx.convert_keras(model, model.name) onnx.save_model(onnx_model, onnx_model_name)
已尝试的排查操作
- 执行
!pip install keras --upgrade命令升级Keras到最新版本,问题仍未解决 - 在搭载macOS V12.4系统的M1芯片Mac本地Jupyter Notebook中运行相同代码,复现了完全一致的报错
问题根因
- 代码中直接从
tensorflow.python.keras路径导入模块属于调用TensorFlow内部非公开API,TensorFlow 2.x后续版本调整了内部模块结构,applications模块不再挂载在该路径下,直接导入会触发属性不存在的错误。 keras2onnx库已停止迭代更新,无法适配TensorFlow 2.10及以上版本的Keras接口,高版本环境下调用会出现各类属性报错。
可行解决方案
方案1:调整导入路径+固定兼容版本(适配原有keras2onnx转换逻辑)
如果需要沿用原有keras2onnx的转换逻辑,先固定依赖版本为兼容组合,同时将非公开API导入替换为公开API导入即可:
- 先安装指定版本依赖:
!pip install tensorflow==2.9.1 keras2onnx onnx onnxruntime
注意:Colab环境安装完指定版本依赖后必须重启运行时,否则会加载环境预装的高版本TensorFlow,导致报错依旧存在。
- 将原代码的导入部分修改为公开API路径,其余逻辑保持不变:
from tensorflow.keras import backend as K from tensorflow.keras.models import load_model import onnx import keras2onnx onnx_model_name = 'fish-resnet50.onnx' model = load_model('model-resnet50-final.h5') onnx_model = keras2onnx.convert_keras(model, model.name) onnx.save_model(onnx_model, onnx_model_name)
方案2:替换为官方维护的tf2onnx工具(适配高版本TensorFlow)
如果不想降级TensorFlow版本,直接替换转换工具为官方持续维护的tf2onnx即可,该方案兼容TensorFlow 2.10及以上所有最新版本,转换稳定性更高:
- 安装依赖:
!pip install tf2onnx onnx
- 使用tf2onnx完成模型转换,代码如下:
import tensorflow as tf from tensorflow.keras.models import load_model import tf2onnx import onnx onnx_model_name = 'fish-resnet50.onnx' model = load_model('model-resnet50-final.h5') # 定义输入签名,batch维度设为None支持动态batch输入,可根据自身业务需求调整 input_signature = [tf.TensorSpec([None, *model.input_shape[1:]], tf.float32, name='input')] onnx_model, _ = tf2onnx.convert.from_keras(model, input_signature=input_signature, opset=13) onnx.save_model(onnx_model, onnx_model_name)
内容的提问来源于stack exchange,提问作者Haotian H.
相关产品推荐
相关产品推荐

