機器學習筆記(四)--LeNet-5

學習卷積神經網絡,最好的辦法就是去實現一些著名的模型:LeNet,AlexNet,ZF-Net,GoogleNet,VGG,ResNet。首先是最老的最簡單的LeNet:

先上張圖:

 

這張圖就已經將LeNet模型的基本內容與操作描述出來了:卷積-池化-卷積-池化-全連接,除了池化層與最後一層全連接層不用激活函數,其他層都要用.先要說明:需要激勵函數Sigmoid解決非線性問題從而將把激活的神經元特徵通過函數把特徵保留並映射出來,否則無論有多少層得出的結果依然是線性的函數。現在來一層層分析。

 

C1卷積層:

在這層,卷積核是5x5的二維的,所以得出的特徵圖是(32-5+1)28*28規格的,因爲使有6個卷積核,所以會有6張特徵圖(這裏不再贅述具體卷積的過程,但要注意每一次卷積後都要加上一個偏置值)。特別的,這層的可訓練參數有:(5*5+1)*6=156;因爲每個卷積核上的每一個元素都是權重值(5*5=25個),在加上一個偏置數bias,那麼一個卷積核就有(5*5+1)=26個,6個卷積核有26×6=156個可訓練參數。而連接數的計算爲:156×28×28×6=122304,就是輸出的特徵圖的每個神經元都與156個參數鏈接。

 

S2池化層:

那麼這裏的採樣方法是:用2*2的採樣區間,4個元素相加後乘以一個可訓練參數再加上一個偏置數,最後再用Sigmoid激活函數非線性化。輸出的特徵圖有6張14*14的(28/2=14)。這層的可訓練參數有:(1+1)*6,連接數計算爲:(2*2+1)*14*14*6。有些人可能會看出池化層的連接數與卷積層計算有些不同,我也不是很理解,但是可以知道形式:(採樣區元素個數+1個偏置)*輸出的x張特徵圖神經元總數。

 

C3卷積層:

在這層,卷積的操作就不是像C1層那樣簡單。上圖:

如圖,輸入有6張14*14圖,輸出有16張10*10圖,所以有16個5*5卷積核。這裏是將幾張輸入的圖組成一個組合,如取三張相鄰的輸入爲一組(注意這裏的相鄰的意義):012,123,234,345,451,501有這6組,然後取四張相鄰的輸入爲一組:0123,1234,2345,3450,4501,5012有6組,然後取四張不相鄰的輸入成一組:0134,1245,0235有三組,最後將6張輸入成一組:012345。這樣我們就有了6+6+3+1=16這樣的4大組16小組,每個卷積核處理一個小組生成一張輸出的10*10的特徵圖。這樣做的理由是控制參數個數並打破對稱性,期望學得互補的特徵。那麼問題又來了:3/4/6張輸入分別與一個卷積核要如何才能輸出一張圖?答案很簡單:一個卷積核與3/4/6生成3/4/6張圖,將3/4/6張圖加起來就是所要的特徵圖。可訓練參數:(5*5*3+1)*6+(5*5*4+1)*6+(5*5*4+1)*3+(5*5*6+1)*1=1516;這裏需注意:將卷積核想成三維的就好理解爲什麼是5*5*3了,連接數:(5*5*3+1)*10*10*6+(5*5*4+1)*10*10*6+(5*5*4+1)*10*10*3+(5*5*6+1)*10*10*1=10*10*1516=151600。

 

 

S4池化層:

在這層,16張10*10輸入圖,輸出16張5*5特徵圖,所以採樣區大小爲2*2。同理,可訓練參數:(1+1)*16,

連接數:(2*2+1)*5*5*16。

 

C5全連接層:

在這層,16張5*5圖,輸出爲120張1*1的圖,所以卷積核有120個規格爲5*5*16的。那麼可訓練參數:(5*5*16+1)*120=48120;連接數:(5*5*16+1)*1*1*120=48120。

 

