经典卷积神经网络--AlexNet的详解
一.AlexNet的概述
AlexNet由Geoffrey和他的學(xué)生Alex提出,并在2012年的ILSVRC競(jìng)賽中獲得了第一名。Alexnet共有8層結(jié)構(gòu),前5層為卷積層,后三層為全連接層。
AlexNet網(wǎng)絡(luò)結(jié)構(gòu)具有如下特點(diǎn):
1.AlexNet在激活函數(shù)上選取了非線性非飽和的relu函數(shù),在訓(xùn)練階段梯度衰減快慢方面,relu函數(shù)比傳統(tǒng)神經(jīng)網(wǎng)絡(luò)所選取的非線性飽和函數(shù)(如sigmoid函數(shù),tanh函數(shù))要快許多。
2.AlexNet在雙gpu上運(yùn)行,每個(gè)gpu負(fù)責(zé)一半網(wǎng)絡(luò)的運(yùn)算
3.采用局部響應(yīng)歸一化(LRN)。對(duì)于非飽和函數(shù)relu來(lái)說(shuō),不需要對(duì)其輸入進(jìn)行標(biāo)準(zhǔn)化,但Alex等人發(fā)現(xiàn),在relu層加入LRN,可形成某種形式的橫向抑制,從而提高網(wǎng)絡(luò)的泛華能力。
4.池化方式采用overlapping pooling。即池化窗口的大小大于步長(zhǎng),使得每次池化都有重疊的部分。(ps:這種重疊的池化方式比傳統(tǒng)無(wú)重疊的池化方式有著更好的效果,且可以避免過(guò)擬合現(xiàn)象的發(fā)生)
二.AlexNet網(wǎng)絡(luò)結(jié)構(gòu)
第一個(gè)卷積層
????輸入的圖片大小為:224*224*3,為后續(xù)處理方便,普遍改為227*227*3
????第一個(gè)卷積層為:11*11*3即卷積核尺寸為11*11,有96個(gè)卷積核,步長(zhǎng)為4,卷積層后跟ReLU,因此輸出的尺寸為 (227-11)/4+1=55,因此其輸出的每個(gè)特征圖 為 55*55*96,同時(shí)后面經(jīng)過(guò)LRN層處理,尺寸不變.
????最大池化層,池化核大小為3*3,步長(zhǎng)為2,輸出的尺寸為 (55-3)/2+1=27,因此特征圖的大小為:27*27*96。由于雙gpu處理,故每組數(shù)據(jù)有27*27*48個(gè)特征圖,共兩組數(shù)據(jù),分別在兩個(gè)gpu中進(jìn)行運(yùn)算
第二層卷積層
? ? 每組輸入的數(shù)據(jù)為27*27*48,共兩組數(shù)據(jù)
? ? 每組數(shù)據(jù)都被128個(gè)卷積核大小為: 5*5*48進(jìn)行卷積運(yùn)算,步長(zhǎng)為1,尺寸不會(huì)改變,同樣緊跟ReLU,和LRN層進(jìn)行處理.
??? 最大池化層,核大小為3*3,步長(zhǎng)為2,因此輸出兩組特征圖:13*13*128
第三層至第五層卷積層
????輸入的數(shù)據(jù)為13*13*128,共兩組
????第三層每組數(shù)據(jù)都被尺寸為 3*3*192的卷積核進(jìn)行卷積運(yùn)算,步長(zhǎng)為1,加上ReLU,得到兩組13*13*192的像素層
????第四層經(jīng)過(guò)padding=1填充后,每組數(shù)據(jù)都被尺寸大小為 3*3*192的卷積核卷積運(yùn)算,步長(zhǎng)為1,加上ReLU,輸出兩組13*13*192的像素層
????第五層經(jīng)過(guò)padding=1填充后,每組數(shù)據(jù)都被尺寸大小為 3*3*128的卷積核進(jìn)行卷積運(yùn)算,步長(zhǎng)為1,加上ReLU,輸出兩組13*13*128的像素層
? ?經(jīng)過(guò)3*3池化窗口,步長(zhǎng)為2,池化后輸出兩組6*6*256的像素層
第六層至第八層全連接層
接下來(lái)的三層為全連接層,分別為:
6層. 4096 個(gè)神經(jīng)元+ ReLU
7層. 4096個(gè)神經(jīng)元 + ReLU
8層. 1000 個(gè)神經(jīng)元,最后一層為softmax為1000類的概率值.
三.AlexNet的代碼實(shí)現(xiàn)
該代碼是用搭建好的AlexNet網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)MNIST手寫體數(shù)字的識(shí)別(采用keras框架)
from keras.datasets import mnist from matplotlib import pyplot as plt from keras.utils import np_utils from keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPool2D,BatchNormalization from keras.models import Sequential from matplotlib import pyplot as plt(X_train,Y_train),(X_test,Y_test)=mnist.load_data() X_test1=X_test Y_test1=Y_test #處理圖像特征 X_train=X_train.reshape(-1,28,28,1).astype("float32")/255.0 X_test=X_test.reshape(-1,28,28,1).astype("float32")/255.0 #處理標(biāo)簽 Y_train=np_utils.to_categorical(Y_train,10) Y_test=np_utils.to_categorical(Y_test,10) #print(X_train) #print("-----------") #print(Y_train)#搭建AlexNet網(wǎng)絡(luò)模型 #建立第一層卷積 model=Sequential() model.add(Conv2D(filters=96,kernel_size=(11,11),strides=4,padding="same",input_shape=(28,28,1),activation="relu" ))#搭建BN層 model.add(BatchNormalization()) #搭建第一層重疊最大池化層 model.add(MaxPool2D(pool_size=(3,3),strides=2,padding="same" ))#建立第二層卷積 model.add(Conv2D(filters=256,kernel_size=(5,5),strides=1,padding="same",activation="relu" )) #搭建BN層 model.add(BatchNormalization()) #搭建第二層池化層 model.add(MaxPool2D(pool_size=(3,3),strides=2,padding="same", ))#搭建第三層卷積 model.add(Conv2D(filters=384,kernel_size=(3,3),strides=1,padding="same",activation="relu", ))#搭建第四層卷積 model.add(Conv2D(filters=384,kernel_size=(3,3),strides=1,padding="same",activation="relu" ))#搭建第五卷積層 model.add(Conv2D(filters=256,kernel_size=(3,3),strides=1,padding='same',activation="relu" )) model.add(MaxPool2D(pool_size=(3,3),strides=2,padding="same" ))#搭建第六層:全連接層 #在搭建全連接層之前,必須使用Flatten()降維 model.add(Flatten()) #全連接層 model.add(Dense(4096,activation="relu")) model.add(Dropout(0.5)) #搭建第七層:全連接層 model.add(Dense(2048,activation="relu")) model.add(Dropout(0.5)) #搭建第八層:全連接層即輸出層 model.add(Dense(10,activation="softmax")) model.summary()#編譯 model.compile(loss="categorical_crossentropy",optimizer="sgd",metrics=["accuracy"] )#訓(xùn)練 n_epoch=10 n_batch=128 training = model.fit(X_train,Y_train,epochs=n_epoch,batch_size=n_batch,verbose=1,validation_split=0.20 )#畫出準(zhǔn)確率隨著epoch的變化圖 def show_train(tr,train,validation):plt.plot(training.history[train],linestyle="-",color="b")plt.plot(training.history[validation],linestyle="--",color="r")plt.title("trianing_history")plt.xlabel("epoch")plt.ylabel("accuracy")plt.legend(["train","validation"],loc="lower right")plt.show() show_train(training,"accuracy","val_accuracy") #畫出誤差隨著epoch的變化圖 def show_train(tr,train,validation):plt.plot(training.history[train],linestyle="-",color="b")plt.plot(training.history[validation],linestyle="--",color="r")plt.title("trianing_history")plt.xlabel("epoch")plt.ylabel("accuracy")plt.legend(["train","validation"],loc="upper right")plt.show() show_train(training,"loss","val_loss")#評(píng)估 test=model.evaluate(X_train,Y_train,verbose=1) print("誤差:",test[0]) print("準(zhǔn)確率:",test[1])#預(yù)測(cè) def image_show(image): #畫圖fig=plt.gcf()fig.set_size_inches(2,2)plt.imshow(image,cmap="binary")plt.show() prediction=model.predict_classes(X_test) def pre_result(i):image_show(X_test1[i])print("Y-test:",Y_test1[i])print("預(yù)測(cè)值:",prediction[i]) pre_result(0) pre_result(1)?
總結(jié)
以上是生活随笔為你收集整理的经典卷积神经网络--AlexNet的详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 经典卷积神经网络--LeNet-5的详解
- 下一篇: [深度学习基础] 4. 卷积神经网络