DeepLearning:CNN网络学习之LetNet-5解读(论文+分析+代码)
LetNet-5
- 【寫在前面】
- 權(quán)值共享
- 卷積原理
- 池化原理
- 【LetNet介紹】
- 論文原文
- 實(shí)現(xiàn)過(guò)程參數(shù)變化概覽
- 詳細(xì)過(guò)程
- 【代碼實(shí)現(xiàn)】
- 【參考鏈接】
【寫在前面】
LetNet-5雖然簡(jiǎn)單,但是包含了深度學(xué)習(xí)CNN模型的基本組成模塊,包含(卷積、池化、全連接等結(jié)構(gòu))為了幫助理解拿了一個(gè)最簡(jiǎn)單的LetNet網(wǎng)絡(luò)做一個(gè)知識(shí)梳理幫助理解。
(閱讀本文章之前具體的卷積、池化原理大家已經(jīng)深入理解)
權(quán)值共享
圖像識(shí)別的領(lǐng)域同時(shí)網(wǎng)絡(luò)的類型是基于BP的,因此針對(duì)這個(gè)領(lǐng)域先看看BP的缺點(diǎn),我們知道BP網(wǎng)絡(luò)是全連接的,對(duì)于圖片的識(shí)別,我們不用提取特征,一般一層提取特征的效果并不是很好,因此我們需要很多層,如果按照BP進(jìn)行全連接,會(huì)使得權(quán)值數(shù)量急劇增加,想要訓(xùn)練這么多的權(quán)值,樣本必須足夠的才行,即使樣本數(shù)量夠,但是計(jì)算量也會(huì)急劇增加,而且還有面臨梯度消失的情況,因此需要改進(jìn)連接的方式即采用局部連接和權(quán)值共享,如下圖:
假如一張圖片的像素點(diǎn)為4x4的,上圖的左邊圖W為全連接,一個(gè)神經(jīng)元就有16個(gè)連接 ,每個(gè)連接的權(quán)值不同,因此如果有n個(gè)神經(jīng)元?jiǎng)t有16n個(gè)權(quán)值,左圖就是局部連接,此時(shí)加入四個(gè)像素點(diǎn)連接一個(gè)神經(jīng)元,則需要四個(gè),但是如果像素很多的情況下,權(quán)值還是很多,此時(shí)是按照每個(gè)神經(jīng)元的連接權(quán)值如上圖的是其中一個(gè)神經(jīng)元的是4個(gè)權(quán)值,所謂權(quán)值共享,就是其他神經(jīng)元的權(quán)值也使用這四個(gè)值,此時(shí)的位置和數(shù)值都是這樣對(duì)應(yīng)的,這里大家需要理解。即四個(gè)神經(jīng)元只有四個(gè)不同的權(quán)值,現(xiàn)在我們來(lái)算算,按照右邊的計(jì)算:
全連接的權(quán)值數(shù):4x4x4=64(前面兩是像素點(diǎn),后面的4是神經(jīng)元,這里先不考慮偏置值) ,
局部連接的權(quán)值:4x4=16(4個(gè)神經(jīng)元,每個(gè)神經(jīng)元4個(gè)權(quán)值)
局部連接和權(quán)值共享: 4
因此權(quán)值的數(shù)量就降低了,這就是通過(guò)局部連接和權(quán)值共享來(lái)解決BP的存在的問(wèn)題,這里的理論依據(jù)就是根據(jù)上面說(shuō)的感受野進(jìn)行簡(jiǎn)化的,但是按照上圖的局部連接存在一個(gè)問(wèn)題就是邊緣過(guò)度不平滑,會(huì)出現(xiàn)邊緣效應(yīng),為了解決這個(gè)問(wèn)題引入了采樣窗口法使其彼此重疊,因?yàn)檫@樣做和卷積很類似,因此采樣窗口就稱為卷積核了,我們看這個(gè)窗口是怎么重疊的;假如采樣窗口為3x3,所謂重疊,我們每次左移一個(gè)像素點(diǎn)送給神經(jīng)元,往下移動(dòng)時(shí)也是這樣的,這樣就避免了邊緣效應(yīng)了具體效果如下圖所示;
卷積原理
簡(jiǎn)要圖示:
池化原理
簡(jiǎn)要圖示:
【LetNet介紹】
LetNet實(shí)現(xiàn)過(guò)程如上圖所示:
含輸入層總共8層網(wǎng)絡(luò),分別為:
輸入層(INPUT)、
卷積層(Convolutions,C1)、
池化層(Subsampling,S2)、
卷積層(C3)、
池化層(Subsampling,S4)、
卷積層(C5)、
全連接層(F6)、
輸出層(徑向基層)
論文原文
論文原文:
輸入的二維圖像,先經(jīng)過(guò)兩次卷積層到池化層,再經(jīng)過(guò)全連接層,最后使用softmax分類作為輸出層。大致過(guò)程如下圖所示:
實(shí)現(xiàn)過(guò)程參數(shù)變化概覽
分為以下幾步:
1.INPUT層-輸入層:(輸入32x32大小的圖像)
2.C1層-卷積層
3.S2層-池化層(下采樣層)
4.C3層-卷積層
5.S4層-池化層(下采樣層)
6.C5層-卷積層
7.F6層-全連接層
8.Output層-全連接層
整個(gè)過(guò)程對(duì)應(yīng)參數(shù)理解如下表所示:
各層之間的數(shù)據(jù)變化關(guān)系參考我的另外一個(gè)文章:https://blog.csdn.net/weixin_44322778/article/details/122563229
詳細(xì)過(guò)程
1.INPUT層-輸入層:(輸入32x32大小的圖像)
數(shù)據(jù)輸入 INPUT 輸入圖像的尺寸歸一化為32*32
2.C1層-卷積層
輸入圖片:3232
卷積核大小:55
卷積核種類:6
輸出featuremap大小:2828 (32-5+1)=28
神經(jīng)元數(shù)量:28286
可訓(xùn)練參數(shù):(55+1) * 6(每個(gè)濾波器55=25個(gè)unit參數(shù)和一個(gè)bias參數(shù),一共6個(gè)濾波器)
連接數(shù):(55+1)628*28=122304
詳細(xì)說(shuō)明:對(duì)輸入圖像進(jìn)行第一次卷積運(yùn)算(使用 6 個(gè)大小為 55 的卷積核),得到6個(gè)C1特征圖(6個(gè)大小為2828的 feature maps, 32-5+1=28)。我們?cè)賮?lái)看看需要多少個(gè)參數(shù),卷積核的大小為55,總共就有6(55+1)=156個(gè)參數(shù),其中+1是表示一個(gè)核有一個(gè)bias。對(duì)于卷積層C1,C1內(nèi)的每個(gè)像素都與輸入圖像中的55個(gè)像素和1個(gè)bias有連接,所以總共有1562828=122304個(gè)連接(connection)。有122304個(gè)連接,但是我們只需要學(xué)習(xí)156個(gè)參數(shù),主要是通過(guò)權(quán)值共享實(shí)現(xiàn)的。
上圖表示CNN中卷積操作。對(duì)卷積的要點(diǎn)解釋:
(1)紅色框內(nèi)為22卷積核。
(2)藍(lán)色框內(nèi)為34的輸入圖像。
(3)綠色框?yàn)?*3的特征圖。
注意:綠框中未包含偏置項(xiàng)。如加入偏置項(xiàng)則每個(gè)輸出多加上同一個(gè)偏置B,此時(shí)類似如:aw+bx+ey+fz+B bw+cx+fy+gz+B等。所謂的權(quán)值共享是每個(gè)卷積運(yùn)算使用同一個(gè)卷積核,在上圖中使用的是同一個(gè)卷積核,即共享權(quán)值。
卷積的優(yōu)勢(shì):
(1) sparse interactions (2) parameter sharing (3) equivariant respections
sparse interactions:
下圖是效果圖。藍(lán)色框中是全連接神經(jīng)網(wǎng)絡(luò),紅色框是卷積網(wǎng)絡(luò)。
卷積相對(duì)于全連接是稀疏的。
優(yōu)勢(shì):1、參數(shù)更少 2、計(jì)算量降低。那么會(huì)不會(huì)導(dǎo)致提取的特征丟失了?
上圖是多層結(jié)構(gòu)的聯(lián)系圖,所以可以通過(guò)增加網(wǎng)絡(luò)層數(shù),保留全局的特征。
parameter sharing: 在上面已經(jīng)分析完畢。優(yōu)勢(shì):同樣是減少了參數(shù)量。
equivariant respections: 當(dāng)輸入圖像通過(guò)平移后,卷積的結(jié)果也會(huì)平移。
原文鏈接:https://blog.csdn.net/zhangjunhit/article/details/53536915
3.S2層-池化層(下采樣層)
輸入:2828
采樣區(qū)域:22
采樣方式:4個(gè)輸入相加,乘以一個(gè)可訓(xùn)練參數(shù),再加上一個(gè)可訓(xùn)練偏置。結(jié)果通過(guò)sigmoid
采樣種類:6
輸出featureMap大小:1414(28/2)
神經(jīng)元數(shù)量:14146
連接數(shù):(22+1)614*14
S2中每個(gè)特征圖的大小是C1中特征圖大小的1/4。
詳細(xì)說(shuō)明:第一次卷積之后緊接著就是池化運(yùn)算,使用 22核 進(jìn)行池化,于是得到了S2,6個(gè)1414的 特征圖(28/2=14)。S2這個(gè)pooling層是對(duì)C1中的2*2區(qū)域內(nèi)的像素求和乘以一個(gè)權(quán)值系數(shù)再加上一個(gè)偏置,然后將這個(gè)結(jié)果再做一次映射。同時(shí)有5x14x14x6=5880個(gè)連接。
4.C3層-卷積層
輸入:S2中所有6個(gè)或者幾個(gè)特征map組合
卷積核大小:55
卷積核種類:16
輸出featureMap大小:1010 (14-5+1)=10
C3中的每個(gè)特征map是連接到S2中的所有6個(gè)或者幾個(gè)特征map的,表示本層的特征map是上一層提取到的特征map的不同組合
存在的一個(gè)方式是:C3的前6個(gè)特征圖以S2中3個(gè)相鄰的特征圖子集為輸入。接下來(lái)6個(gè)特征圖以S2中4個(gè)相鄰特征圖子集為輸入。然后的3個(gè)以不相鄰的4個(gè)特征圖子集為輸入。最后一個(gè)將S2中所有特征圖為輸入。
則:可訓(xùn)練參數(shù):6*(355+1)+6*(455+1)+3*(455+1)+1*(655+1)=1516
連接數(shù):10101516=151600
詳細(xì)說(shuō)明:第一次池化之后是第二次卷積,第二次卷積的輸出是C3,16個(gè)10x10的特征圖,卷積核大小是 55. 我們知道S2 有6個(gè) 1414 的特征圖,怎么從6 個(gè)特征圖得到 16個(gè)特征圖了? 這里是通過(guò)對(duì)S2 的特征圖特殊組合計(jì)算得到的16個(gè)特征圖。具體如下:
C3的前6個(gè)feature map(對(duì)應(yīng)上圖第一個(gè)紅框的6列)與S2層相連的3個(gè)feature map相連接(上圖第一個(gè)紅框)
后面6個(gè)feature map與S2層相連的4個(gè)feature map相連接(上圖第二個(gè)紅框),
后面3個(gè)feature map與S2層部分不相連的4個(gè)feature map相連接,
最后一個(gè)與S2層的所有feature map相連。
卷積核大小依然為55,所以總共有6(355+1)+6*(455+1)+3*(455+1)+1*(655+1)=1516個(gè)參數(shù)。而圖像大小為1010,所以共有151600個(gè)連接。
C3與S2中前3個(gè)圖相連的卷積結(jié)構(gòu)如下圖所示:
上圖對(duì)應(yīng)的參數(shù)為 355+1,一共進(jìn)行6次卷積得到6個(gè)特征圖,所以有6(355+1)參數(shù)。 為什么采用上述這樣的組合了?論文中說(shuō)有兩個(gè)原因:1)減少參數(shù),2)這種不對(duì)稱的組合連接的方式有利于提取多種組合特征。
5.S4層-池化層(下采樣層)
輸入:1010
采樣區(qū)域:22
采樣方式:4個(gè)輸入相加,乘以一個(gè)可訓(xùn)練參數(shù),再加上一個(gè)可訓(xùn)練偏置。結(jié)果通過(guò)sigmoid
采樣種類:16
輸出featureMap大小:55(10/2)
神經(jīng)元數(shù)量:5516=400
連接數(shù):16(22+1)55=2000
S4中每個(gè)特征圖的大小是C3中特征圖大小的1/4
詳細(xì)說(shuō)明:S4是pooling層,窗口大小仍然是22,共計(jì)16個(gè)feature map,C3層的16個(gè)10x10的圖分別進(jìn)行以2x2為單位的池化得到16個(gè)5x5的特征圖。有5x5x5x16=2000個(gè)連接。連接的方式與S2層類似。
6.C5層-卷積層
輸入:S4層的全部16個(gè)單元特征map(與s4全相連)
卷積核大小:55
卷積核種類:120
輸出featureMap大小:11(5-5+1)
可訓(xùn)練參數(shù)/連接:120*(1655+1)=48120
詳細(xì)說(shuō)明:這一層還是卷積層,且這一層的特征平面有120個(gè),每個(gè)特征平面是5x5的,而上一層的池化層S2只有16個(gè)平面且每個(gè)平面為5x5,本層使用的卷積核為5x5,因此和池化層正好匹配,那么怎么連接呢?很簡(jiǎn)單就是這里每個(gè)特征平面連接池化層的所有的采樣層。這里稱呼特征平面已經(jīng)不合適了,因?yàn)槊總€(gè)卷積核只對(duì)應(yīng)一個(gè)神經(jīng)元了,因此本層只有120個(gè)神經(jīng)元并列排列,每個(gè)神經(jīng)元連接池化層的所有層。C5層的每個(gè)神經(jīng)元的連接數(shù)為5x5x16+1,因此總共的連接數(shù)為:(5x5x16+1)x120=48120,而這一層的權(quán)值和連接數(shù)一樣,因此也有48120個(gè)待訓(xùn)練權(quán)值。
C5層的網(wǎng)絡(luò)結(jié)構(gòu)如下:
7.F6層-全連接層
輸入:c5 120維向量
計(jì)算方式:計(jì)算輸入向量和權(quán)重向量之間的點(diǎn)積,再加上一個(gè)偏置,結(jié)果通過(guò)sigmoid函數(shù)輸出。
可訓(xùn)練參數(shù):84*(120+1)=10164
詳細(xì)說(shuō)明:6層是全連接層。F6層有84個(gè)節(jié)點(diǎn),對(duì)應(yīng)于一個(gè)7x12的比特圖,-1表示白色,1表示黑色,這樣每個(gè)符號(hào)的比特圖的黑白色就對(duì)應(yīng)于一個(gè)編碼。該層的訓(xùn)練參數(shù)和連接數(shù)是(120 + 1)x84=10164。ASCII編碼圖如下:
F6層的連接方式如下:
8.Output層-全連接層
Output層也是全連接層,共有10個(gè)節(jié)點(diǎn),分別代表數(shù)字0到9,且如果節(jié)點(diǎn)i的值為0,則網(wǎng)絡(luò)識(shí)別的結(jié)果是數(shù)字i。采用的是徑向基函數(shù)(RBF)的網(wǎng)絡(luò)連接方式。
本層的輸出有激活函數(shù),激活函數(shù)為雙曲正切函數(shù):
根據(jù)論文解釋:A的幅值,S是原點(diǎn)處的傾斜率,A的經(jīng)驗(yàn)值是1.7159,原因沒(méi)說(shuō)。
下面我們看看他是和F6層是如何連接的,他不在是BP的神經(jīng)輸出層,而是基于徑向基神經(jīng)網(wǎng)絡(luò)的輸出層,這里使用的是更簡(jiǎn)單的歐幾里得徑向基函數(shù),如下:
假設(shè)x是上一層的輸入,y是RBF的輸出,則RBF輸出的計(jì)算方式是:
上式w_ij 的值由i的比特圖編碼確定,i從0到9,j取值從0到7*12-1。
公式含義:
徑向基神經(jīng)網(wǎng)絡(luò),他基于距離進(jìn)行衡量?jī)蓚€(gè)數(shù)據(jù)的相近程度的,RBF網(wǎng)最顯著的特點(diǎn)是隱節(jié)點(diǎn)采用輸人模式與中心向量的距離(如歐氏距離)作為函數(shù)的自變量,并使用徑向基函數(shù)(如函數(shù))作為激活函數(shù)。徑向基函數(shù)關(guān)于N維空間的一個(gè)中心點(diǎn)具有徑向?qū)ΨQ性,而且神經(jīng)元的輸人離該中心點(diǎn)越遠(yuǎn),神經(jīng)元的激活程度就越低。
上式是基于歐幾里得距離,就是說(shuō)F6層為84個(gè)輸入用表示,而輸出有10個(gè)用表示,而權(quán)值使用,上式說(shuō)明所有輸入和權(quán)值的距離平方和為依據(jù)判斷,如果越相近距離越小,輸出越小則去哪個(gè),如果我們存儲(chǔ)的到的值為標(biāo)準(zhǔn)的輸出,如標(biāo)準(zhǔn)的手寫體0,1,2,3等,那么最后一層就說(shuō)明。F6層和標(biāo)準(zhǔn)的作比較,和標(biāo)準(zhǔn)的那個(gè)圖形越相似就說(shuō)明就越是那個(gè)字符的可能性更大。
RBF輸出的值越接近于0,則越接近于i,即越接近于i的ASCII編碼圖,表示當(dāng)前網(wǎng)絡(luò)輸入的識(shí)別結(jié)果是字符i。該層有84x10=840個(gè)參數(shù)和連接。
這里標(biāo)準(zhǔn)的每個(gè)字符都是像素都是12x7=84.這就是解釋了為什么F6層的神經(jīng)元為84個(gè),因?yàn)樗阉邢袼攸c(diǎn)和標(biāo)準(zhǔn)的比較在進(jìn)行判斷,因此從這里也可以看出,這里不僅僅可以訓(xùn)練手寫體數(shù)字,也可以識(shí)別其他字符,取決于和網(wǎng)絡(luò)的設(shè)計(jì),這些可以認(rèn)為修改的。例如我們讓他識(shí)別可打印的ASCII碼,把小圖片添加到這里就可以了,同時(shí)增加輸出的神經(jīng)元個(gè)數(shù)就可以完成了。再給出另外一個(gè)詳細(xì)的圖:
LeNet-5識(shí)別數(shù)字3的過(guò)程如下圖所示:
【代碼實(shí)現(xiàn)】
# -*- coding: UTF-8 -*- # 本代碼訓(xùn)練的是28*28的數(shù)據(jù)集,對(duì)模型做了一些調(diào)整,大家按自己的需要進(jìn)行取舍 # mnist神經(jīng)網(wǎng)絡(luò)訓(xùn)練,采用LeNet-5模型import os import cv2 import numpy as npfrom keras.datasets import mnist from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D, Flatten from keras.layers.core import Dense, Dropout, Activation, Flatten from keras.layers.advanced_activations import PReLU from keras.optimizers import SGD, Adadelta, Adagradfrom keras.utils import np_utils from keras.utils.vis_utils import plot_modelimport h5py from keras.models import model_from_jsondef loadData(path, number):data = np.empty((number, 1, 28, 28), dtype="float32") # empty與ones差不多原理,但是數(shù)值隨機(jī),類型隨后面設(shè)定labels = np.empty((number,), dtype="uint8")listImg = os.listdir(path)count = 0for img in listImg:imgData = cv2.imread(path + '/' + img, 0) # 數(shù)據(jù)l = int(img.split('-')[0]) # 答案arr = np.asarray(imgData, dtype="float32") # 將img數(shù)據(jù)轉(zhuǎn)化為數(shù)組形式data[count, :, :, :] = arr # 將每個(gè)三維數(shù)組賦給datalabels[count] = l # 取該圖像的數(shù)值屬性作為標(biāo)簽count = count + 1print(path, " loaded ", count)if count >= number:breakreturn data, labelsprint("step0:dataset preloading") # 從圖片文件加載數(shù)據(jù) # the data, shuffled and split between train and test sets (trainData, trainLabels), (testData, testLabels) = mnist.load_data()# 訓(xùn)練數(shù)據(jù) 60000張手寫圖片,28*28*1 # 測(cè)試數(shù)據(jù) 10000張手寫圖片,28*28*1trainData = trainData.reshape(60000, 784) testData = testData.reshape(10000, 784) print("step1:dataset classification") trainLabels = np_utils.to_categorical(trainLabels, 10) # label為0~9共10個(gè)類別,keras要求格式為binary class matrices,轉(zhuǎn)化一下,直接調(diào)用keras提供的這個(gè)函數(shù) testLabels = np_utils.to_categorical(testLabels, 10)# tf或th為后端,采取不同參數(shù)順序 # th # if K.image_data_format() == 'channels_first': # -x_train.shape[0]=6000 # x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) # -x_train.shape:(60000, 1, 28, 28) # x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) # x_test.shape:(10000, 1, 28, 28) # 單通道灰度圖像,channel=1 # input_shape = (1, img_rows, img_cols) # else: #tf # x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) # x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) # input_shape = (img_rows, img_cols, 1) print("step2:build the model") # tensorflow后端 trainData = trainData.reshape(trainData.shape[0], 28, 28, 1) testData = testData.reshape(testData.shape[0], 28, 28, 1)# 建立一個(gè)Sequential模型 model = Sequential()# model.add(Conv2D(4, 5, 5, border_mode='valid',input_shape=(28,28,1))) # 第一個(gè)卷積層,4個(gè)卷積核,每個(gè)卷積核5*5,卷積后24*24,第一個(gè)卷積核要申明input_shape(通道,大小) ,激活函數(shù)采用“tanh” model.add(Conv2D(filters=4, kernel_size=(5, 5), padding='valid', input_shape=(28, 28, 1), activation='tanh'))# model.add(Conv2D(8, 3, 3, subsample=(2,2), border_mode='valid')) # 第二個(gè)卷積層,8個(gè)卷積核,不需要申明上一個(gè)卷積留下來(lái)的特征map,會(huì)自動(dòng)識(shí)別,下采樣層為2*2,卷完且采樣后是11*11 model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(filters=8, kernel_size=(3, 3), padding='valid', activation='tanh')) # model.add(Activation('tanh'))# model.add(Conv2D(16, 3, 3, subsample=(2,2), border_mode='valid')) # 第三個(gè)卷積層,16個(gè)卷積核,下采樣層為2*2,卷完采樣后是4*4 model.add(Conv2D(filters=16, kernel_size=(3, 3), padding='valid', activation='tanh')) model.add(MaxPooling2D(pool_size=(2, 2))) # model.add(Activation('tanh'))model.add(Flatten()) # 把多維的模型壓平為一維的,用在卷積層到全連接層的過(guò)度# model.add(Dense(128, input_dim=(16*4*4), init='normal')) # 全連接層,首層的需要指定輸入維度16*4*4,128是輸出維度,默認(rèn)放第一位 model.add(Dense(128, activation='tanh'))# model.add(Activation('tanh'))# model.add(Dense(10, input_dim= 128, init='normal')) # 第二層全連接層,其實(shí)不需要指定輸入維度,輸出為10維,因?yàn)槭?0類 model.add(Dense(10, activation='softmax')) # model.add(Activation('softmax')) # 激活函數(shù)“softmax”,用于分類# 訓(xùn)練CNN模型 print("step3:start train mode") sgd = SGD(lr=0.05, momentum=0.9, decay=1e-6, nesterov=True) # 采用隨機(jī)梯度下降法,學(xué)習(xí)率初始值0.05,動(dòng)量參數(shù)為0.9,學(xué)習(xí)率衰減值為1e-6,確定使用Nesterov動(dòng)量 model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) # 配置模型學(xué)習(xí)過(guò)程,目標(biāo)函數(shù)為categorical_crossentropy:亦稱作多類的對(duì)數(shù)損失,注意使用該目標(biāo)函數(shù)時(shí),需要將標(biāo)簽轉(zhuǎn)化為形如(nb_samples, nb_classes)的二值序列,第18行已轉(zhuǎn)化,優(yōu)化器為sgdprint("step4:Model training method ") model.fit(trainData, trainLabels, batch_size=100, epochs=20, shuffle=True, verbose=1, validation_split=0.2) # 訓(xùn)練模型,訓(xùn)練nb_epoch次,bctch_size為梯度下降時(shí)每個(gè)batch包含的樣本數(shù),驗(yàn)證集比例0.2,verbose為顯示日志,shuffle是否打亂輸入樣本的順序# 輸出模型圖片 print("step5:model data layer change display") plot_model(model, to_file='model2.png', show_shapes=True, show_layer_names=False)print(model.metrics_names) # 對(duì)測(cè)試數(shù)據(jù)進(jìn)行測(cè)試 print("step6:data test") print(model.evaluate(testData, testLabels,verbose=0,batch_size=500)) print("step7:model save") # 保存model json_string = model.to_json() open('my_model_architecture.json', 'w').write(json_string) model.save_weights('my_model_weights.h5')各層之間數(shù)據(jù)展示如下圖所示:
各層之間的數(shù)據(jù)可視化展示使用的是Pydot,有關(guān)pydot的使用參考我的另外一個(gè)文章:https://blog.csdn.net/weixin_44322778/article/details/122563229
【參考鏈接】
網(wǎng)絡(luò)解析(一):LeNet-5詳解
LeNet-5
深度學(xué)習(xí) — 卷積神經(jīng)網(wǎng)絡(luò)CNN(LeNet-5網(wǎng)絡(luò)詳解)
論文筆記
總結(jié)
以上是生活随笔為你收集整理的DeepLearning:CNN网络学习之LetNet-5解读(论文+分析+代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pip安装 tensorflow-gpu
- 下一篇: DeepLearning:手动编辑pyt