怎么样在tensorflow中使用batch normalization( 二 )


■网友
之前也有和题主一样的疑问 找了好几个之后 暂时这个用的还好
def batch_norm_layer(x, train_phase, scope_bn): with tf.variable_scope(scope_bn): beta = tf.Variable(tf.constant(0.0, shape=]), name=\u0026#39;beta\u0026#39;, trainable=True) gamma = tf.Variable(tf.constant(1.0, shape=]), name=\u0026#39;gamma\u0026#39;, trainable=True) axises = np.arange(len(x.shape) - 1) batch_mean, batch_var = tf.nn.moments(x, axises, name=\u0026#39;moments\u0026#39;) ema = tf.train.ExponentialMovingAverage(decay=0.5) def mean_var_with_update(): ema_apply_op = ema.apply() with tf.control_dependencies(): return tf.identity(batch_mean), tf.identity(batch_var) mean, var = tf.cond(train_phase, mean_var_with_update, lambda: (ema.average(batch_mean), ema.average(batch_var))) normed = tf.nn.batch_normalization(x, mean, var, beta, gamma, 1e-3) return normed

■网友
使用slim.batch_norm(input,is_training=True)
怎么样在tensorflow中使用batch normalization

还要加下面这几句话。
不知道说的对不对,如果有错误,请大家指正。

■网友
参考了前两位高票的回答, 这是我写的. 同时我用mnist作为数据集,和一个三层的全链接网络进行了对比实现. 发现自己实现的训练和测试的效果都很好,能达到0.98. 但是用tensorflow自带的两个常用的api ``tf.layers.batch_normalization``训练效果不错0.98,测试只有0.5左右. 如果我自己实现的不加 beta 和 gamma, 那么效果和官方 api 一致,测试也只有0.5. 但是看了原 paper,在测试阶段也是要考虑 beta 和 gamma的. 所以tf中的 api 有问题?
batch_norm.py def batch_norm_mine(self, inputs, is_training=True, epsilon=1e-8, decay = 0.9): with tf.variable_scope("batch-normalization"): pop_mean = tf.Variable(tf.zeros(]), trainable=False, name="pop-mean") # pop_var = tf.Variable(tf.ones(]), trainable=False, name="pop-var") def mean_and_var_update(): axes = list(range(len(inputs.get_shape()) - 1)) batch_mean, batch_var = tf.nn.moments(inputs, axes, name="moments") # with tf.control_dependencies(): return tf.identity(batch_mean), tf.identity(batch_var) mean, variance = tf.cond(is_training, mean_and_var_update, lambda:(pop_mean, pop_var)) beta = tf.Variable(initial_value=https://www.zhihu.com/api/v4/questions/53133249/tf.zeros(inputs.get_shape()), name="shift") gamma = tf.Variable(initial_value=https://www.zhihu.com/api/v4/questions/53133249/tf.ones(inputs.get_shape()), name="scale") return tf.nn.batch_normalization(inputs, mean, variance, beta, gamma, epsilon)
■网友
martin-gorner/tensorflow-mnist-tutorial, 这里有使用batch normalization的示例

■网友
slim中有slim.batch_norm函数可以直接调用,绝大部分层定义函数(比如slim.conv2d, slim.maxpool_2d)都有normalizer_fn这个参数,可以用arg_scope快速整理所有的这些层默认使用bn


推荐阅读