1. 程式人生 > >Torch7下搭建卷積神經網路框架

Torch7下搭建卷積神經網路框架

之前的博文,如一文讀懂卷積神經網路(CNN)多層網路與反向傳播演算法詳解感知機詳解卷積神經網路詳解等已經比較詳細的講述了神經網路以及卷積神經網路的知識。本篇博文主要講述在Torch7中神經網路如何建立以及相關的原理(即神經網路包NN的內容),雖然講述的是神經網路的建立。但是不會涉及太多神經網路的知識,假如你對該領域不是很瞭解,可以去之前的幾篇博文裡面充充電。

首先簡單的介紹一下Torch7中的神經網路工具包,該包是由不同的模組組合而成。NN包中最底層是一個叫Module的抽象模組,Container是對其功能擴充套件的子模組,Sequential、Parallel和Concat是繼承於Container最重要的三個子模組,所構成的神經網路既可以包括簡單層,如Linear、Mean、Max和Reshape等,也可以包括卷基層以及啟用函式等。通過這些類可以構成神經網路的架構,但是關於如何訓練需要一個性能指標也就是損失函式,在NN中損失函式定義在Criterion模組中,常用的損失函式有MSECriterion (均方根誤出)、ClassNLLCriterion (交叉熵)。很自然的,有了效能指標之後我們需要考慮如何優化該效能指標,這兒分為兩種,一種是使用Torch7內部的優化函式包Optim來優化(簡單,上手快),另一種則是採用迭代法更新權值(該方法一般用於簡單的網路,當存在卷積層時,優化困難),推薦使用Optiml來優化。

在瞭解了NN包的組成模組後,讓我們詳細的瞭解一下Module模組。上面我們說到NN有不同的模組組成,這些模組有的有引數,有的無引數,但是都有輸入dLoss_dInput和輸出dLoss_dOutput(除輸入層模組和輸出層模組以外);對於那些有引數的模組而言需要計算dLoss_dParams,該引數其實包括兩部分,一部分是權值,即dLoss_dWeight,另一部分是偏置,即dLoss_dBias.

在Module中定義了四個基本函式方法,如下所示:

--1. forward(input) 根據輸入計算module的輸出;

--2. backward(input, gradOutput) 該函式利用反向傳播(BP演算法原理充電的點這兒

脈絡清晰的BP神經網路講解)更行網路內部的權值,其中gradOutput即上述的dLoss_dOutput;

--3. zeroGradParameters() 用於權值迭代更新,用到的概率比較小;

--4. updateGradParameters(learningRate) 用於迭代更新內部權值,後面詳細講解;

下面讓我們一起動手嘗試如何構建神經網路的架構

在搭建之前先看一下卷積神經網路的架構,如下所示。


1. 首先將Torch7中的nn包匯入到工作區(注意語句結束加“;”),這兒使用require關鍵字,如下所示。


2. 接下來需要申明一個神經網路容器來搭建神經網路,如上所述,目前有三種方式可以定義,第一種Sequential則採用佇列方式,一層層的搭建,Concat和Parallel如字面意思那樣,如下所示。


在此演示採用的是Sequential子模組,如下所示。


3. 現在有了容器後需要向net容器添加捲積層,輸入通道為2,輸出通道為8,卷積核大小為6x6,如下所示,


(介紹一下卷積函式:

module = nn.SpatialConvolution(nInputPlane, nOutputPlane, kW, kH, [dW], [dH], [padW], [padH])

引數含義如下:

nInputPlane:輸入的通道數

nOutputPlane:輸出的通道數

kW x kH:定義卷積核的大小

[dW],[dH:分別為橫向和縱向移動的步長,預設值為1

[padW]:寬度維度附加值,預設值為零,使用時推薦設定為(kW-1)/2。在卷積運算的維度不匹配時起作用,這兒不考慮]

[padH]:與padW類似,推薦設定為(kH-1)/2)

4. 然後新增往卷基層添加捲積的操作以及啟用函式ReLU,如下所示。


5. 加入新的池化Pooling層,在3x3的區域內尋找最大值作為該區域的值,橫向和縱向的查詢步長分別為3,如下所示。


(介紹一下池化函式:

module = nn.SpatialMaxPooling(kW, kH, [dW], [dH], [padW], [padH])

引數的定義與卷積函式的定義一致,見上面)

6. 重複上述過程,分別添加捲基層(輸入通道為8,輸出通道為16,卷積核大小為6x6),啟用函式(ReLU),池化層(3x3, 橫縱向步長為3),如下所示。


7. 將三維的Tensor轉換成一維的Tensor,如下所示。


8. 新增16*6*6=576與200的線性全連線層,如下所示。


9. 新增啟用函式,如下所示。


10. 新增200與120的線性全連線層,並新增啟用函式,如下所示。


11. 新增120與20的線性全連線層,並採用不softMAX將輸出轉換成概率,如下所示。


12. 至此含有多個卷基層的卷積神經網路的結構已經搭建完畢,將其列印可以清晰的描述其結構,如下所示。


這樣,我們就搭建了一個卷積神經網路的架構,接下來需要考慮的就是如何訓練這樣一個神經網路,這個問題將在以後給出。

參考文章:

http://blog.csdn.net/u010946556/article/details/51332644

http://blog.csdn.net/hungryof/article/details/52022415

等不一一列出,感謝他們的分享。

往期美文-點選查閱

EM演算法

更多精彩內容可以傳送關鍵字獲取或者檢視歷史文章。

檢視往期分類文章請回復關鍵字:
幫助 | 機器學習 (ML) | 支援向量機 (SVM) | 深度學習 (DL) | Python (py / Py) | AI 動態(AI)