我正试图将基于pix2pix体系结构的Tensorflow冻结模型转换为NVIDIA TensorRT引擎。我有TensorRT 3版本。尽管TensorRT 3支持我的层,但其中一些层不受UFF解析器的支持。我所面临的问题是因为这条线:
mean, variance = tf.nn.moments(input, axes=[0, 1, 2], keep_dims=False)
内部操作之一是不受squared difference支持的TensorRT,在执行时返回以下错误:
转换为UFF图形警告:不支持keep_dims,忽略. 警告:还没有为layer: SquaredDifference注册转换函数。 转换为自定义op SquaredDifference > generate_output/generator/decoder_2/batchnorm/moments/SquaredDifference名称: "generate_output/generator/decoder_2/batchnorm/moments/SquaredDifference“ 执行部分:"SquaredDifference“ 输入:"generate_output/generator/decoder_2/batchnorm/Identity“ 输入:"generate_output/generator/decoder_2/batchnorm/moments/StopGradient“ attr { 键:"T“ 值{ 类型: DT_FLOAT } } 回溯(最近一次调用): 在data_type中,第71行,文件“script/转化法计划. in” 在frozenToPlan text=False中,第22行,文件“script/ line _plan.py”, 文件"/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/conversion_helpers.py",第103行,在from_tensorflow_frozen_model返回from_tensorflow(graphdef,output_nodes,**kwargs) 文件"/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/conversion_helpers.py",第75行,在from_tensorflow name=“main”中) 文件"/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中,名称,tf_node,输入,uff_graph,tf_nodes=tf_nodes) 文件"/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py",第28行,在convert_layer字段= cls.parse_tf_attrs(tf_node.attr)中 文件"/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py",第177行,在parse_tf_attrs中表示key,在attrs.items()}中使用val 文件"/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py",第177行,in为键,val为attrs.items()} 文件"/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/converter.py",第172行,在parse_tf_attr_value中返回cls.convert_tf2uff_field(代码,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返回np.dtype(dtdtype)中 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:约简操作符
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解析器错误:
解析器错误: generate_output/generator/encoder_2/batchnorm/Sum:减少操作符不受支持
我还在备用2中使用了reduce_sum,而不是keras.backend.sum,以满足相同的错误。
发布于 2018-06-18 18:52:33
似乎您正在尝试使用自己的代码执行批处理规范。如果批处理规范没有什么特别之处,那么您应该使用tensorflow的批处理规范。
通过这样做,我可以将批规范转换为支持tensorrt的操作: 1.在tensorflow代码中指定fused=False。2.在冻结图上运行带有fold_batch_norm选项的转换图。3.用转换脚本转换新的冻结图。
https://stackoverflow.com/questions/49935849
复制相似问题