Keras 搭建图片分类 CNN (卷积神经网络)
1. 導入keras
from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense2. Conv2D
構(gòu)建卷積層。用于從輸入的高維數(shù)組中提取特征。卷積層的每個過濾器就是一個特征映射,用于提取某一個特征,過濾器的數(shù)量決定了卷積層輸出特征個數(shù),或者輸出深度。因此,圖片等高維數(shù)據(jù)每經(jīng)過一個卷積層,深度都會增加,并且等于過濾器的數(shù)量。
Conv2D(filters, kernel_size, strides, padding, activation=‘relu’, input_shape)
- filters: 過濾器數(shù)量
- kernel_size: 指定(方形)卷積窗口的高和寬的數(shù)字
- strides: 卷積步長, 默認為 1
- padding: 卷積如何處理邊緣。選項包括 ‘valid’ 和 ‘same’。默認為 ‘valid’
- activation: 激活函數(shù),通常設(shè)為 relu。如果未指定任何值,則不應(yīng)用任何激活函數(shù)。強烈建議你向網(wǎng)絡(luò)中的每個卷積層添加一個 ReLU 激活函數(shù)
- input_shape: 指定輸入層的高度,寬度和深度的元組。當卷積層作為模型第一層時,必須提供此參數(shù),否則不需要
示例1:構(gòu)建一個CNN,輸入層接受的是 200×200200 \times 200200×200 像素的灰度圖片;輸入層后面是卷積層,具有 16 個過濾器,寬高分別為 2;在進行卷積操作時,我希望過濾器每次跳轉(zhuǎn) 2 個像素。并且,不希望過濾器超出圖片界限之外,就是說,不用0填充圖片。
Conv2D(filters=16, kernel_size=2, strides=2, activation='relu', input_shape=(200, 200, 1))示例2:在示例1卷積層后再增加一層卷積層。新的卷積層有 32 個過濾器,每個的寬高都是 3。在進行卷積操作時,希望過濾器每次移動1個像素。并且希望卷積層查看上一層級的所有區(qū)域,因此,不介意在進行卷積操作時是否超過上一層級的邊緣。
Conv2D(filters=32, kernel_size=3, padding='same', activation='relu')示例3:簡化寫法。創(chuàng)建具有 64 個過濾器,每個的過濾器大小是 2×22 \times 22×2。層級具有 ReLU 激活函數(shù)。卷積操作每次移動一個像素。并且丟棄邊緣像素。
Conv2D(64, (2,2), activation='relu')3. MaxPooling2D
構(gòu)建最大池化層。如果說,卷積層通過過濾器從高維數(shù)據(jù)中提取特征,增加了輸出的深度(特征數(shù)),那么,最大池化層的作用是降低輸出維度(寬高)。在 CNN 架構(gòu)中,最大池化層通常出現(xiàn)在卷積層后,后面接著下一個卷積層,交替出現(xiàn),結(jié)果是,輸入的高維數(shù)組,深度逐次增加,而維度逐次降低。最終,高維的空間信息,逐漸轉(zhuǎn)換成 1 維的特征向量,然后連接全聯(lián)接層或其他分類算法,得到模型輸出。
MaxPooling2D(pool_size, strides, padding)
- pool_size: 指定池化窗口高度和寬度的數(shù)字
- strides: 垂直和水平 stride。如果不指定任何值,則 strides 默認為 pool_size
- padding: 選項包括 valid 和 same。如果不指定任何值,則 padding 設(shè)為 valid
示例:在卷積層后面添加最大池化層,降低卷積層的維度。假設(shè)卷積層的大小是 (100, 100, 15),希望最大池化層的大小為 (50, 50, 15)。要實現(xiàn)這一點,可以在最大池化層中使用 2x2 窗口,stride 設(shè)為 2,代碼如下:
MaxPooling2D(pool_size=2, strides=2)4. 構(gòu)建圖片分類 CNN
4.1 創(chuàng)建序列化模型
model = Sequential()4.2 添加卷積層和最大池化層
這里分別添加了 3 層卷積層和 3 層最大池化層。卷積層的過濾器數(shù)量逐次增加,并且 padding 參數(shù)都為 same,strides 使用默認值 1,這意味著,卷積層不會改變圖片的寬高,只會通過過濾器層層提取更多特征。而最大池化層,strides 默認和 pool_size 想等設(shè)置為 2,意味著,最大池化層每次都能將圖片寬高壓縮一半。
需要注意的兩個地方:
- 模型第一層卷積層接受輸入,因此需要設(shè)置一個 input_shape 參數(shù)指定輸入維度。這里設(shè)置的 (32, 32, 3) ,表示輸入圖片需要是寬高為 32 像素的 RGB 彩色圖片。第一層之后的層都不需要設(shè)置 input_shape, 因為,模型會自動將前一層的輸出 shape 作為 后一層的輸入 shape。
- 由于,我們習慣使得卷積層不改變維度,而讓最大池化層每次將維度縮小一般,即寬高都除以 2,為了能一直整除,最好將輸入 shape 設(shè)置為 2 的整數(shù)冪,如下本文設(shè)置為 25=322^5 = 3225=32。
4.3 扁平層
模型輸入 shape 為 (32, 32, 3) ,經(jīng)過前面的卷積和最大池化,可以得到現(xiàn)在的輸出寬高為 32÷2÷2÷2=432 \div 2 \div 2 \div 2 = 432÷2÷2÷2=4,深度為最后一層卷積層過濾器數(shù)量 64,因此,輸出 shape 為 (4, 4, 64)。扁平層的作用將這個多維數(shù)組(行業(yè)術(shù)語叫張量),轉(zhuǎn)換為相同數(shù)量 1 維向量, 因此,向量的長度為 4×4×64=10244 \times 4 \times 64 = 10244×4×64=1024。
model.add(Flatten())4.4 全聯(lián)接層分類輸出
正如前文所說,卷積層和最大池化層組合使用,從二維的圖片中提取特征,將空間信息解構(gòu)為特征向量后,就可以連接分類器,進而得到模型預(yù)測輸出。這里分類器采用的是兩個全聯(lián)接層,最后一層全聯(lián)接層也是輸出層,采用了 softmax 作為激活層,因此,輸出長度為 10 的向量,對應(yīng) 10 個分類的預(yù)測概率值。
model.add(Dense(500, activation='relu')) model.add(Dense(10, activation='softmax'))4.5 查看完整模型的架構(gòu)
到此為止,我們已經(jīng)完成了一個非常簡單,卻非常完整的用于圖像分類的卷積神經(jīng)網(wǎng)絡(luò)(CNN)的架構(gòu)設(shè)計。我們可以通過模型的 summary() 方法一覽整個模型,確保模型架構(gòu)符合自己的預(yù)期。summary() 方法會將模型每一層的參數(shù)個數(shù),以及整個模型參數(shù)總數(shù)和可以訓練參數(shù)個數(shù)顯示出來,幫助我們非常便捷地掌握模型的復(fù)雜程度。可以看到,我們這個模型的一共有 528,054 個參數(shù)。信心的讀者,還會發(fā)現(xiàn),只有卷積層和全連接層有參數(shù),而且全連接層的參數(shù)個數(shù)遠遠超過卷積層。事實上,這也揭露一個事實,相對于全聯(lián)接,卷積層是局部連接的,它的參數(shù)個數(shù)也是可以通過卷積層傳入的參數(shù)計算出來的。關(guān)于參數(shù)個數(shù)的計算實際很簡單,但不是本文的重點,感興趣的讀者可以自行百度一下,或關(guān)注筆者博客后續(xù)更新。
model.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_4 (Conv2D) (None, 32, 32, 16) 208 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 16, 16, 16) 0 _________________________________________________________________ conv2d_5 (Conv2D) (None, 16, 16, 32) 2080 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (None, 8, 8, 32) 0 _________________________________________________________________ conv2d_6 (Conv2D) (None, 8, 8, 64) 8256 _________________________________________________________________ max_pooling2d_4 (MaxPooling2 (None, 4, 4, 64) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 1024) 0 _________________________________________________________________ dense_1 (Dense) (None, 500) 512500 _________________________________________________________________ dense_2 (Dense) (None, 10) 5010 ================================================================= Total params: 528,054 Trainable params: 528,054 Non-trainable params: 0 _________________________________________________________________5. 突破性的CNN架構(gòu)
5.1 AlexNet
2012 年,由多倫多大學的團隊開發(fā)。使用當時最強大的 GPU 在一周內(nèi)訓練完該網(wǎng)絡(luò)。AlexNet 使用了 ReLU 激活函數(shù)和 dropout 層來避免過擬合這一方面走在了前沿。卷積層使用 11×1111 \times 1111×11 大窗口。
5.2 VGG
2014 年,由牛津大學的視覺幾何組開發(fā)。VGG 有兩個版本,VGG16 和 VGG19,分別有 16 個層級和19個層級。兩個版本都非常簡潔美觀,由一個很長的 3×33 \times 33×3 卷積序列,穿插著 2×22 \times 22×2 的池化層,最后是 3 個全連接層。
5.3 ResNet
2015 年,由微軟研究部門開發(fā)。ResNet 也具有不同版本,區(qū)別在于層級的數(shù)量,最大的網(wǎng)絡(luò)具有破紀錄的 152 個層級。
6. 結(jié)語
本文介紹了使用 Keras 用于圖像分類的 CNN 架構(gòu)設(shè)計方法,并進一步介紹3個著名的CNN架構(gòu)。關(guān)于如何訓練一個CNN,實現(xiàn)一個完整的圖片分類模型,放在一篇文章,顯得過于冗長,想了解更多,可關(guān)注筆者后續(xù)專欄。
微信掃描二維碼 獲取最新技術(shù)原創(chuàng)
總結(jié)
以上是生活随笔為你收集整理的Keras 搭建图片分类 CNN (卷积神经网络)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言字符串函数(3)strstr,st
- 下一篇: Haar-Feature分类器和卷积神经