我正在尝试将基于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
:
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)
尽管TensorRT 3支持所有层,但UFF解析器不支持reduce_mean
,并且它会引发以下错误:
UFFParser:分析器错误:
generate_output / generator / encoder_2 / batchnorm / Mean:不支持Reduce运算符
第二种方法:
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)
但是我再次遇到了UFF解析器错误:
UFFParser:分析器错误:generate_output / generator / encoder_2 / batchnorm / Sum:不支持减少运算符
我还在备用2而不是keras.backend.sum中使用了reduce_sum来解决相同的错误。
答案 0 :(得分:1)
您似乎正在尝试使用自己的代码进行batchnorm。如果没有什么特别的关于batchnorm那么你应该使用tensorflow的batchnorm。
我通过这样做将batchnorm转换为tensorrt支持的操作: 1.在张量流代码中指定fused = False。 2.在冻结图上运行带有fold_batch_norm选项的转换图。 3.使用转换脚本转换新的冻结图。