tensorflow如何将batchnorm合并到卷积中以实现更快的推理
有没有一种方法(代码脚本)可以将tensorflow batchnorm和dropout层合并到推理中的卷积层,从而加快计算速度tensorflow如何将batchnorm合并到卷积中以实现更快的推理,tensorflow,Tensorflow,有没有一种方法(代码脚本)可以将tensorflow batchnorm和dropout层合并到推理中的卷积层,从而加快计算速度 我搜索了一段时间,但没有得到相关的答案。据我所知,TensorFlow中没有用于折叠批次规范化的内置功能。话虽如此,手动操作并不难。需要注意的是,没有折叠辍学这样的事情,因为辍学只是在推理时被停用 要折叠批次标准化,基本上有三个步骤: 给出一个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提供了一个工具,可以优化经过培训的冻结图形,以进行推理:
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'
我将在这里为其他人添加一行,因为我花了一些时间才理解您的解决方案。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)