在之前我們學(xué)習(xí)好搭建全連接神經(jīng)網(wǎng)絡(luò)后,今天讓我們繼續(xù)學(xué)習(xí)去搭建卷積神經(jīng)網(wǎng)絡(luò),并且來使用mnist進(jìn)行手寫數(shù)字識(shí)別.
在我們使用的mnist數(shù)據(jù)集中,一張分辨率僅僅是 28x28 的黑白圖像,就有近 40 萬個(gè)待優(yōu)化的參數(shù)?,F(xiàn)實(shí)生活中高分辨率的彩色圖像,像素點(diǎn)更多,且為紅綠藍(lán)三通道信息。 待優(yōu)化的參數(shù)過多,容易導(dǎo)致模型過擬合。為避免這種現(xiàn)象,實(shí)際應(yīng)用中一 般不會(huì)將原始圖片直接喂入全連接網(wǎng)絡(luò)。
因此將圖片進(jìn)行多次特征提取,再把提取后的計(jì)算機(jī)可讀特征喂給全連接 網(wǎng)絡(luò),這樣看起來是一個(gè)很好的主意.
1:關(guān)于卷積
卷積是一種有效提取圖片特征的方法。一般用一個(gè)正方形卷積核,遍歷圖片 上的每一個(gè)像素點(diǎn)。圖片與卷積核重合區(qū)域內(nèi)相對(duì)應(yīng)的每一個(gè)像素值乘卷積核內(nèi)相對(duì)應(yīng)點(diǎn)的權(quán)重,然后求和,再加上偏置后,最后得到輸出圖片中的一個(gè)像素值。
具體的計(jì)算過程如圖中所示:

上面是 5x5x1 的灰度圖片,1表示單通道,5x5表示分辨率,共有 5 行 5 列個(gè)灰度值。若用一個(gè) 3x3x1 的卷積核對(duì)此 5x5x1 的灰度圖片進(jìn)行卷積,偏置項(xiàng) b=1,則求卷積的計(jì)算是:(-1)x1+0x0+1x2+(-1)x5+0x4+1x2+(-1)x3+0x4+1x5+1=1(注意不要忘記加偏置 1)
輸出圖片邊長(zhǎng)=(輸入圖片邊長(zhǎng)–卷積核長(zhǎng)+1)/步長(zhǎng),此圖為:(5 – 3 + 1)/ 1 = 3,輸出圖片是 3x3 的分辨率,用了 1 個(gè)卷積核,輸出深度是 1,最后輸出的是 3x3x1 的圖片。
2:全零填充 Padding
有時(shí)會(huì)在輸入圖片周圍進(jìn)行全零填充,這樣可以保證輸出圖片的尺寸和輸入 圖片一致
如圖中所示:

例:在前面 5x5x1 的圖片周圍進(jìn)行全零填充,可使輸出圖片仍保持 5x5x1 的 維度。這個(gè)全零填充的過程叫做 padding。
輸出數(shù)據(jù)體的尺寸=(W?F+2P)/S+1
例:輸入是 7×7,濾波器是 3×3,步長(zhǎng)為 1,填充為 0,那么就能得到一個(gè) 5×5 的輸出。如果步長(zhǎng)為 2,輸出就是 3×3。
如果輸入量是 32x32x3,核是 5x5x3,不用全零填充,輸出是(32-5+1)/1=28, 如果要讓輸出量保持在 32x32x3,可以對(duì)該層加一個(gè)大小為 2 的零填充??梢愿?據(jù)需求計(jì)算出需要填充幾層零32=(32-5+2P)/1 +1,計(jì)算出 P=2,即需填充 2 層零。

3:池化
在通過卷積獲得了特征 (features) 之后,下一步我們希望利用這些特征去做分類。理論上講,人們可以用所有提取得到的特征去訓(xùn)練分類器,例如 softmax 分類器,但這樣做面臨計(jì)算量的挑戰(zhàn)。例如:對(duì)于一個(gè) 96X96 像素的圖像,假設(shè)我們已經(jīng)學(xué)習(xí)得到了400個(gè)定義在8X8輸入上的特征,每一個(gè)特征和圖像卷積都會(huì)得到一個(gè) (96 ? 8 + 1) * (96 ? 8 + 1) = 7921 維的卷積特征,由于有 400 個(gè)特征,所以每個(gè)樣例 (example) 都會(huì)得到一個(gè) 892 * 400 = 3,168,400 維的卷積特征向量。學(xué)習(xí)一個(gè)擁有超過 3 百萬特征輸入的分類器十分不便,并且容易出現(xiàn)過擬合 (over-fitting)。
為了解決這個(gè)問題,首先回憶一下,我們之所以決定使用卷積后的特征是因?yàn)閳D像具有一種“靜態(tài)性”的屬性,這也就意味著在一個(gè)圖像區(qū)域有用的特征極有可能在另一個(gè)區(qū)域同樣適用。因此,為了描述大的圖像,一個(gè)很自然的想法就是對(duì)不同位置的特征進(jìn)行聚合統(tǒng)計(jì),例如,人們可以計(jì)算圖像一個(gè)區(qū)域上的某個(gè)特定特征的平均值 (或最大值)。這些概要統(tǒng)計(jì)特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時(shí)還會(huì)改善結(jié)果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時(shí)也稱為平均池化或者最大池化 (取決于計(jì)算池化的方法)。

