【问题标题】:Tensorflow tf.abs() alternate that can be converted to TensorRT可以转换为 TensorRT 的 Tensorflow tf.abs() 替代品
【发布时间】:2018-04-16 11:58:44
【问题描述】:

我正在尝试将我的 Tensorflow 冻结模型转换为 NVIDIA TensorRT 引擎。我有 TensorRT 3 版本。 TensorRT 不支持某些 Tensorflow 层/功能,例如 tf.Cast 等。 我的模型使用tf.abs() 函数(编辑:实际上由 TensorRT 支持,但不由构建 TensorRT 引擎所需的 UFF 解析器支持),并且我能够在将 tensorflow 检查点转换为冻结之前更改操作模型。

我需要将tf.abs() 替换为备用。因此,我尝试在 Tensorflow 中进行以下 numpy 操作。

麻木:

mask = (x<0).astype(np.float32)
mask = 2*mask + 1 #(makes all 1s -1, and all 0s 1)
abs_vals = mask*x

Tensorflow:z是一个零张量,与x的形状相同

mask = tf.less(x, z)
#convert mask from boolean to integer or float

我不确定如何继续,因为我需要将 tensorflow 返回的布尔掩码转换为整数掩码,以便将其与输入相乘,但 TensorRT 也不支持 tf.Cast 操作。

编辑:问题实际上是 UFF 解析器不支持 abs 函数,而 TensorRT 实际上支持它。在此处添加错误日志。

使用输出节点 generate_output/deprocess/add 转换为 UFF 图 节点数:361 UFF 输出写入 data/tmp.uff UFFParser:解析generate_output/generator/encoder_9/lrelu/mul/x UFFParser:解析generate_output/generator/encoder_8/lrelu/mul/x UFFParser:解析generate_output/generator/encoder_7/lrelu/mul/x UFFParser:解析generate_output/generator/encoder_6/lrelu/mul/x UFFParser:解析generate_output/generator/encoder_5/lrelu/mul/x UFFParser:解析generate_output/generator/encoder_4/lrelu/mul/x UFFParser:解析generate_output/generator/encoder_3/lrelu/mul/x UFFParser:解析generate_output/generator/encoder_2/lrelu/mul/x UFFParser:解析 image_tensor UFFParser:解析 generate_output/load_images/preprocess/mul/y UFFParser:解析 generate_output/load_images/preprocess/mul UFFParser:解析 generate_output/load_images/preprocess/sub/y UFFParser:解析 generate_output/load_images/preprocess/sub UFFParser:解析 generate_output/input_images/Reshape/shape UFFParser:解析 generate_output/input_images/Reshape UFFParser:解析生成器/encoder_1/conv/filter UFFParser:解析generate_output/generator/encoder_1/conv/Conv2D UFFParser:解析generate_output/generator/encoder_2/lrelu/mul UFFParser:解析generate_output/generator/encoder_2/lrelu/mul_1/x UFFParser:解析generate_output/generator/encoder_2/lrelu/Abs UFFParser:解析器错误:generate_output/generator/encoder_2/lrelu/Abs:其他非常量节点不支持一元 UFF解析失败

【问题讨论】:

    标签: python tensorflow nvidia tensor tensorrt


    【解决方案1】:

    不幸的是,截至 2018 年 4 月,UFF 转换不支持很多操作。这个有效并且等效于 tf.abs():

    abs_val = tf.maximum( 0, x ) + tf.maximum( 0, -x )
    

    【讨论】:

    • 对不起,我的错。 TensorRT 确实支持abs 函数。 UFF 解析器不支持它(在 EDIT 中提到)。
    • tf.sqrt UFF 也不支持
    • 您知道支持的 UFF 操作列表吗?
    • 在我的回答中添加了基于tf.maximum() 的另一个解决方案
    • 谢谢。我没有遇到 UFF 不支持的层列表。但是使用最大操作的工作效果很好!
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2017-04-04
    • 2019-06-23
    相关资源
    最近更新 更多