alexnet训练多久收敛_卷积神经网络之AlexNet
由于受到計算機性能的影響,雖然LeNet在圖像分類中取得了較好的成績,但是并沒有引起很多的關注。 知道2012年,Alex等人提出的AlexNet網絡在ImageNet大賽上以遠超第二名的成績奪冠,卷積神經網絡乃至深度學習重新引起了廣泛的關注。
AlexNet特點
AlexNet是在LeNet的基礎上加深了網絡的結構,學習更豐富更高維的圖像特征。AlexNet的特點:
更深的網絡結構
使用層疊的卷積層,即卷積層+卷積層+池化層來提取圖像的特征
使用Dropout抑制過擬合
使用數據增強Data Augmentation抑制過擬合
使用Relu替換之前的sigmoid的作為激活函數
多GPU訓練
ReLu作為激活函數
在最初的感知機模型中,輸入和輸出的關系如下:
\[y = \sum_i{w_ix_i} + b
\]
只是單純的線性關系,這樣的網絡結構有很大的局限性:即使用很多這樣結構的網絡層疊加,其輸出和輸入仍然是線性關系,無法處理有非線性關系的輸入輸出。因此,對每個神經元的輸出做個非線性的轉換也就是,將上面就加權求和\(\sum_i{w_ix_i} + b\)的結果輸入到一個非線性函數,也就是激活函數中。 這樣,由于激活函數的引入,多個網絡層的疊加就不再是單純的線性變換,而是具有更強的表現能力。
在最初,\(sigmoid\)和\(tanh\)函數最常用的激活函數。
\(sigmoid\)
在網絡層數較少時,\(sigmoid\)函數的特性能夠很好的滿足激活函數的作用:它把一個實數壓縮至0到1之間,當輸入的數字非常大的時候,結果會接近1;當輸入非常大的負數時,則會得到接近0的結果。這種特性,能夠很好的模擬神經元在受刺激后,是否被激活向后傳遞信息(輸出為0,幾乎不被激活;輸出為1,完全被激活)。
\(sigmoid\)一個很大的問題就是梯度飽和。 觀察\(sigmoid\)函數的曲線,當輸入的數字較大(或較小)時,其函數值趨于不變,其導數變的非常的小。這樣,在層數很多的的網絡結構中,進行反向傳播時,由于很多個很小的\(sigmoid\)導數累成,導致其結果趨于0,權值更新較慢。
ReLu
針對\(sigmoid\)梯度飽和導致訓練收斂慢的問題,在AlexNet中引入了ReLU。ReLU是一個分段線性函數,小于等于0則輸出為0;大于0的則恒等輸出。相比于\(sigmoid\),ReLU有以下有點:
計算開銷下。\(sigmoid\)的正向傳播有指數運算,倒數運算,而ReLu是線性輸出;反向傳播中,\(sigmoid\)有指數運算,而ReLU有輸出的部分,導數始終為1.
梯度飽和問題
稀疏性。Relu會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性,并且減少了參數的相互依存關系,緩解了過擬合問題的發生。
這里有個問題,前面提到,激活函數要用非線性的,是為了使網絡結構有更強的表達的能力。那這里使用ReLU本質上卻是個線性的分段函數,是怎么進行非線性變換的。
這里把神經網絡看著一個巨大的變換矩陣\(M\),其輸入為所有訓練樣本組成的矩陣\(A\),輸出為矩陣\(B\)。
\[B = M \cdot A
\]
這里的\(M\)是一個線性變換的話,則所有的訓練樣本\(A\)進行了線性變換輸出為\(B\)。
那么對于ReLU來說,由于其是分段的,0的部分可以看著神經元沒有激活,不同的神經元激活或者不激活,其神經玩過組成的變換矩陣是不一樣的。
設有兩個訓練樣本 \(a_1,a_2\),其訓練時神經網絡組成的變換矩陣為\(M_1,M_2\)。 由于\(M_1\)變換對應的神經網絡中激活神經元和\(M_2\)是不一樣的,這樣\(M_1,M_2\)實際上是兩個不同的線性變換。也就是說,每個訓練樣本使用的線性變換矩陣\(M_i\)是不一樣的,在整個訓練樣本空間來說,其經歷的是非線性變換。
簡單來說,不同訓練樣本中的同樣的特征,在經過神經網絡學習時,流經的神經元是不一樣的(激活函數值為0的神經元不會被激活)。這樣,最終的輸出實際上是輸入樣本的非線性變換。
單個訓練樣本是線性變換,但是每個訓練樣本的線性變換是不一樣的,這樣整個訓練樣本集來說,就是非線性的變換。
數據增強
神經網絡由于訓練的參數多,表能能力強,所以需要比較多的數據量,不然很容易過擬合。當訓練數據有限時,可以通過一些變換從已有的訓練數據集中生成一些新的數據,以快速地擴充訓練數據。對于圖像數據集來說,可以對圖像進行一些形變操作:
翻轉
隨機裁剪
平移,顏色光照的變換
...
AlexNet中對數據做了以下操作:
隨機裁剪,對\(256\times256\)的圖片進行隨機裁剪到\(227 \times 227\),然后進行水平翻轉。
測試的時候,對左上、右上、左下、右下、中間分別做了5次裁剪,然后翻轉,共10個裁剪,之后對結果求平均。
對RGB空間做PCA(主成分分析),然后對主成分做一個(0, 0.1)的高斯擾動,也就是對顏色、光照作變換,結果使錯誤率又下降了1%。
層疊池化
在LeNet中池化是不重疊的,即池化的窗口的大小和步長是相等的,如下
在AlexNet中使用的池化(Pooling)卻是可重疊的,也就是說,在池化的時候,每次移動的步長小于池化的窗口長度。AlexNet池化的大小為3×3的正方形,每次池化移動步長為2,這樣就會出現重疊。重疊池化可以避免過擬合,這個策略貢獻了0.3%的Top-5錯誤率。與非重疊方案\(s = 2,z = 2\)相比,輸出的維度是相等的,并且能在一定程度上抑制過擬合。
局部相應歸一化
ReLU具有讓人滿意的特性,它不需要通過輸入歸一化來防止飽和。如果至少一些訓練樣本對ReLU產生了正輸入,那么那個神經元上將發生學習。然而,我們仍然發現接下來的局部響應歸一化有助于泛化。\(a_{x,y}^i\)表示神經元激活,通過在\((x, y)\)位置應用核\(i\),然后應用ReLU非線性來計算,響應歸一化激活\(b^i_{x,y}\)通過下式給定:
\[b^i_{x,y} = a_{x,y}^i / \big( k + \alpha \sum _{j = max(0, i-n / 2)} ^{min(N-1, i+n / 2)} (a_{x,y}^j)^2 \big)^\beta
\]
其中,\(N\)是卷積核的個數,也就是生成的FeatureMap的個數;\(k,\alpha,\beta,n\)是超參數,論文中使用的值是\(k = 2 , n =5 ,\alpha = 10^{-4},\beta = 0.75\)
輸出\(b^i_{x,y}\)和輸入\(a_{x,y}^j\)的上標表示的是當前值所在的通道,也即是疊加的方向是沿著通道進行。將要歸一化的值\(a_{x,y}^i\)所在附近通道相同位置的值的平方累加起來\(\sum _{j = max(0, i-n / 2)} ^{min(N-1, i+n / 2)} (a_{x,y}^j)^2\)
Dropout
這個是比較常用的抑制過擬合的方法了。
引入Dropout主要是為了防止過擬合。在神經網絡中Dropout通過修改神經網絡本身結構來實現,對于某一層的神經元,通過定義的概率將神經元置為0,這個神經元就不參與前向和后向傳播,就如同在網絡中被刪除了一樣,同時保持輸入層與輸出層神經元的個數不變,然后按照神經網絡的學習方法進行參數更新。在下一次迭代中,又重新隨機刪除一些神經元(置為0),直至訓練結束。
Dropout應該算是AlexNet中一個很大的創新,現在神經網絡中的必備結構之一。Dropout也可以看成是一種模型組合,每次生成的網絡結構都不一樣,通過組合多個模型的方式能夠有效地減少過擬合,Dropout只需要兩倍的訓練時間即可實現模型組合(類似取平均)的效果,非常高效。
如下圖:
Alex網絡結構
上圖中的輸入是\(224\times224\),不過經過計算\((224 - 11) / 4 = 54.75\)并不是論文中的\(55 \times 55\),而使用\(227 \times 227\)作為輸入,則\((227 - 11) / 4 = 55\)
網絡包含8個帶權重的層;前5層是卷積層,剩下的3層是全連接層。最后一層全連接層的輸出是1000維softmax的輸入,softmax會產生1000類標簽的分布網絡包含8個帶權重的層;前5層是卷積層,剩下的3層是全連接層。最后一層全連接層的輸出是1000維softmax的輸入,softmax會產生1000類標簽的分布。
卷積層C1
該層的處理流程是: 卷積-->ReLU-->池化-->歸一化。
卷積,輸入是\(227\times227\),使用96個\(11 \times 11 \times 3\)的卷積核,得到的FeatureMap為\(55 \times 55 \times 96\)。
ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中。
池化,使用\(3 \times 3\)步長為2的池化單元(重疊池化,步長小于池化單元的寬度),輸出為\(27 \times 27 \times 96\)(\((55 - 3) / 2 + 1 = 27\))
局部響應歸一化,使用\(k = 2 , n =5 ,\alpha = 10^{-4},\beta = 0.75\)進行局部歸一化,輸出的仍然為\(27 \times 27 \times 96\),輸出分為兩組,每組的大小為\(27 \times 27 \times 48\)
卷積層C2
該層的處理流程是:卷積-->ReLU-->池化-->歸一化
卷積,輸入是2組\(27 \times 27 \times 48\)。使用2組,每組128個尺寸為\(5 \times 5 \times 48\)的卷積核,并作了邊緣填充padding=2,卷積的步長為1. 則輸出的FeatureMap為2組,每組的大小為\(27 \times 27 \ times 128\). (\((27 + 2 * 2 - 5) / 1 + 1 = 27\))
ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中
池化運算的尺寸為\(3\times3\),步長為2,池化后圖像的尺寸為\((27-3)/2+1=13\),輸出為\(13 \times 13 \times 256\)
局部響應歸一化,使用\(k = 2 , n =5 ,\alpha = 10^{-4},\beta = 0.75\)進行局部歸一化,輸出的仍然為\(13 \times 13 \times 256\),輸出分為2組,每組的大小為\(13 \times 13 \times 128\)
卷積層C3
該層的處理流程是: 卷積-->ReLU
卷積,輸入是\(13 \times 13 \times 256\),使用2組共384尺寸為\(3 \times 3 \times 256\)的卷積核,做了邊緣填充padding=1,卷積的步長為1.則輸出的FeatureMap為\(13 \times 13 \ times 384\)
ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中
卷積層C4
該層的處理流程是: 卷積-->ReLU
該層和C3類似。
卷積,輸入是\(13 \times 13 \times 384\),分為兩組,每組為\(13 \times 13 \times192\).使用2組,每組192個尺寸為\(3 \times 3 \times 192\)的卷積核,做了邊緣填充padding=1,卷積的步長為1.則輸出的FeatureMap為\(13 \times 13 \ times 384\),分為兩組,每組為\(13 \times 13 \times192\)
ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中
卷積層C5
該層處理流程為:卷積-->ReLU-->池化
卷積,輸入為\(13 \times 13 \times 384\),分為兩組,每組為\(13 \times 13 \times192\)。使用2組,每組為128尺寸為\(3 \times 3 \times 192\)的卷積核,做了邊緣填充padding=1,卷積的步長為1.則輸出的FeatureMap為\(13 \times 13 \times 256\)
ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中
池化,池化運算的尺寸為3×3,步長為2,池化后圖像的尺寸為 \((13-3)/2+1=6\),即池化后的輸出為\(6 \times 6 \times 256\)
全連接層FC6
該層的流程為:(卷積)全連接 -->ReLU -->Dropout
卷積->全連接: 輸入為\(6 \times 6 \times 256\),該層有4096個卷積核,每個卷積核的大小為\(6 \times 6 \times 256\)。由于卷積核的尺寸剛好與待處理特征圖(輸入)的尺寸相同,即卷積核中的每個系數只與特征圖(輸入)尺寸的一個像素值相乘,一一對應,因此,該層被稱為全連接層。由于卷積核與特征圖的尺寸相同,卷積運算后只有一個值,因此,卷積后的像素層尺寸為\(4096\times1\times1\),即有4096個神經元。
ReLU,這4096個運算結果通過ReLU激活函數生成4096個值
Dropout,抑制過擬合,隨機的斷開某些神經元的連接或者是不激活某些神經元
全連接層FC7
流程為:全連接-->ReLU-->Dropout
全連接,輸入為4096的向量
ReLU,這4096個運算結果通過ReLU激活函數生成4096個值
Dropout,抑制過擬合,隨機的斷開某些神經元的連接或者是不激活某些神經元
輸出層
第七層輸出的4096個數據與第八層的1000個神經元進行全連接,經過訓練后輸出1000個float型的值,這就是預測結果。
AlexNet參數數量
卷積層的參數 = 卷積核的數量 * 卷積核 + 偏置
C1: 96個\(11 \times 11 \times 3\)的卷積核,$96 \times 11 \times 11 \times 3 + 96=34848 $
C2: 2組,每組128個\(5 \times 5 \times 48\)的卷積核,\((128 \times 5 \times 5 \times 48 + 128)\times 2 = 307456\)
C3: 384個\(3 \times 3 \times 256\)的卷積核,\(3 \times 3 \times 256 \times 384 + 384 = 885120\)
C4: 2組,每組192個\(3 \times 3 \times 192\)的卷積核,\((3 \times 3 \times 192 \times 192 + 192)\times 2= 663936\)
C5: 2組,每組128個\(3 \times 3 \times 192\)的卷積核,\((3 \times 3 \times 192 \times 128 + 128) \times 2 = 442624\)
FC6: 4096個\(6 \times 6 \times 256\)的卷積核,\(6 \times 6 \times 256 \times 4096 + 4096 = 37752832\)
FC7: \(4096 * 4096 + 4096 = 16781312\)
output: \(4096 * 1000 = 4096000\)
卷積層 C2,C4,C5中的卷積核只和位于同一GPU的上一層的FeatureMap相連。從上面可以看出,參數大多數集中在全連接層,在卷積層由于權值共享,權值參數較少。
Keras實現
由于AlexNet是使用兩塊顯卡進行訓練的,其網絡結構的實際是分組進行的。并且,在C2,C4,C5上其卷積核只和上一層的同一個GPU上的卷積核相連。 對于單顯卡來說,并不適用,本文基于Keras的實現,忽略其關于雙顯卡的的結構,并且將局部歸一化操作換成了BN。其網絡結構如下:
Keras代碼
class AlexNet:
@staticmethod
def build(width,height,depth,classes,reg=0.0002):
model = Sequential()
inputShape = (height,width,depth)
chanDim = -1
if K.image_data_format() == "channels_first":
inputShape = (depth,height,width)
chanDim = 1
model.add(Conv2D(96,(11,11),strides=(4,4),input_shape=inputShape,padding="same",kernel_regularizer=l2(reg)))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(256,(5,5),padding="same",kernel_regularizer=l2(reg)))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(384,(3,3),padding="same",kernel_regularizer=l2(reg)))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(384,(3,3),padding="same",kernel_regularizer=l2(reg)))
model.add(Activation("relu"))
model.add(BatchNormalization(axis=chanDim))
model.add(Conv2D(256,(3,3),padding="same",kernel_regularizer=l2(reg)))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(4096,kernel_regularizer=l2(reg)))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.25))
model.add(Dense(4096,kernel_regularizer=l2(reg)))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.25))
model.add(Dense(classes,kernel_regularizer=l2(reg)))
model.add(Activation("softmax"))
return model
更多測測試代碼,可以從我的github上找到。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的alexnet训练多久收敛_卷积神经网络之AlexNet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 齐齐哈尔华夏都市花园是哪个开发商?
- 下一篇: parzen窗估计如何进行结果分析_实现