我正在尝试将基于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,忽略...
警告:尚未为图层注册转换函数:SquaredDifference。
转换为自定义运算 SquaredDifference >
generate_output/generator/decoder_2/batchnorm/moments/SquaredDifference 名称:
“generate_output/generator/decoder_2/batchnorm/moments/SquaredDifference”
操作:“平方差”
输入:“generate_output/generator/decoder_2/batchnorm/Identity”
输入:“generate_output/generator/decoder_2/batchnorm/moments/StopGradient”
属性{
键:“T”
价值 {
类型:DT_FLOAT
}
}
回溯(最近一次通话最后):
文件“scripts/convert_plan.py”,第 71 行,在 data_type 中
文件“scripts/convert_plan.py”,第 22 行,frozenToPlan text=False,
文件“/usr/local/lib/python2.7/dist-packages/uff/converters/tensorflow/conversion_helpers.py”,第 103 行,from_tensorflow_frozen_model return 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、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 中为 key,val 在 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 返回 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 返回 np.dtype(dt[dtype])
TypeError:列表索引必须是整数,而不是 AttrValue
我尝试tf.nn.moments
用 2 种替代方法替换:
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 都支持这些层,reduce_mean
但 UFF 解析器不支持这些层,它会引发以下错误:
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 中使用了 reduce_sum 而不是 keras.backend.sum,来遇到同样的错误。