Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
tensorflow如何将batchnorm合并到卷积中以实现更快的推理_Tensorflow - Fatal编程技术网

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

tensorflow如何将batchnorm合并到卷积中以实现更快的推理,tensorflow,Tensorflow,有没有一种方法(代码脚本)可以将tensorflow batchnorm和dropout层合并到推理中的卷积层,从而加快计算速度 我搜索了一段时间,但没有得到相关的答案。据我所知,TensorFlow中没有用于折叠批次规范化的内置功能。话虽如此,手动操作并不难。需要注意的是,没有折叠辍学这样的事情,因为辍学只是在推理时被停用 要折叠批次标准化,基本上有三个步骤: 给出一个TensorFlow图,过滤需要折叠的变量 折叠变量 使用折叠的变量创建一个新图形 我们需要过滤需要折叠的变量。当使用批标准化

有没有一种方法(代码脚本)可以将tensorflow batchnorm和dropout层合并到推理中的卷积层,从而加快计算速度


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

据我所知,TensorFlow中没有用于折叠批次规范化的内置功能。话虽如此,手动操作并不难。需要注意的是,没有折叠辍学这样的事情,因为辍学只是在推理时被停用

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

  • 给出一个TensorFlow图,过滤需要折叠的变量
  • 折叠变量
  • 使用折叠的变量创建一个新图形
  • 我们需要过滤需要折叠的变量。当使用批标准化时,它创建的变量的名称包含
    moving\u mean
    moving\u variance
    。您可以使用它相当容易地从使用批处理规范的层中提取变量

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

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

    整个代码应该如下所示。根据批次标准使用的参数,图形可能没有
    gamma
    beta

    #*****(1)获取变量******
    variables={v.name:session.run(v)for tf.global_variables()中的v
    #******(2)折叠变量******
    折叠的_变量={}
    对于变量中的v.keys():
    如果不是v.endswith('moving_variance:0'):
    持续
    n=get_layer_name(v)#“model/conv1/moving_variance:0”-->“model/conv1”
    W=变量[n+'/权重:0']#或“/内核:0”等。
    b=变量[n+'/偏差:0']#如果之前存在偏差
    gamma=变量[n+'/gamma:0']
    beta=变量[n+'/beta:0']
    m=变量[n+'/移动平均值:0']
    var=变量[n+'/移动的方差:0']
    #折叠批量范数
    W_new=伽马*W/var
    b#u new=伽马*(b-平均值)/var+beta#如果没有偏差,则删除'b'
    折叠的_变量[n+'/权重:0']=W_新
    折叠变量[n+'/偏差:0']=b_新
    #******(3)创建新图形******
    new_graph=tf.graph()
    新建会话=tf.session(图=新建图)
    网络=…#添加偏差的实例批处理无范数图。
    #注意,名称应与原始模型匹配
    对于tf.global_变量()中的v:
    尝试:
    新建会话。运行(v.assign(折叠的变量[v.name]))
    除:
    new_session.run(v.assign(变量[v.name]))
    
    tensorflow提供了一个工具,可以优化经过培训的冻结图形,以进行推理:

  • 下载tensorflow源代码
  • 构建图形转换工具

    bazel build tensorflow/tools/graph_transforms:transform_graph
    
  • 冻结图表。e、 g

  • 运行以下命令:

    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'
    

  • 我将在这里为其他人添加一行,因为我花了一些时间才理解您的解决方案。x'=Wx+b。在批量标准中,在测试过程中,我们将x'更改为(x'-总体平均值)/总体变量*量表+β。现在,通过用Wx+b替换x',我们可以看到@BiBi定义的新的_权重实际上是有意义的。看看批处理范数转换来理解折叠可能确实有帮助。非常感谢。嘿,我在这里做同样的事情,我在这里绊倒了阿克罗斯。我试着在折叠前后得到相同的结果,发现结果与你的公式不符。看看batchnorm是如何计算的(),我意识到您缺少了sqrt和ε<代码>w_new=gamma*w/np.sqrt(var+epsilon);b_new=gamma*(b-均值)/np.sqrt(var+epsilon)+beta)