深度学习入门(一):LeNet-5教程与详解
1.什么是LeNet
LeNet5誕生于1994年,是最早的卷積神經網絡之一,并且推動了深度學習領域的發展。自從1988年開始,在多年的研究和許多次成功的迭代后,這項由Yann LeCun完成的開拓性成果被命名為LeNet5。
LeNet:
- 主要用來進行手寫字符的識別與分類
- 確立了CNN的結構,現在神經網絡中的許多內容在LeNet的網絡結構中都能看到
雖然LeNet網絡結構比較簡單,但是剛好適合神經網絡的入門學習。
2.分析
2.1.LeNet結構
如圖所示,LeNet共分為7層,分別是:
- C1,卷積層
- S2,池化層
- C3,卷積層
- S4,池化層
- C5,卷積層
- F6,全連接層
- OUTPUT,全連接層
接下來我們將對各層進行詳細的分析。
2.2.輸入層INPUT
一般來說不將輸入層視為網絡層次結構之一,上面講的"7層"也不包括輸入層
輸入層為尺寸32 × 32的圖片。由于MNIST數據集中的圖片也是32 × 32的,因此不用進行額外的尺寸調整操作。
2.3.卷積層C1
2.3.1.什么是卷積
卷積的本質就是輸入圖片與卷積核做點積(數量積)。
舉一個例子,假設我們有一副5 × 5的輸入圖片、3 × 3的卷積核分別如下:
# 圖片 #卷積核
1 1 1 0 0 1 0 1
0 1 1 1 0 0 1 0
0 0 1 1 1 1 0 1
0 0 1 1 0
0 1 1 0 0
那么卷積的過程就如下面的動畫所示:卷積核順序掃描輸入圖片,并作點積。
例如,左上角"4"的計算過程為:
1*1 + 1*0 + 1*1 + 0*0 + 1*1 + 1*0 + 0*1 + 0*0 + 1*1 = 4
一般來說,通過卷積操作輸出的新圖像(在這里為一張3 × 3的圖像)我們稱之為特征圖(featuremap)。
卷積的意義在于,利用不同的卷積核掃描圖像,可以提取圖像不同的特征。例如,用以下卷積核便可以提取出水平方向的邊緣(思考:為什么?)
-1 -1 -12 2 2
-1 -1 -1
2.3.2.卷積層C1參數分析
- 輸入:32 × 32的圖像
- 卷積核種類: 6
因此卷積層C1理論上能提取出輸入圖像6種不同的特征 - 卷積核大小:5 × 5
- 輸出特征圖數量: 6
每個卷積核分別與輸入圖像進行卷積運算,共得到6份輸出 - 輸出特征圖大小:28 × 28
從上一節舉的例子中可以分析出,在沒有進行 填充(padding) 的情況下,輸出特征圖的邊長為:
輸入圖像 - 卷積核 + 1
即32 - 5 + 1 = 28 - 神經元數量:28 × 28 × 6
在神經網絡的學習中,我們可以知道神經元其實就是一個"數"。而卷積層C1是由6張特征圖組成的,每張特征圖中包含28 × 28個像素,一個像素其實就是一個0 ~ 255之間的數(表示灰度值),對應著一個神經元。因此共有28 × 28 × 6 = 4704個神經元。 - 可訓練參數:(5 × 5 + 1) × 6
首先,每個卷積核是一個5 × 5的矩陣,矩陣里的每個數都是要通過訓練得到的;此外,在實際卷積運算后還要加上一個偏置(bias),因此每個卷積核需要訓練5 × 5 + 1個參數,六個卷積核共需要訓練(5 × 5 + 1) × 6 = 156個參數。 - 連接數:28 × 28 × (5 × 5 + 1) × 6
卷積層的每個特征圖的各像素都與其對應的卷積核的各參數間有連接。一共有6個這樣的特征圖——卷積核對,每個"特征圖——卷積核"對包含28 × 28 × (5 × 5 + 1) × 6個連接,因此共有28 × 28 × (5 × 5 + 1) × 6 = 122304個連接。
需要注意的是,由于權值共享機制的存在,我們只需要訓練156個參數。
2.4.池化層S2
2.4.1.什么是池化
在這里,池化(pooling)是進行下采樣(downsampling)操作,即對圖像進行壓縮。
以最大池化為例:
采用2 × 2的濾波器(filter),最大池化的結果如上,即對每個2 × 2的區域取最大值。最小池化、平均池化同理,分別是取相應區域的最小值,平均值。
一般來說,池化:
- 往往在卷積層后面
- 可以降低卷積層輸出的特征向量,改善過擬合的現象
2.4.2.池化層S2參數分析
- 輸入:28 × 28的特征圖(6張)
- 采樣區域: 2 × 2
在這里,采樣方式為4個輸入相加,乘以一個可訓練參數,再加上一個可訓練偏置,并將結果通過sigmoid函數。 - 輸出特征圖大小:14 × 14
- 輸出特征圖數量:6
- 神經元數量:14 × 14 × 6
計算方法同上一節,每張特征圖有14 × 14個像素,共6張,因此有14 × 14 × 6 = 1176個神經元。 - 可訓練參數:2 × 6
對于每張特征圖,只有兩個參數需要確定:用于相乘的"可訓練參數"與"可訓練偏置",共6張特征圖,因此要訓練6 × 2 = 12個參數。 - 連接數:14 × 14 × 6 × (2 × 2 + 1)
池化層的每個特征圖的各像素都與2×2采樣區域以及1個偏置有連接。因此共有14 × 14 × 6 × (2 × 2 + 1) = 5880個連接。
2.5.卷積層C3
- 輸入:14 × 14的特征圖(6張)
- 卷積核種類: 16
因此卷積層C3能夠提取出更多細微的特征 - 卷積核大小:5 × 5
- 輸出特征圖數量: 16
在卷積層C1中,卷積核有6種,而輸入圖像只有1張,因此只需要將6個卷積核分別對1張圖像進行卷積操作,最后得到6張特征圖。那么輸入6張圖像的話應該怎么處理呢?
在這里,采用的方法是"每個卷積核對多張特征圖"進行處理,例如,編號為0的卷積核處理編號為0、1、2的特征圖,編號為15的卷積核處理編號為0、1、2、3、4、5的特征圖…具體的對應規則如下:
橫軸為編號0 ~ 15的16個卷積核,縱軸為編號為0 ~ 5的6張輸入特征圖。一種方便的記憶方法是前6個卷積核處理三張連續的特征圖(對應第一個紅框),之后6個卷積核處理四張連續的特征圖(對應第二個紅框),之后3個卷積核處理四張兩兩連續的特征圖(對應第三個紅框),最后1個卷積核處理全部六張特征圖(對應最后一個紅框)。 - 輸出特征圖大小:10 × 10
輸出特征圖的邊長為14 - 5 + 1 = 10 - 可訓練參數:1516
以第一個紅框為例。首先,每個卷積核包含5 × 5個可訓練的參數;而在這里每個卷積核需要與3張特征圖相連,最后還要加上1個偏置,因此需要訓練3 × 5 × 5 + 1個參數。第一個紅框內有6個這樣的卷積核,因此共需要訓練6 × (3 × 5 × 5 + 1)個參數。
同理,對于第二個紅框,其共需要訓練6 × (4 × 5 × 5 + 1)個參數;對于第三個紅框,其共需要訓練3 × (4 × 5 × 5 + 1)個參數;對于第四個紅框,其共需要訓練1 × (6 × 5 × 5 + 1)個參數。
總計可訓練6 × (3 × 5 × 5 + 1) + 6 × (4 × 5 × 5 + 1) + 3 × (4 × 5 × 5 + 1) + 1 × (6 × 5 × 5 + 1) = 1516個參數。 - 連接數:10 × 10 × 1516
卷積層的每個特征圖的各像素都與其對應的卷積核的各參數間有連接。因此共有10 × 10 × 1516 = 151600個連接。
卷積層C3采用這種卷積核-特征圖組合方式的好處有:
- 減少參數
- 有利于提取多種組合特征(因為組合方式并不對稱)
2.6.池化層S4
- 輸入:10 × 10的特征圖(16張)
- 采樣區域: 2 × 2
在這里,采樣方式為4個輸入相加,乘以一個可訓練參數,再加上一個可訓練偏置,并將結果通過sigmoid函數。 - 輸出特征圖大小:5 × 5
- 輸出特征圖數量:16
- 神經元數量:5 × 5 × 16
每張特征圖有5 × 5個像素,共16張,因此有5× 5 × 16 = 400個神經元。 - 可訓練參數:2 × 16
對于每張特征圖,只有兩個參數需要確定:用于相乘的"可訓練參數"與"可訓練偏置",共16張特征圖,因此要訓練16 × 2 = 32個參數。 - 連接數:5 × 5 × 16 × (2 × 2 + 1)
池化層的每個特征圖的各像素都與2×2采樣區域以及1個偏置有連接。因此共有5 × 5 × 16 × (2 × 2 + 1) = 2000個連接。
2.6.卷積層C5
-
輸入:5 × 5的特征圖(16張)
-
卷積核種類: 120
-
卷積核大小:5 × 5
-
輸出:120維向量
-
算法:
每個卷積核與16張特征圖做卷積,得到的結果求和,再加上一個偏置,結果通過sigmoid函數輸出。
-
可訓練參數:(5 x 5 x 16 + 1) x 120
對于每個卷積核,其要與16張特征圖的每個像素以及偏置相連,共120個卷積核,因此要訓練的參數為(5 x 5 x 16 + 1) x 120 = 48120。
2.7.全連接層F6
- 輸入:120維向量
- 算法: 計算輸入向量和權重向量之間的點積,再加上一個偏置,結果通過sigmoid函數輸出。
F6層有84個結點,本質上對應一張7×12的比特圖。實際上,ASCII碼就可以用一張7×12的比特圖來表示,每個像素若為-1則表示白色,1表示黑色。該全連接層的設計也是利用了這一思想。
- 輸出:84維向量
- 可訓練參數:84 × (120 + 1)
對于F6層的每個結點,其值是由輸入向量與權重向量做點積得到的,而由于權重向量與輸入向量的維度相同,因此權重向量也是120維的,需要訓練120個參數,加上偏置,每個結點需要訓練121個參數。一共有84個結點,因此需要訓練84 × 121 = 10164個參數。
2.8.全連接層OUTPUT
- 輸入:84維向量
本質上是一張7×12的比特圖,表示經過我們多層處理最終得到的一張"數字圖像"。 - 輸出:10維向量
OUTPUT層共有10個結點y0、y1、…、y9,分別對應著數字0到9。
采用徑向基函數(RBF)的連接方式,計算方式為:
yi=∑j=083(xj?wij)2{y_i} = \sum\limits_{j = 0}^{83} {{{({x_j} - {w_{ij}})}^2}} yi?=j=0∑83?(xj??wij?)2
其中,wijw_{ij}wij?的值由數字i的比特圖編碼(即上一節展示的ASCII碼比特圖編碼)確定。如果結點yi的計算結果最小,則數字識別的結果為數字i。
本質上是比較"我們處理得到的數字比特圖"與"真實比特圖"之間的相似度。
3.總結
本文撰寫時間有限,如有不足,歡迎指正!
總結
以上是生活随笔為你收集整理的深度学习入门(一):LeNet-5教程与详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: splay/fhq-treap 问卷调查
- 下一篇: [TJOI2013]拯救小矮人(反悔贪心