【深度學習框架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特徵的學習分開。如果你的輸入在空間位置高度相關,但不同的通達之間相對獨立,那麼這種做法可以減少參數數量,降低計算量。
因此,深度可分離卷積可以更加的輕量、速度更快,有時還能讓任務的性能提升。
在這裏插入圖片描述

一個應用深度可分離卷積層的示例

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')