TensorFlow2.6下h5转TensorRT时Keras符号输入输出无op属性报错问询
报错原因及解决方案
原因
该报错由TensorFlow 2.x与1.x的API不兼容导致:你参考的原教程基于TensorFlow 1.x编写,model.inputs.op.name是TF 1特有的张量节点名获取方式。TensorFlow 2.x中Keras符号张量不再内置op属性,直接调用该属性就会触发类型错误。
解决方案
方案1:兼容原教程冻结流程的修改方式
首先替换原有节点名获取代码:
# 替换原来的两行代码,直接取Keras张量本身的name属性即可 input_names = [t.name for t in model.inputs] output_names = [t.name for t in model.outputs]
再替换原教程的TF 1风格模型冻结逻辑,改用TF 2官方提供的变量冻结接口:
import tensorflow as tf from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2 # 将Keras模型转换为可追踪的tf函数 model_func = tf.function(lambda input_tensor: model(input_tensor)) # 生成具体函数签名,输入形状需和你的模型输入匹配,示例为EfficientNetB5默认输入,可自行修改 concrete_func = model_func.get_concrete_function( tf.TensorSpec(shape=(None, 456, 456, 3), dtype=tf.float32, name=input_names[0]) ) # 执行变量冻结 frozen_model = convert_variables_to_constants_v2(concrete_func) # 冻结后模型的输入输出节点名可通过以下方式获取,可直接用于后续TensorRT转换 frozen_input_names = [inp.name for inp in frozen_model.inputs] frozen_output_names = [out.name for out in frozen_model.outputs]
方案2:跳过手动冻结步骤,直接用TF 2内置TensorRT转换接口
TensorFlow 2.6已经内置了TensorRT转换工具,无需手动处理冻结节点,可直接转换.h5格式模型:
import tensorflow as tf from tensorflow.python.compiler.tensorrt import trt_convert as trt # 加载本地.h5模型,如果有自定义层需补充custom_objects参数 model = tf.keras.models.load_model("你的模型路径.h5") # 构建转换器,precision_mode可根据需求选择FP32/FP16/INT8 converter = trt.TrtGraphConverterV2( input_signature=[tf.TensorSpec(model.input.shape, dtype=tf.float32)], precision_mode="FP16" ) # 执行转换 converter.convert() # 保存转换完成的TensorRT模型 converter.save("./trt_model")
注意事项
如果你的EfficientNetB5模型训练时使用了自定义损失、自定义层或自定义指标,加载模型时需要在load_model方法中传入custom_objects参数,将自定义对象传入,避免模型加载失败。
内容的提问来源于stack exchange,提问作者LuisGF93
相关产品推荐
相关产品推荐

