如何进行 batch normalization 2d 的计算?

本文深入探讨BatchNormalization在深度学习中的应用,特别是在图像处理中的二维BatchNormalization。解释了均值和方差的计算维度,以及其在不同通道上的作用,帮助理解为何BatchNormalization能改善训练效果。

Batch Noramlization 基本算是深度学习的标准配置了。
原文链接

在看文章时,关于如何计算有一点疑惑。
在这里插入图片描述
虽然就是上面这个公式,但是这个均值和方差到底是啥,或许有人和我一样还是有一点疑惑。

准确来说,这个均值和方差的维度是什么?

以二维batch Normalization 为例,结合 pytorch 程序,本文说一下相关内容。

pytorch的 Batch Normalization 官网

具体来说,输入是一个4维tensor, N , C , H , W N, C, H, W N,C,H,W 分别表示 batch size, channels,Height,Width。
那么对应的,均值的维度就是 C C C.

看到这里,可能有人表示疑问,尤其是从Batch Normalization 论文直接过来的小伙伴。如何理解公式中的维度。
在这里插入图片描述
上面那个是batch Normalization论文中的公式,但是我们还是要来理解一下公式的意思。
公式中的K就是维度信息,但是一定要明白,我们运行程序时的维度和这个维度有什么区别。
通常我们在程序中是4维输入,分别是batch size, channels, height, width。 但是我们算法中并不是这样的意思。这一点通常使我们有误解,并造成一些困惑,我希望在这里能够让各位明白。并且,实际上我们说在图像处理中,我们的batch Normalization是2d,在视频中是3d

务必清楚:
1.batch size不是一个维度,而是表示一个个的输入。在公式中,上标表示维度,下标才是输入的数据标号。
2.我们说的二维是讲channel看成一个维度,height和width组成另一个维度。这一点在很多文章中都是有体现的,默认的,我们都会认为height和width组成一个维度,而不是两个维度。
3.batch Normalization就是在height和width组成的维度上计算均值和方差。

我们回头再解释一下程序中这个均值的 C C C 维度到底是什么意思。
Batch Noramlization 是想让输入满足同一个分布, 那么是让输入的什么特征满足同一分布呢?这么说有点晕,可以这么理解,这里我就只说正确答案了。那就是让每张图片的相同通道的所有像素值的均值和方差相同。比如我们有两张图片(都为3通道),我们现在只说R通道,我们希望第一张图片的R通道的均值 和 第二张图片R通道的均值相同,方差同理

这样我们也就知道了实际运行过程中均值是如何计算的,可以有两种方法,把所有图片的相同通道的值相加,然后求平均数,也可以先求出每一个图片此通道的均值,然后再求所有图片此通道均值的均值。

以上也就解释了为什么batch Normalization在 batch size较小的时候会出现的问题,我们可以考虑当batch size就是1的时候,batch Normalization就没有意义了,不发挥什么作用,因为这时就相当于对一张图片的某通道归一化(当然,这也有一定作用,不会使某些数过大或过小,从而导致梯度饱和)。

以上问题也就引发了很多其他的Normalization方法,比如当batch size较小时我们怎么办?

回过头来,我们注意到,所谓的batch normalization 2d是对很多二维矩阵求一个均值和方差,请在脑中想象分别取出每一张图片的R通道 并 叠放在一起,然后对这所有元素求均值和方差。当我们图片是3通道的时候,我们就会有3个均值和方差。

再把通道扩展到feature maps, batch Normalization 就是希望处理相同分布的feature。

从以上分析中,我还想再说一句,那就是batch Normalization 不只是为抑制梯度饱和,而是为了使每一个卷积处理相同的分布。毕竟,如果只是为了抑制梯度饱和,我们只需要对每一次输入都做一次归一化(仅对一张图片)。因此,batch normalization 叫做 批归一化

### TensorFlow BatchNormalization 和 PyTorch BatchNorm2d 的主要区别 #### 定义与功能 Batch Normalization 是一种用于加速神经网络训练的技术,通过规范化每一层输入数据的分布来减少内部协变量偏移。TensorFlow 中的 `tf.keras.layers.BatchNormalization` 和 PyTorch 中的 `nn.BatchNorm2d` 都实现了这一技术,但在实现细节上有显著差异。 --- #### 参数设置的区别 1. **动量参数 (Momentum)** - 在 TensorFlow 中,`momentum` 被定义为指数加权平均中的权重衰减因子,默认值通常为 0.99[^2]。 - 在 PyTorch 中,类似的参数被称为 `momentum`,但它表示的是更新移动均值和方差的比例,默认值为 0.1[^3]。这意味着两者的行为不同:TensorFlow 使用较大的权重保留历史统计信息,而 PyTorch 更倾向于快速适应新的统计数据。 2. **epsilon 值** - TensorFlow 默认的 epsilon 值为 \(1e^{-3}\)[^4],这是一个相对较高的数值,旨在防止除零错误。 - PyTorch 则默认使用更小的 \(1e^{-5}\),这可能更适合某些对精度敏感的任务[^5]。 --- #### 训练模式与推理模式 - **TensorFlow**: 在训练阶段,`BatchNormalization` 层会计算当前批次的数据均值和方差;而在推断阶段,则依赖于训练过程中累积的全局均值和方差。这种切换由 Keras 的 `training=True/False` 参数控制[^6]。 - **PyTorch**: 类似地,在训练期间调用 `.train()` 方法时,`BatchNorm2d` 将基于每一批次动态调整其统计特性;进入评估状态(`.eval()`)后则改用预估的整体均值和标准差[^7]。 --- #### 维度支持的不同 - **TensorFlow** 支持多种维度形式下的批标准化操作,例如对于卷积层可以指定 axis 来适配不同的通道位置(如 channels_last 或 channels_first)。它还提供了灵活接口允许自定义归一化轴线[^8]。 - **PyTorch** 主要针对 NCHW 数据格式设计了专门版本——即 `BatchNorm2d` 特定适用于二维空间上的特征图处理场景[^9]。如果需要其他类型的批量正则化,则需选用相应类目比如 `BatchNorm1d`, `BatchNorm3d`. --- #### 性能优化方面 - **TensorFlow** 提供了一些高级选项以便更好地融合到整个框架生态体系之中,包括但不限于分布式环境下的同步 BN 实现以及混合精度训练的支持等功能扩展[^10]。 - **PyTorch** 同样具备良好的性能表现,并且由于其实现简洁高效,在许多情况下能够达到甚至超越 TF 的速度水平[^11]。此外,PT 还内置了 CUDA 加速机制进一步提升 GPU 上运行效率。 ```python import torch.nn as nn bn_pytorch = nn.BatchNorm2d(num_features=64) from tensorflow.keras.layers import BatchNormalization bn_tensorflow = BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001) ``` --- #### 初始化方式对比 两者的初始化过程也存在细微差别: - 对于 PyTorch ,可以通过传递额外的关键字参数来自由设定 gamma(缩放系数) beta(位移项)初始值等属性[^12]; - TensorFlow 则采用更加直观的方式完成相同目的—直接修改对应成员变量即可[^13]。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值