卷積深度置信網路工具箱的使用
本文主要以ORL_64x64人臉資料庫識別為例,介紹如何使用基於matlab的CDBN工具箱。至於卷積深度置信網路(CDBN,Convolutional Deep Belief Network)的理論知識,只給出筆者整理的一些學習資源。
01
卷積深度置信網路理論知識
參考資料
datas
6、CDBN paper(全英)(http://ai.stanford.edu/~ang/papers/icml09-ConvolutionalDeepBeliefNetworks.pdf)
02
CDBN工具箱簡介
下面簡要介紹該工具箱。
從GitHub上下載的壓縮包解壓後再打開,文件目錄如下:
CDBN工具箱的文件目錄
其中,最為重要的肯定是toolbox。toolbox裡面有三個lib,分別是CDBN,DBN,Softmax庫。本文將用到CDBN和Softmax兩個庫。
toolbox下的三個lib
需要注意的是,由於這個工具箱不是官方版的,因此可能存在某些bug,後面會涉及到筆者使用工具箱過程中的一些經驗。
03
神經網路結構
介紹一下本文搭建的進行人臉識別的卷積深度置信網路的結構。
主體結構:兩個卷積受限玻爾茲曼機(CRBM,Convolutional Restricted Boltzmann Machine)堆疊(每個CRBM後都接有池化層),頂層採用Softmax,實現分類。
第一個CRBM:
第一個CRBM參數
第二個CRBM:
第二個CRBM參數
Softmax層
神經元個數40個,最大迭代次數maxIter=1000,代價函數為 交叉熵代價函數(Cross-Entropy Error)
其他參數
其他諸如學習速率等的參數使用CDBN-master oolboxCDBNLIBdefault_layer2D.m中的默認值。
04
編程
以下講解編程步驟。
步驟1、安裝工具箱
只需運行setup_toolbox.m即可。
安裝工具箱其實只是把用到的一些函數添加到matlab的搜索路徑,因 此你完全可以把工具箱內所有的文件都複製到你當前的路徑下,不過肯定麻煩啦!
步驟2、載入和矩陣化數據
重點講一下第四行。
StTrainFile1.txt中有360行,4097列。每一行是一幅人臉圖像(像素為64X64=4096)的4096個灰度值,最後一列是該幅人臉圖像的標籤(1-40),表明其屬於哪個人的(共40人,即分類數目為40)。由此可見,一幅二維圖像(矩陣)被拉成了向量進行存儲,因此在數據輸入CDBN前,我們要對向量進行矩陣化,調用matlab的reshape方法,最終生成一個4維的矩陣,四個維度分別是64,64,1,360(樣本數)。倒數第二行同理。
步驟3、定義層參數
工具箱把一層layer定義為一個struct對象。
需要注意的是,layer=default_layer2D()這條語句是必須的,且必須位於所有層參數定義語句的最前面。原因:如果layer=default_layer2D()這條語句不位於最前面的話,在這條語句前面的參數賦值語句實質不起作用,這些參數還是取默認值。特別是對於第一層,因為default_layer2D()方法中是沒有定義inputdata欄位的,如果layer.inputdata=train_data這條語句位於layer=default_layer2D()前面,則會出現「使用未定義欄位」的錯誤。
步驟4、訓練CDBN網路
這個過程是無監督學習,只需調用cdbn2D方法即可。
在調用cdbn2D方法之前,CDBN-master oolboxCDBNLIBmex中的crbm_forward2D_batch_mex.c要先用mex命令編譯生成crbm_forward2D_batch_mex.mexw64文件才能供matlab調用
mex crbm_forward2D_batch_mex.c
在編譯前,crbm_forward2D_batch_mex.c要先修改:128行的out_id要改成在最開始的位置定義,否則編譯時會出現「缺少:在類型前面』」的報錯信息(PS:第一次遇到這麼奇葩的報錯,當時懷疑C語言是不是白學了),原因:VS2010的C編譯器只支持C89標準,對C99標準支持不完全,而在C89標準中,變數需要放到函數體的前面聲明,先聲明再使用。
我們來比較一下train_data、trainD、trainD1的大小
train_data、trainD、trainD1
現在再看看卷積神經網路的圖示,是不是很好理解了呢?
卷積神經網路圖示
步驟5、將測試樣本輸入訓練好的CDBN網路,提取高維特徵
這段代碼可以直接copy,修改好變數名即可!
同樣的,我們來看一下test_data、testD、testD1的大小:
test_data、testD、testD1的大小比較
步驟6、訓練Softmax分類器,同時進行識別
這裡我們用到 softmaxExercise(inputData,labels,inputData_t,labels_t)這個函數
參數說明:
- inputdata:訓練樣本的CDBN輸出,要求是二維矩陣
-labels:訓練樣本的標籤
-inputData_t:測試樣本的CDBN輸出,要求是二維矩陣
-labels_t:測試樣本的標籤
由於CDBN的輸出是4維矩陣,因此在訓練Softmax分類器前,需要把矩陣拉成向量(和之前的過程相反)。代碼如下,可直接copy,修改變數名即可!
我們來看一下拉成向量後的trainDa以及testDa的大小
拉成向量後的trainDa以及testDa的大小
對比一下,train_data和test_data在矩陣化之前的大小:
train_data和test_data在矩陣化之前的大小
可見,CDBN作為特徵提取器,將4096維特徵映射到了9873維特徵,提高了Softmax的分類能力!
softmaxExercise.m中有這樣一段注釋:
softmaxExercise.m中的注釋
因此在調用softmaxExercise方法前,要做以下4個工作:
修改softmaxExercise.m第22行的numClasses,如本文改為40
修改softmaxExercise.m第96行的maxIter,本文取1000
PS:個人覺得softmaxExercise方法應該增加兩個入口參數,即numClasses和maxIter,如此才能更好體現封裝的思想。
softmaxCost.m中定義需要的損失函數,只需要改第90行
cost = -(1. / numCases) * sum(sum(groundTruth .* log(p))) + (lambda / 2.) * sum(sum(theta.^2));
這條語句即可,原文件使用的是交叉熵代價函數。
有必要的話可以修改 softmaxPredict.m中內容,個人覺得完全沒必要,保留即可。
最後調用softmaxExercise方法
05
完整代碼
06
運行截圖及準確率
運行截圖1
運行截圖2
運行截圖3
97.5%的識別率,還是可以接受的,一方面是數據集好,另一方面是搭建得網路好。
讀者可以試一試調整CDBN網路的參數,比如增大epoch(本文取1),看能否獲得更高的識別率。
為了方便讀者研究,附上所有文件。
※只想當學霸?已經out!現在流行當球霸!
※搞笑GIF:社會我啤酒姐,人穩酒量好!
※成人禮?安魂曲?大逃殺
※和服少女不會騎馬
TAG:公眾號 |