Matlab程式設計之——卷積神經網路CNN程式碼解析

步入量化學習艾莉絲發表於2019-03-02

卷積神經網路CNN程式碼解析

deepLearnToolbox-master是一個深度學習matlab包,裡面含有很多機器學習演算法,如卷積神經網路CNN,深度信念網路DBN,自動編碼AutoE

ncoder(堆疊SAE,卷積CAE)的作者是 RasmusBerg Palm


今天給介紹deepLearnToolbox-master中的CNN部分。

  • DeepLearnToolbox-master中CNN內的函式:

Matlab程式設計之——卷積神經網路CNN程式碼解析

該模型使用了mnist的數字mnist_uint8.mat作為訓練樣本,作為cnn的一個使用樣例,每個樣本特徵為一個28*28=的向量。


  • 網路結構為:

Matlab程式設計之——卷積神經網路CNN程式碼解析

-讓我們來分析各個函式:
一、Test_example_CNN

三、cnntrain.m.

四、cnnff.m.

五、cnnbp.m.

五、cnnapplygrads.m.

六、cnntest.m.


一、Test_example_CNN:

1設定CNN的基本引數規格,如卷積、降取樣層的數量,卷積核的大小、降取樣的降幅

2 cnnsetup函式 初始化卷積核、偏置等

3 cnntrain函式 訓練cnn,把訓練資料分成batch,然後呼叫

3.1 cnnff 完成訓練的前向過程,

3.2 cnnbp計算並傳遞神經網路的error,並計算梯度(權重的修改量)

3.3 cnnapplygrads 把計算出來的梯度加到原始模型上去

4 cnntest函式,測試當前模型的準確率

該模型採用的資料為mnist_uint8.mat,

含有70000個手寫數字樣本其中60000作為訓練樣本,10000作為測試樣本。

把資料轉成相應的格式,並歸一化。

Matlab程式設計之——卷積神經網路CNN程式碼解析


  • 設定網路結構及訓練引數

Matlab程式設計之——卷積神經網路CNN程式碼解析

Matlab程式設計之——卷積神經網路CNN程式碼解析


  • 初始化網路,對資料進行批訓練,驗證模型準確率

Matlab程式設計之——卷積神經網路CNN程式碼解析


  • 繪製均方誤差曲線

Matlab程式設計之——卷積神經網路CNN程式碼解析


二、Cnnsetup.m

該函式你用於初始化CNN的引數。

設定各層的mapsize大小,

初始化卷積層的卷積核、bias

尾部單層感知機的引數設定

bias統一設定為0

權重設定為:-1~1之間的隨機數/sqrt(6/(輸入神經元數量+輸出神經元數量))

對於卷積核權重,輸入輸出為fan_in, fan_out

fan_out= net.layers{l}.outputmaps * net.layers{l}.kernelsize ^ 2;

%卷積核初始化,1層卷積為16個卷積核,2層卷積一共612=72個卷積核。對於每個卷積輸出featuremap,

%fan_in= 表示該層的一個輸出map,所對應的所有卷積核,包含的神經元的總數。125,625

fan_in =numInputmaps * net.layers{l}.kernelsize ^ 2;

fin=125 or 625

fout=1625 or 61225

net.layers{l}.k{i}{j} =(rand(net.layers{l}.kernelsize) - 0.5) * 2 * sqrt(6 / (fan_in + fan_out));


1、卷積降取樣的引數初始化

Matlab程式設計之——卷積神經網路CNN程式碼解析

Matlab程式設計之——卷積神經網路CNN程式碼解析


2、尾部單層感知機的引數(權重和偏量)設定:

Matlab程式設計之——卷積神經網路CNN程式碼解析


三、cnntrain.m

該函式用於訓練CNN。

生成隨機序列,每次選取一個batch(50)個樣本進行訓練。

批訓練:計算50個隨機樣本的梯度,求和之後一次性更新到模型權重中。

在批訓練過程中呼叫:

Cnnff.m 完成前向過程

Cnnbp.m 完成誤差傳導和梯度計算過程

Cnnapplygrads.m把計算出來的梯度加到原始模型上去

Matlab程式設計之——卷積神經網路CNN程式碼解析

Matlab程式設計之——卷積神經網路CNN程式碼解析


四、cnnff.m

1、取得CNN的輸入

Matlab程式設計之——卷積神經網路CNN程式碼解析


2、兩次卷積核降取樣層處理

Matlab程式設計之——卷積神經網路CNN程式碼解析


3、尾部單層感知機的資料處理,需要把subFeatureMap2連線成為一個(4*4)12=192的向量,但是由於採用了50樣本批訓練的方法,subFeatureMap2被拼合成為一個19250的特徵向量fv;

Fv作為單層感知機的輸入,全連線的方式得到輸出層

Matlab程式設計之——卷積神經網路CNN程式碼解析


五、cnnbp.m

該函式實現2部分功能,計算並傳遞誤差,計算梯度

1、計算誤差和LossFunction

Matlab程式設計之——卷積神經網路CNN程式碼解析


2、計算尾部單層感知機的誤差

Matlab程式設計之——卷積神經網路CNN程式碼解析


3、把單層感知機的輸入層featureVector的誤差矩陣,恢復為subFeatureMap2的4*4二維矩陣形式

Matlab程式設計之——卷積神經網路CNN程式碼解析


插播一張圖片:

Matlab程式設計之——卷積神經網路CNN程式碼解析


4、誤差在特徵提取網路【卷積降取樣層】的傳播

如果本層是卷積層,它的誤差是從後一層(降取樣層)傳過來,誤差傳播實際上是用降取樣的反向過程,也就是降取樣層的誤差複製為2*2=4份。卷積層的輸入是經過sigmoid處理的,所以,從降取樣層擴充來的誤差要經過sigmoid求導處理。

如果本層是降取樣層,他的誤差是從後一層(卷積層)傳過來,誤差傳播實際是用卷積的反向過程,也就是卷積層的誤差,反摺積(卷積核轉180度)卷積層的誤差,原理參看插圖。

Matlab程式設計之——卷積神經網路CNN程式碼解析


5、計算特徵抽取層和尾部單層感知機的梯度

Matlab程式設計之——卷積神經網路CNN程式碼解析


五、cnnapplygrads.m

該函式完成權重修改,更新模型的功能

  1. 更新特徵抽取層的權重 weight+bias

  2. 更新末尾單層感知機的權重 weight+bias

Matlab程式設計之——卷積神經網路CNN程式碼解析


六、cnntest.m

驗證測試樣本的準確率

Matlab程式設計之——卷積神經網路CNN程式碼解析

閱讀原文

相關文章