【Batch Normalization 在CNN中的实现细节】

整天说Batch Norm,CNN的论文里离不开Batch Norm。BN可以使每层输入数据分布相对稳定,加速模型训练时的收敛速度。但BN操作在CNN中具体是如何实现的呢?

1. BN在MLP中的实现步骤

首先快速回顾下BN在MLP中是怎样的,步骤如下图:
在这里插入图片描述
图片来源:BN原论文

一句话概括就是对于每个特征,求一个batch求均值和方差。然后该特征减去均值除以标准差,再进行一个可以学习参数的线性缩放(即乘以γ加上β)即可。本质上是对输入进行线性缩放,使得每层的输入数值分布相对稳定。

在MLP中更具体的实现可以参考BN原论文,也可以看这篇讲解——Batch Normalization原理与实战,写得非常清楚。

2. BN在CNN中的实现细节

其实本质上还是对于每层进行线性缩放,使得每层的数据分布相对稳定。但由于MLP中的一层是一个1D的向量,而CNN的每一层是一个3D的tensor,所以具体实现细节还是有差异的。
在这里插入图片描述
在这里插入图片描述
整体过程还是和上面的步骤一致:

2.1 训练过程

在这里插入图片描述
只是我们不在对每个特征,求一个batch的均值和方差;而是对每个feature map,求一个batch的均值和方差

也可以这么表述:MLP是对在特征维度(即每个神经元)求均值和方差,而CNN是在通道(channel)维度(即每个feature map)求均值和方差。

表述得更清楚一些:

在这里插入图片描述
上图中红框圈出的是CNN的一层,形状是(C, H, W),其中,C是通道个数(即feature map的数量),H和W是feature map的长和宽。我们可以这么理解:CNN的一层是一个3D的矩阵,是由C层2D的feature map组成的。

若一个batch有N张图片,则红框圈出的一层的形状为(N, C, H, W),即共有NxCxHxW个数值。

在训练时,BN做的就是在该batch中,对该层每一个feature map的所有数据(即第二个维度C,共有C个feature map),求均值和方差。即对NxHxW个数据求均值μ和方差σ。【一个feature map有HxW个数据,一个batch中有N张图片】即对第i个feature map,有与之对应的μ_i和σ_i

因为一层有C个feature map,所以就共有C个μ_i和σ_i。i∈[1, C]

其余过程就和MLP一样了:第i个feature map每个元素减去对应的均值μ_i除以标准差,然后再进行一个可以学习参数的线性缩放(即乘以γ加上β)即可。

2.2 前向推断过程

和MLP一样,在训练过程中,每个batch都会求出C个均值和方差(因为每个feature map都会有一个均值和方差)。

而在前向推断过程,则对于所有的batch的每个feature map的均值和方差做平均,论文中是求出所有均值的期望和方差的无偏估计,如下:
在这里插入图片描述
得到前向推断时每一层feature map的均值μ_i_test和方差σ_i_test。然后第i个feature map每个元素减去对应的均值μ_i_test除以标准差,然后再进行一个的线性缩放(即乘以γ加上β)即可。其中γ和β是训练过程已经训练好的。

总而言之:MLP是对在特征维度(即每个神经元)对一个batch求均值和方差,而CNN是在通道(channel)维度(即每个feature map)对一个batch求均值和方差。

END:)

总觉得文字还是无法完全把我的想法表述清楚,最好的学习方法还是去看原论文,然后自己多琢磨。

参考:
1.【原论文】 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

2. Batch Normalization原理与实战

3. 【李沐老师课程】批量归一化【动手学深度学习v2】

### Batch Normalization 的作用 Batch Normalization (BN) 是一种用于加速深度神经网络训练的技术。它的主要目的是通过减少内部协变量偏移(Internal Covariate Shift),使得每一层的输入分布更加稳定,从而提升模型的学习效率和稳定性[^1]。具体来说: - **减少训练时间**:BN 减少了每一批次数据分布的变化,降低了网络对不同批次数据分布的适应需求,进而加快了训练速度[^3]。 - **增强模型鲁棒性**:通过对激活函数前的线性变换进行标准化,BN 提高了模型的泛化能力和稳定性。 此外,BN 对于多种类型的激活函数(如 sigmoid 和 ReLU)都能起到显著效果。 --- ### Global Average Pooling 的作用 Global Average Pooling (GAP) 是一种替代全连接层的方法,在卷积神经网络中被广泛采用。相比于传统的密集层(Dense Layer),GAP 主要具有以下几个优点: - **减小模型尺寸**:由于 GAP 不依赖额外的可学习参数,而是直接利用特征图的空间平均值作为输出,因此能够大幅降低模型复杂度和存储开销[^2]。 - **防止过拟合**:相比容易引起过拟合的传统全连接结构,GAP 更倾向于提取全局语义信息而非局部细节,有助于改善模型的泛化性能。 在实际应用中,GAP 能够有效地将空间维度压缩成单一数值向量,便于后续分类或其他任务操作。 --- ### Dense 层的作用 Dense 层也被称为全连接层(Fully Connected Layer, FC)。它是传统多层感知机的核心组成部分之一,在 CNN 中通常位于最后几层位置执行最终决策功能。以下是 dense 层的主要特点及其意义所在: - **映射到目标类别**:dense 层负责接收来自前面卷积或池化阶段产生的高级抽象特征表示,并将其转换为目标标签对应的概率分布形式以便完成预测工作。 下面给出一段简单的实现代码展示如何构建包含这些组件在内的典型 CNN 架构: ```python import tensorflow as tf from tensorflow.keras import layers, models model = models.Sequential() # 添加卷积层与最大池化层... model.add(layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D(pool_size=(2, 2))) # 应用 batch normalization ... model.add(layers.BatchNormalization()) # 使用 global average pooling 替代 flatten+dense 组合 model.add(layers.GlobalAveragePooling2D()) # 输出层 - 密集层设置为 softmax 分类器 model.add(layers.Dense(10, activation='softmax')) ``` 上述例子展示了如何组合使用 Convolutional Layers、Max-Pooling、BatchNorm、以及 GAP 加上 Dense 来搭建完整的图像识别系统框架。 --- ### 总结 综上所述,Batch Normalization 可以帮助缓解梯度消失/爆炸现象并促进更快收敛;而 Global Average Pooling 则提供了一种轻量化且高效的方式来取代常规 Fully Connected 结构;至于 Dense 层则是整个流程中的关键环节用来做最后一公里的数据解析与判断逻辑封装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SinHao22

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值