You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:09:01