F6全連接層:

如字面意思,全連接層就是將輸入的x張圖的每一張圖化成一個數值,最後組成一個一維的矩陣,這樣就將輸入連接起來了。在具體的操做層面,全連接就是卷積。120張1*1的輸入,84張1*1的輸出,卷積核選擇與輸入相同規格1*1有84張,卷積一次得出一個數值再加上一個偏置。所以可訓練參數有:(1*1*120+1)*84=10164,連接數:(1*1*120+1)*84*1=10164。

 

OUTPUT層:

這層也稱爲高斯連接,由歐式徑向基單元組成,每一個分類爲一個單元,函數如下:

其中X代表輸入,而Y代表函數的輸出。那麼在這裏,共有10個分類,那麼就有10個y,每一個y都有84個輸入x。同樣是全連接層,選擇的10*84的權重矩陣,w就是每個輸入對應的權重參數。得出y後在放入Sigmoid激活函數中產生一個i單元,最後10個單元都算出來,最後用softmax+argmax解決分類問題。

 

這裏在再記錄梯度下降法

舉一個簡單的例子:需要擬合一個一次函數:

假設正確結果是y,那麼就會有誤差,我們給出誤差函數:

因爲J函數中的x和y就是給出的樣本,每次求J時都一樣,所以J就變成了西塔0和西塔1的函數。那麼這時問題就是:如何求出當J取min值時兩個西塔的值?解決方法之一就是梯度下降法。

首先,J是一個多元函數,對J的求其中一個元的偏導數,就是求出這個元的在函數上每個點的導數,就可以得到這個元在某個點是否爲遞增或遞減,從而決定這個元的更新方向。a是學習率,決定下降的步子大小,即快慢。

所以梯度下降爲:先將樣本放到每一個x和y上,在開始的時候分別給兩個西塔一個初始值,然後不斷更新兩個西塔的值直到J函數的值收斂,得到的J就是近似的最小值,得到的兩個西塔就是所要參數,把參數帶回h函數,那麼此時這個函數的擬合效果就是最好的。需要特別注意的是:假設J有n個參數,在更新參數時,你需要同步更新這些參數,不能更新一個就帶入一個,這是不對的,會影響求導的結果。

 

但是在神經網絡中如何使用梯度下降法呢?所用到的就是傳播算法與反向傳播算法。

1.正向傳播

這是一個簡單的三層神經網絡,w是權重參數,b是偏置值。我們給w和b初始值:

所以現在給出輸入i1=0.05,i2=0.10,讓輸出的o1和o2的值儘可能接近0.01和0.99.

向前傳播:

計算h1的加權和:

然後計算h1輸給o1的值(就是用Sigmoid函數處理一下):

同理可求

 

然後計算輸出層的o1和o2:

同理:

這樣擬合的結果是[0.75136507,0.772928465],顯然距離正確結果還挺遠。所以要用反向傳播法來更新參數。

 

2.反向傳播

首先實現隱含層->輸出層的參數的更新(即更新w5,6,7,8)

首先,總誤差是:(target就是正確的結果)

用更新w5作爲例子:

同樣的,用總誤差對w5求偏導數,但是不能直接求,這裏需要使用用鏈式法則。

從上面的圖就可以知道,總誤差先傳給Outo1,再給neto1,最後傳給w5.所以有:

在處理之前先要知道Sigmoid函數的求導:

=

下面分別計算式子中三個偏導:

最後乘起來:

就求出了對w5的偏導,接着就可以更新w5:

n爲學習率,同理:

接着實現隱藏層->隱藏層的參數更新(即更新w1,2,3,4).

如上圖,總誤差直接傳給Outh1,再給neth1,最後到w1中。

就能夠更新w1,2,3,4了。但要注意,8個w都是同步更新的,分開寫只是便於理解。

這樣重複下去,總誤差就會變的很小,擬合值就會極限接近正解。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章