tensorflow如何将batchnorm合并为卷积以实现更快的推理

时间:2018-03-28 14:11:52

标签: tensorflow

是否有一种方法(代码脚本)用于将张量流batchnorm和dropout层合并到卷积层中以进行更快的计算?

我已经搜索了一段时间,但没有得到相关的答案。

3 个答案:

答案 0 :(得分:4)

据我所知,TensorFlow中没有内置功能可用于折叠批处理规范化。话虽这么说,手动操作并不难。值得注意的是,没有 folding dropout 之类的东西,因为在推断时只是简单地停用了dropout。

要折叠批标准化,基本上有三个步骤:

  1. 给出TensorFlow图,过滤需要折叠的变量,
  2. 折叠变量,
  3. 使用折叠后的变量创建新图。

我们需要过滤需要折叠的变量。使用批处理规范化时,它将创建名称包含moving_meanmoving_variance的变量。您可以使用它从使用批处理规范的图层中轻松提取变量。

现在您知道哪些层使用了批处理规范,对于每个这样的层,您可以提取其权重W,偏差b,批处理规范方差v,均值{{1} },mgamma参数。您需要创建一个新变量来存储折叠后的权重和偏差,如下所示:

beta

最后一步是创建一个新图,在该图中我们停用批处理规范,并在必要时添加W_new = gamma * W / var b_new = gamma * (b - mean) / var + beta 变量-每个可折叠层都应如此,因为对批处理规范使用偏差是毫无意义的。

整个代码如下所示。根据用于批处理规范的参数,您的图形可能没有biasgamma

beta

答案 1 :(得分:0)

tensorflow提供了一个工具,可以优化训练后的冻结图进行推理:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md#fold_batch_norms

  1. 下载tensorflow源代码。
  2. 构建图形转换工具。

    bazel build tensorflow/tools/graph_transforms:transform_graph
    
  3. 冻结图形。例如https://blog.metaflow.fr/tensorflow-how-to-freeze-a-model-and-serve-it-with-a-python-api-d4f3596b3adc

  4. 运行此:

    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.runhttps://www.tensorflow.org/versions/r1.3/programmers_guide/threading_and_queues)。