卷積神經網絡 cnnff.m程序 中的前向傳播算法 數據 分步解析


最近在學習卷積神經網絡,哎,真的是一頭霧水!最后決定從閱讀CNN程序下手!

程序來源於GitHub的DeepLearnToolbox

由於確實缺乏理論基礎,所以,先從程序的數據流入手,雖然對高手來講,這樣有點太小兒科了,但覺得對於個人理解CNN網絡的結構和數據流走向有較大幫助!

 

下面,將要分析CNN的前向傳播算法cnnff.m

 

本程序所用的神經網絡的結構如下圖的結構體net所示

結構體net

包含5層

每層的結構

這五層的結構如下:

每層的結構分別如下:

 

為了方便自己理解,下面,分別對每一層的輸入、輸出、傳播分解介紹

只考慮某一批詞的樣本

注:所有樣本集被分為numbatches批,每一批含有batchsize個樣本,對於本程序而言,共有50個樣本

 

 1 第一層到第五層的數據傳遞

 

2 第1層到第2層的前面傳播(l=2):卷積操作

利用循環,分別計算第二層每個map的輸出:net.layers{2}.a{j} (j=1,..,6)(這里的l=2

下面,討論第j次循環時,循環體內部的分步解析

1初始化一個三維矩陣z

  • z的大小為24*24*50,即第二層中每個map的尺寸
  • z存放的是:第二層中每個map的輸入

2)計算第2層第j個map的輸入

  • 即第1層的所有輸出(i=1,…, inputmaps)對第2層的第j個輸入的貢獻的累加
  • z的計算方法是:

    利用第二層的第jmap的卷積核net.layers{2}.k{i}{j}分別對第一層中的第imap進行卷積運算(i=1,…, net.layers{1}.outputmaps),並將得到的所有卷積結果相加

  • 2層的inputmaps=1
  • net.layers{l}.k{i}{j}進行解釋:

net.layers{l}.k:是一個元胞,有兩層

net.layers{l}.k{i}:第l-1層的第imap到第l層的所有maps的卷積核

net.layers{l}.k{i}{j}:第l-1層的第imap到第l層的第jmap的卷積核

下面是一個例子:

第四層的卷積核元胞

3層的第1map到第4層的所有maps的卷積核(12)個

3層的第1map到第四層的第1maps的卷積核

3計算第2層的第jmap的輸出

  • 第二層的第jmap的輸出為net.layers{2}.a{j}=sigm(z+net.layers{l}.b{j})

    即第二層的第jmap的輸入z+map的偏執項后,求sigm函數

4對第1層的map進行卷積操作的圖例

 

3 第2層到第3層(l=3):降采樣操作

 

下面,討論第j次循環時,循環體內部的分步解析

(1)對第二層的第jmap進行卷積運算,得到z

  • 利用的卷積核(大小為scale*scale)如下:

 

(2)對z進行降采樣,得到第三層的第jmap的輸出

(3)如上所示的降采樣過程示例如下圖所示

 

4 第3層到第4層的前面傳播(l=4):卷積操作

 

利用循環,分別計算第四層每個map的輸出:net.layers{4}.a{j} (j=1,..,12)(這里的l=4

下面,討論第j次循環時,循環體內部的分步解析

1初始化一個三維矩陣z

  • z的大小為24*24*50,即第二層中每個map的尺寸
  • z存放的是:第四層中每個map的輸入

2計算第4層的第j個map的輸入

  • 即第3層的所有輸出(i=1,…, inputmaps)對第4層的第j個輸入的貢獻的累加
  • z的計算方法是:

    利用第4層的第jmap的卷積核net.layers{4}.k{i}{j}分別對第3層中的第imap進行卷積運算(i=1,…, net.layers{1}.outputmaps),並將得到的所有卷積結果相加

  • 4層的inputmaps=12

3計算第4層的第jmap的輸出

  • 4層的第jmap的輸出為net.layers{4}.a{j}=sigm(z+net.layers{4}.b{j})

    即第4層的第jmap的輸入z+map的偏執項后,求sigm函數

4對第3層的map進行卷積操作的圖例

5 第4層到第5層 (l=5):降采樣

下面,討論第j次循環時,循環體內部的分步解析

(1)對第四層的第jmap進行卷積運算,得到z

  • 利用的卷積核(大小為scale*scale)如下:

 

(2)對z進行降采樣,得到第五層的第jmap的輸出

 

 

(3)如上所示的降采樣過程示例如下圖所示

 

6 將第五層的map輸出向量化

(1)初始化net網絡中的fv(其實是新加入fv,原來輸入的net中沒有fv
(2)分別對第五層的每個輸出map進行向量化(一共用numel(net.layers{n}.a個輸出map)

(3)對於第五層的第j個輸出map

  • 得到第五層第j個輸出map的尺寸,應該是三維的,得到的三維尺寸向量存入sa
  • 將第五層的第j個輸出map的矩陣轉化為一個sa(1)*sa(2)sa(3)大小的矩陣
  • 並將該得到的轉化矩陣接入到第五層的第j-1個輸出map之后
  • 關於矩陣fv的結構如上圖所示
7 第五層向量化后傳入普通神經網

第五層的向量化輸出傳入一個普通的神經網絡,只有輸入層和輸出層,輸入層含有192個神經元,輸出層含有10個神經元,輸入到輸出層的權值矩陣存放在矩陣net.ffW中,在該權值矩陣作用下,該簡單神經網絡的輸出即為最終的整個網絡的輸出,輸出結果存放在net.o矩陣中,該矩陣大小為10*50,每一列分別表示每個輸入樣本得到的相應的輸出


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM