寻求可转换为TensorRT的TensorFlow tf.abs()替代实现方案
解决TensorRT 3 UFF解析器不支持
tf.abs()的替代方案 我之前也碰到过类似的TensorRT UFF解析器兼容问题,针对你这个tf.abs()的情况,有几个简单可靠的替代实现,你可以在导出冻结模型前修改TensorFlow代码:
方案1:用tf.maximum()模拟绝对值
绝对值的核心逻辑就是取输入值和它的相反数中的较大值,这个组合操作完全依赖TensorRT UFF解析器支持的基础运算:
# 原代码 y = tf.abs(x) # 替换后的代码 y = tf.maximum(x, -x)
这个写法简洁高效,而且和原tf.abs()的计算结果完全一致,不会引入任何精度损失。
方案2:用tf.where()条件分支实现
如果需要更直观的条件判断逻辑,也可以用tf.where()结合比较操作来实现绝对值:
# 原代码 y = tf.abs(x) # 替换后的代码 condition = tf.greater_equal(x, 0.0) y = tf.where(condition, x, tf.negative(x))
这里用到的tf.greater_equal、tf.where和tf.negative都是UFF解析器兼容的标准操作,不会触发解析错误。
方案3:用tf.nn.relu组合实现
利用ReLU函数只保留非负值的特性,绝对值可以拆分为输入的正部分加上输入相反数的正部分:
# 原代码 y = tf.abs(x) # 替换后的代码 y = tf.nn.relu(x) + tf.nn.relu(-x)
这个方案同样能精准复现tf.abs()的效果,而且ReLU是TensorRT优化得很好的操作,对后续引擎的性能也没有影响。
注意事项
- 替换完成后,一定要先在TensorFlow环境中验证模型的输出结果和原模型完全一致,确保逻辑没有偏差;
- 验证通过后再导出冻结模型,使用UFF转换器转换后导入TensorRT 3构建引擎。
内容的提问来源于stack exchange,提问作者Blue
相关产品推荐
相关产品推荐

