TF05——批标准化


TF05——批标准化

批标准化(Batch Normalization,BN)

神经网络对0附近的数据更敏感,但是随着网络层数的增加,特征数据会出现偏离0均值的过程,标准化可以使数据符合以0为均值,1为标准差的分布,把偏移的特征数据重新拉回到0附近

标准化:使数据符合0为均值,1为标准差的分布

批标准化:对一小批数据(batch),做标准化处理

批标准化后,第k个卷积核的输出特征图(feature map)中,第i个像素点(常用在卷积操作和激活操作之间)

可以通过以下式子,计算皮标准化后的输出特征图

\[H_{i}^{'k}=\frac{H_{i}^{k}-\mu _{batch}^{k}}{\sigma_{\text {batch }}^{k}} \]

\(H_{i}^{k}\):批标准化前,第k个卷积核,输出特征图第i个像素点

\(\mu _{batch}^{k}\):批标准化前,第k个卷积核,batch张输出特征图第i个像素点平均值

$ \sigma_{\text {batch }}^{k}$:批标准化前,第k个卷积核,batch张输出特征图第i个像素点标准差

\[\mu_{\text {batch }}^{k}=\frac{1}{m} \sum_{i=1}^{m} H_{i}^{k} \]

\[\sigma_{\text {batch }}^{k}=\sqrt{\sigma+\frac{1}{m} \sum_{i=1}^{m}\left(H_{i}^{k}-\mu_{\text {batch }}^{k}\right)^{2}} \]

\(H^{‘}\)表示第k个卷积核,输出特征图中的第i个像素点,批标准化操作会让每个像素点进行减均值除以标准差的自更新计算,对于第k个卷积核,batch张输出特征图中所有数值的平均值和标准差,是对第k个卷积核产生的batch张输出特征图,集体求均值和标准差,对于\(\mu\)\(\sigma\)就是对第k个卷积核计算出来的batch张输出特征图中的所有像素点求均值和标准差

image-20220320102942681

BN操作将原本偏移的特征数据,重新拉回到0均值,是进入激活函数的数据分布在激活函数的线性区,使得输入数据的微小变化,更明显的体现到激活函数的输出,提升了激活函数对输入数据的区分力

image-20220320104921783

但是这种简单的特征数据标准化,使特征数据完全满足标准正态分布,集中在激活函数函数中心的线性区域,使激活函数丧失了非线性特性,因此再BN操作中为每个卷积核引入了两个可训练参数

  • 为每个卷积核引入可训练参数\(\gamma\)(缩放因子)和(偏移因子)\(\beta\),调整批归一化的力度

反向传播时,\(\gamma\)(缩放因子)和(偏移因子)\(\beta\)会与其他待训练参数一同被训练优化,使标准正态分布后的特征数据通过缩放因子和偏移因子,优化了特征数据分布的宽窄和偏移量,保证了网络的非线性表达力

image-20220320105912404

  • BN层位于卷积层之后,激活层之前

image-20220320110009980

Tensorflow提供了BN操作的函数BatchNormalization()

  • TF描述批标准化

tf.keras.layers.BatchNormalization()

model = tf.keras.model.Sequential([
    Conv2D(filters=6,kernel size=(5,5),padding='same'),#卷积层
    BatchNormalization()#BN层
    Activation('relu')#激活层
    MaxPool2D(pool_size=(2,2),strides=2,padding='same')#池化层
    Dropout(0,2)#dropoutc
])