tf中的batchnorm
1. 使用batchnorm目的
- 在使用sigmoid函数时,在函数两端的梯度几乎为0,位于这部分区间的数据参数更新很慢。利用
normalization可以把之前数据的分布平移缩放到0附近,这样有利于数据参数更新 - image Normalization(图片数据规整化)
def normalize(x, mean, std):
x = x - mean
x = x / std
return x
2. 常见Normalization([N, C, H*W])
- Batch Norm:在C(通道维)计算均值和方差用于Normalization
- Layer Norm:在N(实例维)计算均值和方差用于Normalization
- Instance Norm:在N上的每个C上计算均值和方差用于Normalization
3. Batch normalization
- 通过计算出的均值和方差将数据规整化
z
ˇ
i
=
z
i
−
μ
σ
\check z^i = \frac{z^i -\mu}{\sigma}
zˇi=σzi−μ
- 通过学习而得的参数(学习而得的均值和方差)将数据规整化,使其服从N(
β
\beta
β
,
γ
, \gamma
,γ)分布
z
^
i
=
γ
⨀
z
ˇ
i
+
β
\hat z^i = \gamma \bigodot \check z^i+\beta
z^i=γ⨀zˇi+β
4. TensorFlow中Batch normalization实现
- 使用函数net = layers.BatchNormalization()实现,其中默认的四个参数分别如下所示
axis=-1 表示在哪个轴上做normalization
center=True 表示是否使用
β
\beta
β参数
scale=True 表示是否使用
γ
\gamma
γ参数
trainable=True 表示
β
\beta
β,
γ
\gamma
γ参数是否需要反向传播
5. 使用Batch normalization好处
- 收敛速度更快
- 得到更好的结果
- 模型更稳定(减少因学习率导致梯度导致参数不更新的可能),可以使用更大的学习率