由于UFF解析器错误导致TensorRT引擎失败

时间:2018-04-20 07:00:00

标签: python tensorflow nvidia tensorrt

我正在尝试将基于pix2pix architecture的Tensorflow冻结模型转换为NVIDIA TensorRT引擎。我有TensorRT 3版本。尽管TensorRT 3支持我的图层,但其中一些图层不受UFF解析器的支持。我面临的问题是由于行:

mean, variance = tf.nn.moments(input, axes=[0, 1, 2], keep_dims=False)

其中一个内部操作是TensorRT不支持的squared difference,在执行时返回以下错误:

  

转换为UFF图   警告:不支持keep_dims,忽略......

     

警告:没有为图层注册转换功能:SquaredDifference。

     

转换为自定义操作SquaredDifference>

     

generate_output /发电机/ decoder_2 / batchnorm /时刻/ SquaredDifference   名称:

     

“generate_output /发电机/ decoder_2 / batchnorm /时刻/ SquaredDifference”

     

op:“SquaredDifference”

     

输入:“generate_output / generator / decoder_2 / batchnorm / Identity”

     

输入:“generate_output / generator / decoder_2 / batchnorm / moments / StopGradient”

     

attr {

     

键:“T”

     

值{

     

输入:DT_FLOAT

     

}

     

}

     

追踪(最近一次呼叫最后一次):

     

文件“scripts / convert_plan.py”,第71行,in   DATA_TYPE

     

文件“scripts / convert_plan.py”,第22行,在frozenToPlan中   文本=假,

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/conversion_helpers.py”,第103行,in_tensorflow_frozen_model   返回from_tensorflow(graphdef,output_nodes,** kwargs)

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/conversion_helpers.py”,第75行,in_tensorflow   名称= “主”)

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py”,第64行,在convert_tf2uff_graph中   uff_graph,input_replacements)

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py”,第51行,在convert_tf2uff_node中   op,name,tf_node,inputs,uff_graph,tf_nodes = tf_nodes)

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py”,第28行,在convert_layer中   fields = cls.parse_tf_attrs(tf_node.attr)

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py”,第177行,在parse_tf_attrs中   for key,val in attrs.items()}

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py”,第177行,   for key,val in attrs.items()}

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py”,第172行,在parse_tf_attr_value中   return cls.convert_tf2uff_field(code,val)

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py”,第146行,在convert_tf2uff_field中   返回TensorFlowToUFFConverter.convert_tf2numpy_dtype(val)

     

文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py”,第74行,在convert_tf2numpy_dtype中   return np.dtype(dt [dtype])

     

TypeError:列表索引必须是整数,而不是AttrValue

我尝试用另外两种方法替换tf.nn.moments

  1. mean = tf.reduce_mean(input, axis = [0, 1, 2], keep_dims=False)

    devs_squared = tf.multiply(input - mean, input - mean)

    variance = tf.reduce_mean(devs_squared, axis = [0, 1, 2], keep_dims=False)

  2. 尽管TensorRT 3支持所有层,但UFF解析器不支持reduce_mean,并且它会引发以下错误:

      

    UFFParser:分析器错误:

         

    generate_output / generator / encoder_2 / batchnorm / Mean:不支持Reduce运算符

    1. 第二种方法:

      mean = tf.keras.backend.sum(input, axis = [0, 1, 2])

      div_factor_1 = input.get_shape().as_list()[0]*input.get_shape().as_list()[1]*input.get_shape().as_list()[2]

      mean = mean * (1 / div_factor_1)

      devs_squared = tf.multiply(input - mean, input - mean)

      variance = tf.keras.backend.sum(devs_squared, axis = [0, 1, 2])

      div_factor_2 = devs_squared.get_shape().as_list()[0]*devs_squared.get_shape().as_list()[1]*devs_squared.get_shape().as_list()[2]

      variance = variance * (1 / div_factor_2)

    2. 但是我再次遇到了UFF解析器错误:

        

      UFFParser:分析器错误:generate_output / generator / encoder_2 / batchnorm / Sum:不支持减少运算符

      我还在备用2而不是keras.backend.sum中使用了reduce_sum来解决相同的错误。

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试使用自己的代码进行batchnorm。如果没有什么特别的关于batchnorm那么你应该使用tensorflow的batchnorm。

我通过这样做将batchnorm转换为tensorrt支持的操作: 1.在张量流代码中指定fused = False。 2.在冻结图上运行带有fold_batch_norm选项的转换图。 3.使用转换脚本转换新的冻结图。