【深度学习框架Keras】Batch Normalization与深度可分离卷积

说明:

主要参考Francois Chollet《Deep Learning with Python》;

一、Batch Normalization

在训练神经网络时,对输入进行normalization可以提高训练的速度。但是在只对输入normalization是不够的,那么如果对各个隐藏层进行normalization呢?这就是batch normalization的作用。batch normalization主要的效果是,有助于梯度传播,因此可以允许更深的网络。对于某些特别深的网络,只有包含多个BatchNormalization层时才能进行训练。
BatchNormalization层通常在卷积层或密集连接层之后使用。

from keras import layers
# 在卷积层后加入BatchNormalization层
conv_model.add(layers.Conv2D(32,3,activation='relu'))
conv_model.add(layers.BatchNormalization())
# 在全连接层后加上BatchNormalization层
dense_model.add(layers.Dense(32,activation='relu'))
dense_model.add(layers.BatchNormalization())

二、深度可分离卷积

深度可分离卷积层对每个channel分别执行卷积,然后通过逐点卷积将这些输出混合。这相当于将空间特征和channel特征的学习分开。如果你的输入在空间位置高度相关,但不同的通达之间相对独立,那么这种做法可以减少参数数量,降低计算量。
因此,深度可分离卷积可以更加的轻量、速度更快,有时还能让任务的性能提升。
【深度学习框架Keras】Batch Normalization与深度可分离卷积

一个应用深度可分离卷积层的示例

from keras.models import Sequential,Model
from keras import layers

height = 64
width = 64
channels = 3
num_classes = 10

model = Sequential()
model.add(layers.SeparableConv2D(32,3,activation='relu',input_shape=(height,width,channels,)))
model.add(layers.SeparableConv2D(64,3,activation='relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64,3,activation='relu'))
model.add(layers.SeparableConv2D(128,3,activation='relu'))
model.add(layers.MaxPooling2D(2))

model.add(layers.SeparableConv2D(64,3,activation='relu'))
model.add(layers.SeparableConv2D(128,3,activation='relu'))
model.add(layers.GlobalAveragePooling2D())

model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(num_classes,activation='softmax'))

model.compile(optimizer='rmsprop',loss='categorical_crossentropy')