如何在TensorFlow中的多gpu设置中使用批处理规范化?

如何在TensorFlow中的多gpu设置中使用批处理规范化?,tensorflow,Tensorflow,在上引用此帖子 我有一个类似于CIFAR10示例的多gpu设置。当我在网络定义中插入tf.contrib.layers.batch_norm时,我得到了一个平均梯度的非类型对象。具体来说,变量g是非类型 def平均梯度(塔梯度): 平均分=[] 对于zip中的渐变和渐变(*塔渐变): 年级=[] 对于g,在梯度和变量中: 扩展的尺寸(g,0) 梯度附加(扩展的) 梯度=tf.concat(0,梯度) 梯度=tf。减少平均值(梯度,0) v=梯度和变量[0][1] 梯度和变量=(梯度,v) 平均梯

在上引用此帖子

我有一个类似于CIFAR10示例的多gpu设置。当我在网络定义中插入tf.contrib.layers.batch_norm时,我得到了一个平均梯度的非类型对象。具体来说,
变量g
是非类型

def平均梯度(塔梯度):
平均分=[]
对于zip中的渐变和渐变(*塔渐变):
年级=[]
对于g,在梯度和变量中:
扩展的尺寸(g,0)
梯度附加(扩展的)
梯度=tf.concat(0,梯度)
梯度=tf。减少平均值(梯度,0)
v=梯度和变量[0][1]
梯度和变量=(梯度,v)
平均梯度。附加(梯度和变量)
返回平均分
一些关于如何在多gpu环境中运行批处理规范化的示例代码会有所帮助

编辑:


只需删除“batch_norm”变量即可解决此错误。然而,这里迫切的问题是,每个批标准化在每个GPU上都有一个beta和gamma,以及它们自己的移动平均值。在推断时,所有GPU上的所有移动平均值是如何解析的?

只需在GPU上独立使用BN,同时使用一个塔式方法更新移动平均值

with tf.device('..'):
  x,y = iterator.get_next()

  // NN with variables copied over to each of the GPUs
  loss = tower_loss(..)

  // use last tower statistics to update the moving mean/variance 
  batchnorm_updates = tf.get_collection(tf.GraphKeys.UPDATE_OPS, scope=scope)

apply_gradient_op = average_gradients(*grads)
batchnorm_updates_op = tf.group(*batchnorm_updates)
train_op = tf.group(apply_gradient_op, batchnorm_updates_op)

从多个评论中可以看出,这种简单的异步方法在大多数领域都能很好地发挥作用,但语义分割等问题除外,动作视频识别等。批量非常小,异步BN无法提供正常情况下的速度提升。

如果跳过所有无梯度,该怎么办?(从数学上讲,没有一个渐变等于0)。我使用了一些帮助程序,在某些时候用0替换所有的非,但是Gamma和Beta呢?每个GPU上都有唯一的gamma和beta(如果我在这一点上错了,请纠正我),这些gamma和beta必须在培训结束时以某种方式合并?每个
batch\u norm
op都有gamma和beta,因此如果每个GPU都有一个批次norm,将有一对对应的gammas和betasyeah,但在推理过程中如何解决它们?我可以假设contrib层会处理这个问题吗?我提出了一个问题。Tensorflow似乎还没有官方支持批量规范化。即使他们这样做了,也可能会对其内部进行大量优化。