當前位置:
首頁 > 最新 > 卷積深度置信網路工具箱的使用

卷積深度置信網路工具箱的使用

本文主要以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:公眾號 |