首页 > 技术文章 > TensorFlow——批标准化

digger72 2020-10-27 11:13 原文

标准化

传统机器学习中标准化也叫做归一化,一般是将数据映射到指定的范围,用于去除不同维度数据的量纲以及量纲单位。
数据标准化让机器学习模型看到的不同样本彼此之间更加相似,有助于模型的学习与对新数据的泛化。

常见的数据标准化形式

  • 标准化:减均值除方差—>均值为0,标准差为1
  • 归一化:(数据-最小值)/(最大值-最小值)

批标准化

不仅在将数据输入模型之前对数据做标准化。
在网络的每一次变换之后都应该考虑数据标准化。
结果:在训练过程中均值和方差随时间发生变化,可以适应性得将数据标准化。
解决的问题:梯度消失与梯度爆炸(每层乘的系数过小或过大)
在这里插入图片描述
在这里插入图片描述
好处

  • 具有正则化效果----抑制过拟合
  • 提高模型泛化能力
  • 允许更高的学习速率从而加速收敛
  • 有助于梯度传播,允许使用更深的网络

批标准化实现过程

  1. 求每一个训练批次数据的均值
  2. 求每一个训练批次数据的方差
  3. 数据进行标准化
  4. 训练参数γ,β
  5. 输出y通过γ与β的线性变换得到原来的数值

批标准化的预测过程

模型训练时记录每个batch的均值和方差,训练完后,求整个训练样本的均值和方差期望值,作为预测时进行批标准化的均值和方差。

批标准化的使用位置

training:Python布尔值,指示图层应在训练模式还是推理模式下运行。
training=True :该层将使用当前批输入的均值和方差对其进行标准化。
training=False :该层将使用在训练期间学习的移动统计数据的均值和方差来标准化其输入。
放在激活函数之后效果可能会更好

示例

基于卫星数据分类模型修改
增加BN层这种写法为论文中推荐写法,也可先激活再批标准化。

model = tf.keras.Sequential() # 顺序模型
model.add(tf.keras.layers.Conv2D(64,(3,3),input_shape = (256,256,3)))
model.add(tf.keras.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.Conv2D(64,(3,3)))
model.add(tf.keras.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(128,(3,3)))
model.add(tf.keras.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.Conv2D(128,(3,3)))
model.add(tf.keras.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(256,(3,3)))
model.add(tf.kears.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.Conv2D(256,(3,3)))
model.add(tf.keras.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(512,(3,3)))
model.add(tf.kears.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.Conv2D(512,(3,3)))
model.add(tf.keras.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.MaxPooling2D())
model.add(tf.keras.layers.Conv2D(1024,(3,3)))
model.add(tf.kears.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(1024))
model.add(tf.keras.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.Dense(256))
model.add(tf.kears.layers.BatchNormalization()) # 批标准化层
model.add(tf.keras.layers.Activation('relu')) # 激活层

model.add(tf.keras.layers.Dense(1,activation='sigmoid')) # 二分类问题,逻辑回归问题

推荐阅读