VGG網絡圖如下,本文要深入講解的是很常用的VGG16網絡。在看懂VGG16網絡之前,先補一下卷積神經網絡的知識,然後用代碼實例來更好說明VGG16網絡
圖片數據如何輸入?
彩色圖像有RGB三個顏色通道,分別是紅、綠、藍三個通道,這三個通道的像素可以用二維數組來表示,其中像素值由0到255的數字來表示。比如一張160x60的彩色圖片,可以用160*60*3的數組表示。
什麼是卷積?
卷積過程是使用一個卷積核(如圖中的Filter),在每層像素矩陣上不斷按步長掃描下去,每次掃到的數值會和卷積核中對應位置的數進行相乘,然後相加求和,得到的值將會生成一個新的矩陣。卷積核相當於卷積操作中的一個過濾器,用於提取我們圖像的特徵,特徵提取完後會得到一個特徵圖。卷積核的大小一般選擇3x3和5x5,比較常用的是3x3,訓練效果會更好。卷積核裡面的每個值就是我們需要訓練模型過程中的神經元參數(權重),開始會有隨機的初始值,當訓練網絡時,網絡會通過後向傳播不斷更新這些參數值,知道尋找到最佳的參數值。對於如何判斷參數值的最佳,則是通過loss損失函數來評估。
什麼是padding?
在進行卷積操作的過程中,處於中間位置的數值容易被進行多次的提取,但是邊界數值的特徵提取次數相對較少,為了能更好的把邊界數值也利用上,所以給原始數據矩陣的四周都補上一層0,這就是padding操作。在進行卷積操作之後維度會變少,得到的矩陣比原矩陣要小,不方便計算,原矩陣加上一層0的padding操作可以很好的解決該問題,卷積出來的矩陣和原矩陣尺寸一致。什麼是池化pooling?
池化操作相當於降維操作,有最大池化和平均池化,其中最大池化(max pooling)最為常用。經過卷積操作後我們提取到的特徵信息,相鄰區域會有相似特徵信息,這是可以相互替代的,如果全部保留這些特徵信息會存在信息冗餘,增加計算難度。通過池化層會不斷地減小數據的空間大小,參數的數量和計算量會有相應的下降,這在一定程度上控制了過擬合。
什麼是Fletten?
Flatten將池化後的數據拉開,變成一維向量來表示,方便輸入到全連接網絡。什麼是全連接層?
對n-1層和n層而言,n-1層的任意一個節點,都和第n層所有節點有連接。即第n層的每個節點在進行計算的時候,激活函數的輸入是n-1層所有節點的加權。
什麼是Dropout?
在訓練過程中,按照一定的比例將網絡中的神經元進行丟棄,可以防止模型訓練過擬合的情況。VGG16網絡
224x224x3的彩色圖表示3通道的長和寬都為224的圖像數據,也是網絡的輸入層白色部分為卷積層,紅色部分為池化層(使用最大池化),藍色部分為全連接層,其中卷積層和全連接層的激活函數都使用relu總的來說,VGG16網絡為13層卷積層+3層全連接層而組成VGG16網絡代碼實例講解
使用keras框架搭建的VGG16網絡開始輸入(60,160,1)的圖像數據,即寬為60,高度為160的單通道灰度圖像,使用灰度圖是為了加快模型的訓練Conv2D(64, (3,3), name='conv1',padding='same', kernel_initializer='he_uniform')
Conv2D卷積層的padding為"same",即給圖像矩陣四周都加上0。卷積核使用"he_uniform",大小為3x3,卷積核個數為64,一個卷積核掃完圖像矩陣數據後,生成一個新的矩陣,有64個卷積核就會生成64 層新的矩陣。BatchNormalization()(conv1)
使用BN層,加快模型的訓練和防止模型訓練過擬合Activation('relu')(bn1)
卷積後使用relu激活函數MaxPooling2D(pool_size=(2, 2), padding='same', name='pool3')(act7)
使用最大池化,池化的小矩陣是2x2,默認了也是2x2的步長。經過池化後,矩陣的長寬都降低一半,由64*160*60的數據變成64*80*30其他同理,只是卷積核大小和卷積層個數做了修改。x = Flatten()(pool3)
做了13層卷積和相應的池化操作後,使用Flatten(),將數據拉平,變成一維向量x1 = Dense(4096)(x)bnx1 = BatchNormalization()(x1)actx1 = Activation('relu')(bnx1)drop9 = Dropout(0.4)(actx1)
最後做3層全連接層,前兩個全連接層的神經元個數為4096,4096隻是VGG16論文裡提供的參考值,具體可以自己做測試修改。x = [Dense(10, activation='softmax', name='func%d'%(i+1))(x) for i in range(4)]
VGG16網絡裡最後的全連接層是1000個神經元,如果你想用VGG16 給自己的數據作分類任務,這裡就需要改成你預測的類別數。這個VGG16網絡我是用於做4位數字驗證碼的識別,所以最後的全連接層我修改為創建4個全連接層,區分10類,分別識別4個字符。至此VGG16的講解就結束了,如果想更加了解圖像矩陣大小的變化,可以列印模型的結構圖,或者自行列印圖像的緯度。