卷積神經網絡(CNN)的簡單介紹及代碼實現(xiàn)
卷積神經網絡(CNN)的基礎介紹見 ,這里主要以代碼實現(xiàn)為主。
CNN是一個多層的神經網絡,每層由多個二維平面組成,而每個平面由多個獨立神經元組成。
以MNIST作為數(shù)據庫,仿照LeNet-5和TIny-cnn( ) 設計一個簡單的7層CNN結構如下:
輸入層Input:神經元數(shù)量32*32=1024;
C1層:卷積窗大小5*5,輸出特征圖數(shù)量6,卷積窗種類6,輸出特征圖大小28*28,可訓練參數(shù)(權值+閾值(偏置))5*5*6+6=150+6,神經元數(shù)量28*28*6=4704;
S2層:卷積窗大小2*2,輸出下采樣圖數(shù)量6,卷積窗種類6,輸出下采樣圖大小14*14,可訓練參數(shù)1*6+6=6+6,神經元數(shù)量14*14*6=1176;
C3層:卷積窗大小5*5,輸出特征圖數(shù)量16,卷積窗種類6*16=96,輸出特征圖大小10*10,可訓練參數(shù)5*5*(6*16)+16=2400+16,神經元數(shù)量10*10*16=1600;
S4層:卷積窗大小2*2,輸出下采樣圖數(shù)量16,卷積窗種類16,輸出下采樣圖大小5*5,可訓練參數(shù)1*16+16=16+16,神經元數(shù)量5*5*16=400;
C5層:卷積窗大小5*5,輸出特征圖數(shù)量120,卷積窗種類16*120=1920,輸出特征圖大小1*1,可訓練參數(shù)5*5*(16*120)+120=48000+120,神經元數(shù)量1*1*120=120;
輸出層Output:卷積窗大小1*1,輸出特征圖數(shù)量10,卷積窗種類120*10=1200,輸出特征圖大小1*1,可訓練參數(shù)1*(120*10)+10=1200+10,神經元數(shù)量1*1*10=10。
下面對實現(xiàn)執(zhí)行過程進行描述說明:
1. 從MNIST數(shù)據庫中分別獲取訓練樣本和測試樣本數(shù)據:
(1)、原有MNIST庫中圖像大小為28*28,這里縮放為32*32,數(shù)據值范圍為[-1,1],擴充值均取-1;總共60000個32*32訓練樣本,10000個32*32測試樣本;
(2)、輸出層有10個輸出節(jié)點,在訓練階段,對應位置的節(jié)點值設為0.8,其它節(jié)點設為-0.8.
2. 初始化權值和閾值(偏置):權值就是卷積圖像,每一個特征圖上的神經元共享相同的權值和閾值,特征圖的數(shù)量等于閾值的個數(shù)
(1)、權值采用uniform rand的方法初始化;
(2)、閾值均初始化為0.
3. 前向傳播:根據權值和閾值,主要計算每層神經元的值
(1)、輸入層:每次輸入一個32*32數(shù)據。
(2)、C1層:分別用每一個5*5的卷積圖像去乘以32*32的圖像,獲得一個28*28的圖像,即對應位置相加再求和,stride長度為1;一共6個5*5的卷積圖像,然后對每一個神經元加上一個閾值,最后再通過tanh激活函數(shù)對每一神經元進行運算得到最終每一個神經元的結果。
(3)、S2層:對C1中6個28*28的特征圖生成6個14*14的下采樣圖,相鄰四個神經元分別進行相加求和,然后乘以一個權值,再求均值即除以4,然后再加上一個閾值,最后再通過tanh激活函數(shù)對每一神經元進行運算得到最終每一個神經元的結果。
(4)、C3層:由S2中的6個14*14下采樣圖生成16個10*10特征圖,對于生成的每一個10*10的特征圖,是由6個5*5的卷積圖像去乘以6個14*14的下采樣圖,然后對應位置相加求和,然后對每一個神經元加上一個閾值,最后再通過tanh激活函數(shù)對每一神經元進行運算得到最終每一個神經元的結果。
(5)、S4層:由C3中16個10*10的特征圖生成16個5*5下采樣圖,相鄰四個神經元分別進行相加求和,然后乘以一個權值,再求均值即除以4,然后再加上一個閾值,最后再通過tanh激活函數(shù)對每一神經元進行運算得到最終每一個神經元的結果。
(6)、C5層:由S4中16個5*5下采樣圖生成120個1*1特征圖,對于生成的每一個1*1的特征圖,是由16個5*5的卷積圖像去乘以16個5*5的下采用圖,然后相加求和,然后對每一個神經元加上一個閾值,最后再通過tanh激活函數(shù)對每一神經元進行運算得到最終每一個神經元的結果。
(7)、輸出層:即全連接層,輸出層中的每一個神經元均是由C5層中的120個神經元乘以相對應的權值,然后相加求和;然后對每一個神經元加上一個閾值,最后再通過tanh激活函數(shù)對每一神經元進行運算得到最終每一個神經元的結果。
4. 反向傳播:主要計算每層神經元、權值和閾值的誤差,以用來更新權值和閾值
(1)、輸出層:計算輸出層神經元誤差;通過mse損失函數(shù)的導數(shù)函數(shù)和tanh激活函數(shù)的導數(shù)函數(shù)來計算輸出層神經元誤差。
(2)、C5層:計算C5層神經元誤差、輸出層權值誤差、輸出層閾值誤差;通過輸出層神經元誤差乘以輸出層權值,求和,結果再乘以C5層神經元的tanh激活函數(shù)的導數(shù),獲得C5層每一個神經元誤差;通過輸出層神經元誤差乘以C5層神經元獲得輸出層權值誤差;輸出層誤差即為輸出層閾值誤差。