4:舍棄Dropout
在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中,為了減少過多參數(shù)常使用 dropout 的方法,將一部 分神經(jīng)元按照一定概率從神經(jīng)網(wǎng)絡(luò)中舍棄。這種舍棄是臨時(shí)性的,僅在訓(xùn)練時(shí)舍 棄一些神經(jīng)元;在使用神經(jīng)網(wǎng)絡(luò)時(shí),會(huì)把所有的神經(jīng)元恢復(fù)到神經(jīng)網(wǎng)絡(luò)中。比如 上面這張圖,在訓(xùn)練時(shí)一些神經(jīng)元不參加神經(jīng)網(wǎng)絡(luò)計(jì)算了。Dropout 可以有效減少過擬合。
dropout 一般會(huì)放到全連接網(wǎng)絡(luò)中。在實(shí)際應(yīng)用中,常常在前向傳播構(gòu)建神經(jīng)網(wǎng)絡(luò)時(shí)使用 dropout 來減小過擬合 加快模型的訓(xùn)練速度。

5:卷積NN
卷積NN的作用是借助卷積核(kernel)提取特征后,送入全連接網(wǎng)絡(luò).
卷積神經(jīng)網(wǎng)絡(luò)可以認(rèn)為由兩部分組成,一部分是對(duì)輸入圖片進(jìn)行特征提取, 另一部分就是全連接網(wǎng)絡(luò),只不過喂入全連接網(wǎng)絡(luò)的不再是原始圖片,而是經(jīng)過 若干次卷積、激活和池化后的特征信息。 卷積神經(jīng)網(wǎng)絡(luò)從誕生到現(xiàn)在,已經(jīng)出現(xiàn)了許多經(jīng)典網(wǎng)絡(luò)結(jié)構(gòu),比如 Lenet-5、 Alenet、VGGNet、GoogleNet 和 ResNet 等。每一種網(wǎng)絡(luò)結(jié)構(gòu)都是以卷積、激活、 池化、全連接這四種操作為基礎(chǔ)進(jìn)行擴(kuò)展。 Lenet-5 是最早出現(xiàn)的卷積神經(jīng)網(wǎng)絡(luò),由 Lecun 團(tuán)隊(duì)首先提出,Lenet-5 有效 解決了手寫數(shù)字的識(shí)別問題
Lenet 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)為:
①輸入為 32*32*1 的圖片大小,為單通道的輸入;
②進(jìn)行卷積,卷積核大小為 5*5*1,個(gè)數(shù)為 6,步長(zhǎng)為 1,非全零填充模式;
③將卷積結(jié)果通過非線性激活函數(shù);
④進(jìn)行池化,池化大小為 2*2,步長(zhǎng)為 1,全零填充模式;
⑤進(jìn)行卷積,卷積核大小為 5*5*6,個(gè)數(shù)為 16,步長(zhǎng)為 1,非全零填充模式;
⑥將卷積結(jié)果通過非線性激活函數(shù);
⑦進(jìn)行池化,池化大小為 2*2,步長(zhǎng)為 1,全零填充模式;
⑧全連接層進(jìn)行 10 分類。
Lenet 神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)圖及特征提取過程如下所示:

Lenet 神經(jīng)網(wǎng)絡(luò)的輸入是 32*32*1,經(jīng)過 5*5*1 的卷積核,卷積核個(gè)數(shù)為 6 個(gè), 采用非全零填充方式,步長(zhǎng)為 1,根據(jù)非全零填充計(jì)算公式:輸出尺寸=(輸入 尺寸-卷積核尺寸+1)/步長(zhǎng)=(32-5+1)/1=28.故經(jīng)過卷積后輸出為 28*28*6。 經(jīng)過第一層池化層,池化大小為 2*2,全零填充,步長(zhǎng)為 2,由全零填充計(jì)算公 式:輸出尺寸=輸入尺寸/步長(zhǎng)=28/2=14,池化層不改變深度,深度仍為 6。用同 樣計(jì)算方法,得到第二層池化后的輸出為 5*5*16。將第二池化層后的輸出拉直 送入全連接層。
根據(jù) Lenet 神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)可得,Lenet 神經(jīng)網(wǎng)絡(luò)具有如下特點(diǎn):
①卷積(Conv)、池化(ave-pooling)、非線性激活函數(shù)(sigmoid)相互交替;
②層與層之間稀疏連接,減少計(jì)算復(fù)雜度。
而我們下一篇文章,將會(huì)通過微調(diào)lenet網(wǎng)絡(luò),來讓其適應(yīng)mnist數(shù)據(jù)集,因此讓我們來搭建我們自己的神經(jīng)網(wǎng)絡(luò).
引用資料:
1;http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial
2:北大課程<人工智能與TensorFlow>