我正在尝试将Tensorflow冻结模型转换为NVIDIA TensorRT引擎。我有TensorRT 3版本。 TensorRT不支持某些Tensorflow层/功能,例如tf.Cast等。
我的模型使用tf.abs()函数(EDIT:实际上由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

最佳答案

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

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

关于python - 可以转换为TensorRT的Tensorflow tf.abs()替代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49856793/

10-09 08:22