h5转pb后用OpenVINO mo_tf转IR报_UserObject无add_slot属性
问题原因
这个报错不是你h5转pb的核心逻辑错误,是TensorFlow版本和OpenVINO 2021.4的兼容限制,以及SavedModel导出时携带了多余的训练状态导致的:
- OpenVINO 2021.4版本的模型优化器(MO)原生最高适配TensorFlow 2.4.x,如果你用TF2.5及以上版本导出SavedModel,TF2.5之后修改了优化器、自定义对象的序列化逻辑,封装的
_UserObject结构无法被低版本MO识别,就会触发这个报错。 - 你直接调用
model.save默认会把优化器、训练配置、自定义回调等非推理必需的对象序列化进SavedModel,这些冗余对象也会导致MO加载失败。
解决方案
按优先级依次尝试:
- 导出SavedModel时过滤训练状态
加载h5模型和导出阶段都去掉训练相关配置,只保留推理计算图:
import tensorflow as tf # 加载h5时不加载训练配置 model = tf.keras.models.load_model("你的模型路径.h5", compile=False) # 导出SavedModel时不保存优化器,指定格式为tf model.save("./OCT_savedmodel", save_format="tf", include_optimizer=False)
导出完成后再用原MO命令尝试转换即可。
- 改用冻结pb格式导出
如果第一种方法无效,直接导出冻结计算图的pb文件,避开SavedModel的兼容问题:
import tensorflow as tf from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2 # 加载h5模型 model = tf.keras.models.load_model("你的模型路径.h5", compile=False) # 转为可追踪的TF函数 infer_func = tf.function(lambda x: model(x)).get_concrete_function( tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype) ) # 所有变量转常量,冻结计算图 frozen_graph = convert_variables_to_constants_v2(infer_func) # 写入冻结pb文件 tf.io.write_graph( graph_or_graph_def=frozen_graph.graph, logdir="./frozen_model", name="oct_model.pb", as_text=False )
转换MO的命令对应修改为:
python mo_tf.py --input_model ./frozen_model/oct_model.pb --input_shape [1,256,256,3] --data_type FP16
- 版本适配或升级
- 保持导出SavedModel用的TensorFlow版本不高于2.4.x,匹配OpenVINO 2021.4的兼容要求
- 直接升级OpenVINO到2022.1及以上版本,该版本之后大幅优化了TF2 SavedModel的兼容能力,大部分这类序列化报错都会被自动修复。
内容的提问来源于stack exchange,提问作者TseHsien
相关产品推荐
相关产品推荐

