batch normalization中的moving average

本文详细介绍了BatchNormalization技术在训练过程中的应用。通过使用mini-batch计算的均值和方差进行数据标准化,加速训练过程并提高模型性能。文章还讨论了在测试阶段如何利用训练过程中累积的均值和方差来实现快速标准化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

训练时使用一个minibatch的训练数据计算均值和方差然后标准化数据,在test的时候我们也希望作相同的处理,比较直接的方法是在训练集上重新计算一遍统计量,但是,如果有1000w数据,这种计算就比较花费时间,而test的速度越快越好,所以在训练的时候,顺便就把均值和方差计算出来了,当然不是精确值,是近似值,这就是moving average。


running_mean = momentum * running_mean + (1 - momentum) * sample_mean
running_var = momentum * running_var + (1 - momentum) * sample_var

可以理解为每次更新running mean相当于把之前的值衰减一些(* momentum),然后把当前的minibatch sample mean加进去一部分(* (1-momentum))。其实也就是一阶指数平滑平均
var同理,两个值在训练迭代过程中相当于是在不断的moving。完全是经验主义,没什么道理可讲,所以batch normalization本身是个次优的normalization,可能今后会被更优的normalization模型所取代。

在test时,直接使用训练得到的running mean/var标准化数据:

x_stand = (x - running_mean) / np.sqrt(running_var)
out = x_stand * gamma + beta


转自:https://www.zhihu.com/question/55621104

尽管 `tf.contrib.layers.batch_norm` 曾经是一个广泛使用的批量标准化方法,但在 TensorFlow 2.x 版本中,`contrib` 模块已被移除。因此,在较新的版本中推荐使用其他替代方案来实现批处理规范化。 ### 使用 Keras 层中的 Batch Normalization 在 TensorFlow 2.x 中,Keras 已被完全集成到 TensorFlow 中,并提供了更简洁和功能强大的 API 来构建模型。可以使用 `tensorflow.keras.layers.BatchNormalization` 实现相同的功能: ```python import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(input_dim,)), tf.keras.layers.BatchNormalization(), # 添加批量归一化层 tf.keras.layers.Dense(output_dim, activation='softmax') ]) ``` 上述代码展示了如何通过 Keras Sequential 模型添加批量归一化层[^2]。 ### 手动应用 Batch Normalization 如果需要手动控制批量归一化的操作过程,则可以通过以下方式实现: ```python def batch_norm_manual(x, is_training, decay=0.99, epsilon=1e-5): shape = x.get_shape().as_list() n_out = shape[-1] beta = tf.Variable(tf.zeros([n_out])) gamma = tf.Variable(tf.ones([n_out])) moving_mean = tf.Variable(tf.zeros([n_out]), trainable=False) moving_variance = tf.Variable(tf.ones([n_out]), trainable=False) def mean_var_with_update(): axes = list(range(len(shape) - 1)) batch_mean, batch_var = tf.nn.moments(x, axes) update_moving_mean = moving_averages.assign_moving_average(moving_mean, batch_mean, decay) update_moving_variance = moving_averages.assign_moving_average( moving_variance, batch_var, decay) with tf.control_dependencies([update_moving_mean, update_moving_variance]): return tf.identity(batch_mean), tf.identity(batch_var) mean, var = tf.cond(is_training, true_fn=mean_var_with_update, false_fn=lambda: (moving_mean, moving_variance)) normalized_x = tf.nn.batch_normalization(x, mean, var, beta, gamma, epsilon) return normalized_x ``` 此函数实现了类似于原生 `batch_norm` 的行为,允许用户自定义训练阶段的行为以及参数更新逻辑[^3]。 ### 总结 对于现代 TensorFlow 开发者来说,建议优先采用内置的 Keras 层级接口 (`BatchNormalization`) 进行快速开发;而对于高级需求或者定制化场景下,可以选择编写自己的批量归一化实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值