是否有一种方法(代码脚本)用于将张量流batchnorm和dropout层合并到卷积层中以进行更快的计算?
我已经搜索了一段时间,但没有得到相关的答案。
答案 0 :(得分:4)
据我所知,TensorFlow中没有内置功能可用于折叠批处理规范化。话虽这么说,手动操作并不难。值得注意的是,没有 folding dropout 之类的东西,因为在推断时只是简单地停用了dropout。
要折叠批标准化,基本上有三个步骤:
我们需要过滤需要折叠的变量。使用批处理规范化时,它将创建名称包含moving_mean
和moving_variance
的变量。您可以使用它从使用批处理规范的图层中轻松提取变量。
现在您知道哪些层使用了批处理规范,对于每个这样的层,您可以提取其权重W
,偏差b
,批处理规范方差v
,均值{{1} },m
和gamma
参数。您需要创建一个新变量来存储折叠后的权重和偏差,如下所示:
beta
最后一步是创建一个新图,在该图中我们停用批处理规范,并在必要时添加W_new = gamma * W / var
b_new = gamma * (b - mean) / var + beta
变量-每个可折叠层都应如此,因为对批处理规范使用偏差是毫无意义的。
整个代码如下所示。根据用于批处理规范的参数,您的图形可能没有bias
或gamma
。
beta
答案 1 :(得分:0)
tensorflow提供了一个工具,可以优化训练后的冻结图进行推理:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md#fold_batch_norms
构建图形转换工具。
bazel build tensorflow/tools/graph_transforms:transform_graph
运行此:
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
--in_graph=tensorflow_inception_graph.pb \
--out_graph=optimized_inception_graph.pb \
--inputs='Mul' \
--outputs='softmax' \
--transforms='
strip_unused_nodes(type=float, shape="1,299,299,3")
remove_nodes(op=Identity, op=CheckNumerics)
fold_constants(ignore_errors=true)
fold_batch_norms
fold_old_batch_norms'
答案 2 :(得分:-1)
这里没有灵丹妙药。如果你想在GPU上快速运行推理,最好的办法是增加它处理的矩阵运算的大小,许多小型运算在GPU上表现得非常差。尝试将尽可能多的样本一起批处理,您将倾向于提高GPU利用率。如果您使用的是CPU,则可以将来电并行调整为sess.run
(https://www.tensorflow.org/versions/r1.3/programmers_guide/threading_and_queues)。