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