0

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

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

内部操作之一是squared differenceTensorRT 不支持的,执行时返回以下错误:

转换为 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 种替代方法替换:

  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)

虽然 TensorRT 3 都支持这些层,reduce_mean但 UFF 解析器不支持这些层,它会引发以下错误:

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)

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

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

我还在备用 2 中使用了 reduce_sum 而不是 keras.backend.sum,来遇到同样的错误。

4

1 回答 1

1

您似乎正在尝试使用自己的代码进行批处理规范。如果 batchnorm 没有什么特别之处,那么你应该使用 tensorflow 的 batchnorm。

通过执行以下操作,我将 batchnorm 转换为支持 tensorrt 的操作: 1. 在您的 tensorflow 代码中指定 fused=False。2. 在冻结图上使用 fold_batch_norm 选项运行转换图。3. 使用您的转换脚本转换新的冻结图。

于 2018-06-18T18:52:33.873 回答