最近在學習卷積神經網絡,哎,真的是一頭霧水!最后決定從閱讀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)
(1)初始化一個三維矩陣z
-
z的大小為24*24*50,即第二層中每個map的尺寸
-
z存放的是:第二層中每個map的輸入
(2)計算第2層第j個map的輸入
-
即第1層的所有輸出(i=1,…, inputmaps)對第2層的第j個輸入的貢獻的累加
-
z的計算方法是:
利用第二層的第j個map的卷積核net.layers{2}.k{i}{j}分別對第一層中的第i個map進行卷積運算(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層的第i個map到第l層的所有maps的卷積核 net.layers{l}.k{i}{j}:第l-1層的第i個map到第l層的第j個map的卷積核 下面是一個例子: 第四層的卷積核元胞 第3層的第1個map到第4層的所有maps的卷積核(12)個 第3層的第1個map到第四層的第1個maps的卷積核 |
(3)計算第2層的第j個map的輸出
-
第二層的第j個map的輸出為net.layers{2}.a{j}=sigm(z+net.layers{l}.b{j})
即第二層的第j個map的輸入z+該map的偏執項后,求sigm函數
(4)對第1層的map進行卷積操作的圖例
3 第2層到第3層(l=3):降采樣操作
下面,討論第j次循環時,循環體內部的分步解析
(1)對第二層的第j個map進行卷積運算,得到z
-
利用的卷積核(大小為scale*scale)如下:
(2)對z進行降采樣,得到第三層的第j個map的輸出
(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層的第j個map的卷積核net.layers{4}.k{i}{j}分別對第3層中的第i個map進行卷積運算(i=1,…, net.layers{1}.outputmaps),並將得到的所有卷積結果相加
-
第4層的inputmaps=12
(3)計算第4層的第j個map的輸出
-
第4層的第j個map的輸出為net.layers{4}.a{j}=sigm(z+net.layers{4}.b{j})
即第4層的第j個map的輸入z+該map的偏執項后,求sigm函數
(4)對第3層的map進行卷積操作的圖例
5 第4層到第5層 (l=5):降采樣
下面,討論第j次循環時,循環體內部的分步解析
(1)對第四層的第j個map進行卷積運算,得到z
-
利用的卷積核(大小為scale*scale)如下:
(2)對z進行降采樣,得到第五層的第j個map的輸出
6 將第五層的map輸出向量化
(3)對於第五層的第j個輸出map
-
得到第五層第j個輸出map的尺寸,應該是三維的,得到的三維尺寸向量存入sa中
-
將第五層的第j個輸出map的矩陣轉化為一個sa(1)*sa(2),sa(3)大小的矩陣
-
並將該得到的轉化矩陣接入到第五層的第j-1個輸出map之后
-
關於矩陣fv的結構如上圖所示
第五層的向量化輸出傳入一個普通的神經網絡,只有輸入層和輸出層,輸入層含有192個神經元,輸出層含有10個神經元,輸入到輸出層的權值矩陣存放在矩陣net.ffW中,在該權值矩陣作用下,該簡單神經網絡的輸出即為最終的整個網絡的輸出,輸出結果存放在net.o矩陣中,該矩陣大小為10*50,每一列分別表示每個輸入樣本得到的相應的輸出