可以转换为 TensorRT 的 Tensorflow tf.abs() 替代品

Tensorflow tf.abs() alternate that can be converted to TensorRT

我正在尝试将我的 Tensorflow 冻结模型转换为 NVIDIA TensorRT 引擎。我有 TensorRT 3 版本。 TensorRT 不支持某些 Tensorflow layers/functions,例如 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 returns 的布尔掩码转换为整数掩码,以便将其乘以输入,但 tf.Cast 操作也是TensorRT 不支持。

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

Using output node generate_output/deprocess/add Converting to UFF graph No. nodes: 361 UFF Output written to data/tmp.uff UFFParser: parsing generate_output/generator/encoder_9/lrelu/mul/x UFFParser: parsing generate_output/generator/encoder_8/lrelu/mul/x UFFParser: parsing generate_output/generator/encoder_7/lrelu/mul/x UFFParser: parsing generate_output/generator/encoder_6/lrelu/mul/x UFFParser: parsing generate_output/generator/encoder_5/lrelu/mul/x UFFParser: parsing generate_output/generator/encoder_4/lrelu/mul/x UFFParser: parsing generate_output/generator/encoder_3/lrelu/mul/x UFFParser: parsing generate_output/generator/encoder_2/lrelu/mul/x UFFParser: parsing image_tensor UFFParser: parsing generate_output/load_images/preprocess/mul/y UFFParser: parsing generate_output/load_images/preprocess/mul UFFParser: parsing generate_output/load_images/preprocess/sub/y UFFParser: parsing generate_output/load_images/preprocess/sub UFFParser: parsing generate_output/input_images/Reshape/shape UFFParser: parsing generate_output/input_images/Reshape UFFParser: parsing generator/encoder_1/conv/filter UFFParser: parsing generate_output/generator/encoder_1/conv/Conv2D UFFParser: parsing generate_output/generator/encoder_2/lrelu/mul UFFParser: parsing generate_output/generator/encoder_2/lrelu/mul_1/x UFFParser: parsing generate_output/generator/encoder_2/lrelu/Abs UFFParser: Parser error: generate_output/generator/encoder_2/lrelu/Abs: Unary not supported for other non-constant node Failed to parse UFF

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

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