批标准化层 tf.keras.layers.Batchnormalization()解析
作者:壮壮不太胖^QwQ
批标准化层 tf.keras.layers.Batchnormalization()
tf.keras.layers.Batchnormalization()
重要参数:
training
:布尔值,指示图层应在训练模式还是在推理模式下运行。training=True
:该图层将使用当前批输入的均值和方差对其输入进行标准化。training=False
:该层将使用在训练期间学习的移动统计数据的均值和方差来标准化其输入。
BatchNormalization 广泛用于 Keras 内置的许多高级卷积神经网络架构,比如 ResNet50、Inception V3 和 Xception。
BatchNormalization 层通常在卷积层或密集连接层之后使用。
批标准化的实现过程
- 求每一个训练批次数据的均值
- 求每一个训练批次数据的方差
- 数据进行标准化
- 训练参数γ,β
- 输出y通过γ与β的线性变换得到原来的数值
在训练的正向传播中,不会改变当前输出,只记录下γ与β。在反向传播的时候,根据求得的γ与β通过链式求导方式,求出学习速率以至改变权值。
对于预测阶段时所使用的均值和方差,其实也是来源于训练集。比如我们在模型训练时我们就记录下每个batch下的均值和方差,待训练完毕后,我们求整个训练样本的均值和方差期望值,作为我们进行预测时进行BN的的均值和方差。
批标准化的使用位置
原始论文讲在CNN中一般应作用与非线性激活函数之前,但是,实际上放在激活函数之后效果可能会更好。
# 放在非线性激活函数之前 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.Conv2D(64, (3, 3), activation='relu')) model.add(tf.keras.layers.BatchNormalization())
tf.keras.layers.BatchNormalization使用细节
关于keras中的BatchNormalization使用,官方文档说的足够详细。本文的目的旨在说明在BatchNormalization的使用过程中容易被忽略的细节。
在BatchNormalization的Arguments参数中有trainable属性;以及在Call arguments参数中有training。两个都是bool类型。第一次看到有两个参数的时候,我有点懵,为什么需要两个?
后来在查阅资料后发现了两者的不同作用。
1,trainable是Argument参数,类似于c++中构造函数的参数一样,是构建一个BatchNormalization层时就需要传入的,至于它的作用在下面会讲到。
2,training参数时Call argument(调用参数),是运行过程中需要传入的,用来控制模型在那个模式(train还是interfere)下运行。关于这个参数,如果使用模型调用fit()的话,是可以不给的(官方推荐是不给),因为在fit()的时候,模型会自己根据相应的阶段(是train阶段还是inference阶段)决定training值,这是由learning——phase机制实现的。
重点
关于trainable=False:如果设置trainable=False,那么这一层的BatchNormalization层就会被冻结(freeze),它的trainable weights(可训练参数)(就是gamma和beta)就不会被更新。
注意:freeze mode和inference mode是两个概念。
但是,在BatchNormalization层中,如果把某一层BatchNormalization层设置为trainable=False,那么这一层BatchNormalization层将一inference mode运行,也就是说(meaning that it will use the moving mean and the moving variance to normalize the current batch, rather than using the mean and variance of the current batch).
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。