日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 卷积神经网络 >内容正文

卷积神经网络

经典卷积神经网络--LeNet-5的详解

發布時間:2024/9/21 卷积神经网络 114 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典卷积神经网络--LeNet-5的详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.LeNet概述

LeNet由Yann Lecun 創建,并將該網絡用于郵局的郵政的郵政編碼識別,有著良好的學習和識別能力。LeNet又稱LeNet-5,具有一個輸入層,兩個卷積層,兩個池化層,3個全連接層(其中最后一個全連接層為輸出層。LeNet網絡結構圖如下:

LeNet-5共有7層(不包含輸入),每層都包含可訓練參數。

輸入圖像大小為32*32,比MNIST數據集的圖片要大一些,這么做的原因是希望潛在的明顯特征如筆畫斷點或角能夠出現在最高層特征檢測子感受野(receptive field)的中心。因此在訓練整個網絡之前,需要對28*28的圖像加上paddings(即周圍填充0)。

C1層:該層是一個卷積層。使用6個大小為5*5的卷積核,步長為1,對輸入層進行卷積運算,特征圖尺寸為32-5+1=28,因此產生6個大小為28*28的特征圖。這么做夠防止原圖像輸入的信息掉到卷積核邊界之外。

S2層:該層是一個池化層(pooling,也稱為下采樣層)。這里采用max_pool(最大池化),池化的size定為2*2,經池化后得到6個14*14的特征圖,作為下一層神經元的輸入。

C3層:該層仍為一個卷積層,我們選用大小為5*5的16種不同的卷積核。這里需要注意:C3中的每個特征圖,都是S2中的所有6個或其中幾個特征圖進行加權組合得到的。輸出為16個10*10的特征圖。

S4層:該層仍為一個池化層,size為2*2,仍采用max_pool。最后輸出16個5*5的特征圖,神經元個數也減少至16*5*5=400。

C5層:該層我們繼續用5*5的卷積核對S4層的輸出進行卷積,卷積核數量增加至120。這樣C5層的輸出圖片大小為5-5+1=1。最終輸出120個1*1的特征圖。這里實際上是與S4全連接了,但仍將其標為卷積層,原因是如果LeNet-5的輸入圖片尺寸變大,其他保持不變,那該層特征圖的維數也會大于1*1。

F6層:該層與C5層全連接,輸出84張特征圖。為什么是84?下面有論文的解釋(感謝翻譯)。

輸出層:該層與F6層全連接,輸出長度為10的張量,代表所抽取的特征屬于哪個類別。(例如[0,0,0,1,0,0,0,0,0,0]的張量,1在index=3的位置,故該張量代表的圖片屬于第三類)

二.MNIST手寫體數字識別代碼實現

該代碼是用搭建好的LeNet-5網絡來實現MNIST手寫體數字的識別

from keras.datasets import mnist from keras.utils import np_utils from keras.layers.core import Dense,Activation ,Dropout from keras.models import Sequential from keras.layers import Convolution2D from keras.layers import MaxPool2D,Flatten from keras.utils.vis_utils import plot_model 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#標簽預處理 nb_classes=10 Y_train=np_utils.to_categorical(Y_train,nb_classes) Y_test=np_utils.to_categorical(Y_test,nb_classes)#簡單cnn的搭建(一個輸入層,兩個隱藏層,一個全連接層,一個輸出層) #是基于序慣式Sequential()搭建網絡模型的 model=Sequential() #第一層卷積層,搭建層c1層,卷積核大小5*5,個數為6 model.add(Convolution2D(filters=6, #卷積核個數kernel_size=(5,5), #卷積核大小5*5strides=1,padding="same",#像素填充方式選擇sameactivation="tanh",input_shape=(28, 28, 1)#輸入數據28*28*1 )) #model.add(Activation("relu")) #第一層池化層,搭建s2層,池化池化窗口大小2*2 model.add(MaxPool2D(pool_size=(2,2),#池化窗口大小2*2strides=1,#池化步長為2padding="same" #像素填充方式為same ))#第二層隱藏層,搭建c3層,卷積核大小5*5,個數為16 model.add(Convolution2D(filters=16, #卷積核的個數kernel_size=(5,5),#卷積核的大小padding="same",#填充方式activation="tanh" )) #第二層池化層,搭建s4層,池化窗口大小為2*2 model.add(MaxPool2D(pool_size=(2,2),#池化窗口大小strides=1,#池化步長padding="same"))#將卷積層輸出為二維數組,全連接層輸入為一維數組,Flatten默認按行降維,返回一個一維數組 model.add(Flatten()) #全連接層 model.add(Dense(120)) #全連接層,該層有120個神經元,一般都是1024,2048,4096個神經元 model.add(Activation("tanh")) #激活函數 #model.add(Dropout(0.2)) #設置為0.2,該層會隨機忽略百分之20的神經元 model.add(Dense(84)) #全連接層,該層有84個神經元,一般都是1024,2048,4096個神經元 model.add(Activation("tanh")) #激活函數 #輸出層 model.add(Dense(nb_classes)) #輸出層,神經元個數為10,對mnist數據集時分類 model.add(Activation("softmax")) #激活函數 #顯示模型摘要 model.summary() #plot_model(model=model, to_file="model_cnn.png", show_shapes=True)#編譯 model.compile(optimizer="adam",loss="categorical_crossentropy",metrics=["accuracy"] )#訓練 nb_epoch=10 batchsize=1024 training =model.fit(x=X_train,y=Y_train,epochs=nb_epoch,batch_size=batchsize,verbose=2,validation_split=0.2 )#畫出訓練過程隨著時期(epoc)準確率的變化圖 def show_accuracy1(train_history,train,validation):plt.plot(training.history[train],linestyle="-",color="b") #訓練數據結果,“-”代表實線,“b“代表藍色plt.plot(training.history[validation],linestyle="--",color="r")#訓練數據結果,“--”代表虛線,“r“代表紅色plt.title("Training_accurancy")plt.xlabel("epoch") #顯示x軸標簽epocplt.ylabel("train") #顯示y軸標簽trainplt.legend(["train","validation"],loc="lower right")plt.show() show_accuracy1(training,"accuracy","val_accuracy")#畫出訓練過程中隨著時期(epoch)誤差的變化圖 def show_accuracy2(train_history,train,validation):plt.plot(training.history[train],linestyle="-",color="b") #訓練數據結果,“-”代表實線,“b“代表藍色plt.plot(training.history[validation],linestyle="--",color="r")#訓練數據結果,“--”代表虛線,“r“代表紅色plt.title("Training_loss")plt.xlabel("epoch") #顯示x軸標簽epocplt.ylabel("train") #顯示y軸標簽trainplt.legend(["train","validation"],loc="upper right")plt.show() show_accuracy2(training,"loss","val_loss")#模型評估 test=model.evaluate(X_test,Y_test,verbose=1) print("誤差:",test[0]) print("準確率:",test[1])#預測 prediction=model.predict_classes(X_test) #將預測結果存到prediction def plot_image(image): #輸入為原始圖像fig=plt.gcf() #獲取當前的圖像fig.set_size_inches(2,2)#設置圖像大小plt.imshow(image,cmap="binary") #使用plt.inshow顯示圖像plt.show() #開始繪圖 #查看圖像,真是標簽及與測值 def pre_result(i):plot_image(X_test1[i])print("真實值:",Y_test1[i])print("預測值:",prediction[i]) pre_result(4) #即第五項測試項預測

?

總結

以上是生活随笔為你收集整理的经典卷积神经网络--LeNet-5的详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。