天天看點

Datawhale語音識别-Task04CNN用Keras搭模組化型

CNN

CNN的基本原理是把圖像轉化為一個具有多個次元的數值矩陣,一般是三維(RGB),然後再設定若幹個過濾器(卷積核),它們一般是比原圖像要小的數值矩陣。把這些過濾器逐一在數值矩陣中進行局部“掃描”,算出一個結果,計算過程是将對應位置的數值做相乘,再相加。這就能得出另外一個比原數值矩陣更小的矩陣,是一個提取特征的過程,也就是卷積層。

接下來是激勵層,對卷積後的數值進行非線性的變換,目的在于是其具有非線性的屬性,使得多層的計算并不保持在同一個線性次元上。也就是激活函數,通常使用relu。

而圖像兩個像素之間的數值的差不多的,導緻卷積後的數值也有相似,這說明卷積後的大部分資訊是備援的,是以才有池化層的存在。它主要是對卷積後的矩陣進行局部的備援去除,一般分為平均池化(求平均值)和最大池化(求最大值)。

之後便是重複卷積層池化層的過程,使得數值矩陣越來越小,但是次元越來越多(感覺有點像在反向套娃~)。

Flatten操作:将二維的向量,拉直為一維的向量,進而可以放入下一層的神經網絡中。

最後是全連接配接層,通常在CNN的尾部進行重新拟合,減少特征資訊的損失。

用Keras搭模組化型

Keras 的核心資料結構是 model,一種組織網絡層的方式。最簡單的模型是 Sequential 順序模型,它由多個網絡層線性堆疊,它可以直接通過如下方式搭建:

from keras.models import Sequential
model = Sequential()
           

對于上面提到的CNN網絡,在Keras操作中,可以簡單地使用 .add() ,将需要搭建的神經網絡的layer堆砌起來,像搭積木一樣:

model.add(Conv2D(64, (3, 3), padding = "same", activation = "tanh", input_shape = input_dim))# 卷積層
model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化
model.add(Conv2D(128, (3, 3), padding = "same", activation = "tanh")) #卷積層
model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化層
model.add(Dropout(0.1))
model.add(Flatten()) # 展開
model.add(Dense(1024, activation = "tanh"))
model.add(Dense(20, activation = "softmax")) # 輸出層:20個units輸出20個類的機率
model.add(Conv2D(64, (3, 3), padding = "same", activation = "tanh", input_shape = input_dim))# 卷積層
model.add(MaxPool2D(pool_size=(2, 2)))# 最大池化
model.add(Conv2D(128, (3, 3), padding = "same", activation = "tanh")) #卷積層
model.add(MaxPool2D(pool_size=(2, 2))) # 最大池化層
model.add(Dropout(0.1))
model.add(Flatten()) # 展開
model.add(Dense(1024, activation = "tanh"))
model.add(Dense(20, activation = "softmax")) # 輸出層:20個units輸出20個類的機率
           

Dropout()函數的作用是減少過拟合,在深度學習訓練過程中,對于神經網絡訓練單元,按照一定的機率将其從網絡中暫時移除,對于随機梯度下降來說,由于是随機丢棄,故而每一個mini-batch都在訓練不同的網絡。

訓練出結果後,用model.predict()預測語音對應的标簽。

繼續閱讀