介绍
在训练模型的时候,对于一个网络来说:
- 前部:数据集中在前部,网络前面的层变化,则会导致后面的层也跟着变化->收敛速度慢
- 后部:损失是集中在网络后面的,所以往往后面的层训练较快
那有没有一种方式,使网络后面的层尽量保持不变呢?
批量归一化
定义
通过固定小批量数据的均值和方差,再引入可学习参数 γ 和 β 对数据进行调整,有助于加速模型的训练收敛,提高模型的稳定性 。
计算小批量均值和方差的公式:
然后对其做额外的调整:
不再学习均值和方差,转而学习参数 γ 和 β
作用位置
- 作用在
- 全连接层和卷积层输出上,激活函数前
- 全连接层和卷积层输入上
- 对全连接层,作用在特征维
- 对于卷积层,作用在通道维
实现
1 | net = nn.Sequential(nn.Conv2d(1, 6, kernel_size=5), nn.BatchNorm2d(6), |
拉伸参数 gamma
和偏移参数 beta
1 | net[1].gamma.reshape((-1,)), net[1].beta.reshape((-1,)) |
(tensor([2.1534, 2.1612, 2.0096, 1.9473, 1.8451, 1.3328], device=‘cuda:0’,
grad_fn=
tensor([ 0.0310, -2.4748, 0.5816, 0.5764, -1.6917, -0.6970], device=‘cuda:0’,
grad_fn=
总结
- 批量归一化固定小批量中的均值和方差,然后学习出适合的偏移和缩放
- 可以加速收敛速度,但一般不改变模型精度
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 邢子晗's Blog!
评论