神经网络笔记(四)——Spatial Batch Normalization & Spatial Group Normalization
这里我们跟着实验来完成Spatial Batch Normalization和Spatial Group Normalization,用于对CNN进行优化。
Spatial Batch Normalization
回忆之前普通神经网络的BN层,输入为$X_{input}=(N, D)$,输出形状也为$(N, D)$,其作用是将输入进行归一化然后输出。在这里,对于来自卷积层的数据$X_{input}=(N,C,H,W)$,其输出形状也为$(N,C,H,W)$,其中$N$是一个mini-batch的数据数量,$C$是特征映射(feature map)的数量,有几个感受野就会产生几个特征映射,而$(H, W)$则给出特征映射的大小。
如果特征映射是由卷积运算产生的,我们希望对各个特征C映射进行归一化,使得每个特征映射的不同图片(N)和一张图片内的不同位置(H,W)的统计学特征(均值、标准差等)相对一致。也就是说,spatial batch normalization为C个特征通道中的每一个都计算出来对应的均值和方差,而这里的均值和方差则是遍历对应特征通道中N张图片和其空间维度(H,W)计算得出的。可以理解为之前的D是这里的$C$,之前的N在这里则是$N\times H \times W$。
前向传播
对输入$X_{input}=(N, C, H, W)$转置为维度$(N\times H\times W, C)$,转化成普通的BN层输入并传递给普通(vanilla)BN层的前向传播函数,再对输出转化成对应的$(N, C, H, W)$。代码如下:
|
|
反向传播
|
|
Spatial Group Normalization
Spatial Group Normalization可看作解决Layer Normalization在CNN上的表现不能够像Batch Normalization一样好的问题的方案。
前向传播
仿照论文中的代码实现:
|
|
反向传播
参考了这篇博客。求导并不复杂,代码实现起来难度较大。
|
|