1. 批标准化
以下内容来源于Keras之父 弗朗索瓦• 肖莱(François Chollet)“Deep Learning with Python“,中译《Python深度学习》
标准化(Normalization)是一大类方法,用于让机器学习模型看到的不同样本彼此之间更加相似,这有助于模型的学习与对新数据的泛化。最常见的数据标准化形式就是将数据减去其平均值使其中心为0,然后将数据除以其标准差使其标准差为1。实际上,这种做法假设数据服从正态分布(也叫高斯分布),并确保让该分布的中心为0,同时缩放到方差为1。
normalized_data = (data - np.mean(data, axis=...)) / np.std(data, axis=...)
最简单的方法就是将数据输入模型之前对数据做标准化。但在网络的每一次变换之后都应该考虑数据标准化。即使输入Dense 或Conv2D 网络的数据均值为0、方差为1,也没有理由假定网络输出的数据也是这样。
批标准化(batch normalization)是Ioffe 和Szegedy 在2015 年提出的一种层的类型(在Keras 、Tensorflow中是BatchNormalization),即使在训练过程中均值和方差随时间发生变化,它也可以适应性地将数据标准化。批标准化的工作原理是,训练过程中在内部保存已读取每批数据均值和方差的指数移动平均值。批标准化的主要效果是,它有助于梯度传播(这一点和残差连接很像),因此允许更深的网络。 对于有些特别深的网络,只有包含多个BatchNormalization 层时才能进行训练。例如,BatchNormalization 广泛用于Keras 内置的许多高级卷积神经网络架构,比如ResNet50、Inception V3 和Xception。BatchNormalization 层通常在卷积层或密集连接层之后使用。
conv_model.add(layers.Conv2D(32, 3, activation='relu'))
conv_model.add(layers.BatchNormalization())
dense_model.add(layers.Dense(32, activation='relu'))
dense_model.add(layers.BatchNormalization())
BatchNormalization 层接收一个axis 参数,它指定应该对哪个特征轴做标准化。这个参数的默认值是-1,即输入张量的最后一个轴。对于Dense 层、Conv1D 层、RNN 层和将data_format 设为"channels_last"(通道在后)的Conv2D 层,这个默认值都是正确的。但有少数人使用将data_format 设为"channels_first"(通道在前)的Conv2D 层,这时特征轴是编号为1 的轴,因此BatchNormalization 的axis 参数应该相应地设为1。
2. 深度可分离卷积
深度可分离卷积(Depthwise Separable Convolution),Keras中即(SeparableConv2D)对输入的每个通道分别执行空间卷积,然后通过逐点卷积(1×1 卷积)将输出通道混合,如下图所示。这相当于将空间特征学习和通道特征学习分开,如果你假设输入中的空间位置高度相关,但不同的通道之间相对独立,那么这么做是很有意义的。它需要的参数要少很多,计算量也更小,因此可以得到更小、更快的模型。因为它是一种执行卷积更高效的方法,所以往往能够使用更少的数据学到更好的表示,从而得到性能更好的模型。