deepLearnToolbox-master是一個深度學習matlab包,裏面含有不少機器學習算法,如卷積神經網絡CNN,深度信念網絡DBN,自動編碼AutoEhtml
ncoder(堆棧SAE,卷積CAE)的做者是 RasmusBerg Palm算法
今天給介紹deepLearnToolbox-master中的CNN部分。網絡
該模型使用了mnist的數字mnist_uint8.mat做爲訓練樣本,做爲cnn的一個使用樣例,每一個樣本特徵爲一個28*28=的向量。app
-讓咱們來分析各個函數:
1、Test_example_CNN機器學習
3、cnntrain.m.函數
4、cnnff.m.學習
5、cnnbp.m.測試
5、cnnapplygrads.m.ui
6、cnntest.m.編碼
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做爲測試樣本。
把數據轉成相應的格式,並歸一化。
該函數你用於初始化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));
一、卷積降採樣的參數初始化
二、尾部單層感知機的參數(權重和偏量)設置:
該函數用於訓練CNN。
生成隨機序列,每次選取一個batch(50)個樣本進行訓練。
批訓練:計算50個隨機樣本的梯度,求和以後一次性更新到模型權重中。
在批訓練過程當中調用:
Cnnff.m 完成前向過程
Cnnbp.m 完成偏差傳導和梯度計算過程
Cnnapplygrads.m把計算出來的梯度加到原始模型上去
一、取得CNN的輸入
二、兩次卷積核降採樣層處理
三、尾部單層感知機的數據處理,須要把subFeatureMap2鏈接成爲一個(4*4)12=192的向量,可是因爲採用了50樣本批訓練的方法,subFeatureMap2被拼合成爲一個19250的特徵向量fv;
Fv做爲單層感知機的輸入,全鏈接的方式獲得輸出層
該函數實現2部分功能,計算並傳遞偏差,計算梯度
一、計算偏差和LossFunction
二、計算尾部單層感知機的偏差
三、把單層感知機的輸入層featureVector的偏差矩陣,恢復爲subFeatureMap2的4*4二維矩陣形式
插播一張圖片:
四、偏差在特徵提取網絡【卷積降採樣層】的傳播
若是本層是卷積層,它的偏差是從後一層(降採樣層)傳過來,偏差傳播其實是用降採樣的反向過程,也就是降採樣層的偏差複製爲2*2=4份。卷積層的輸入是通過sigmoid處理的,因此,從降採樣層擴充來的偏差要通過sigmoid求導處理。
若是本層是降採樣層,他的偏差是從後一層(卷積層)傳過來,偏差傳播實際是用卷積的反向過程,也就是卷積層的偏差,反捲積(卷積核轉180度)卷積層的偏差,原理參看插圖。
五、計算特徵抽取層和尾部單層感知機的梯度
該函數完成權重修改,更新模型的功能
更新特徵抽取層的權重 weight+bias
更新末尾單層感知機的權重 weight+bias
驗證測試樣本的準確率