
數(shù)據(jù)挖掘系列卷積神經(jīng)網(wǎng)絡(luò)算法的一個(gè)實(shí)現(xiàn)
從理解卷積神經(jīng)到實(shí)現(xiàn)它,前后花了一個(gè)月時(shí)間,現(xiàn)在也還有一些地方?jīng)]有理解透徹,CNN還是有一定難度的,不是看哪個(gè)的博客和一兩篇論文就明白了,主要還是靠自己去專(zhuān)研,閱讀推薦列表在末尾的參考文獻(xiàn)。目前實(shí)現(xiàn)的CNN在MINIT數(shù)據(jù)集上效果還不錯(cuò),但是還有一些bug,因?yàn)樽罱容^忙,先把之前做的總結(jié)一下,以后再繼續(xù)優(yōu)化。
卷積神經(jīng)網(wǎng)絡(luò)CNN是Deep Learning的一個(gè)重要算法,在很多應(yīng)用上表現(xiàn)出卓越的效果,[1]中對(duì)比多重算法在文檔字符識(shí)別的效果,結(jié)論是CNN優(yōu)于其他所有的算法。CNN在手寫(xiě)體識(shí)別取得最好的效果,[2]將CNN應(yīng)用在基于人臉的性別識(shí)別,效果也非常不錯(cuò)。前段時(shí)間我用BP神經(jīng)網(wǎng)絡(luò)對(duì)手機(jī)拍照?qǐng)D片的數(shù)字進(jìn)行識(shí)別,效果還算不錯(cuò),接近98%,但在漢字識(shí)別上表現(xiàn)不佳,于是想試試卷積神經(jīng)網(wǎng)絡(luò)。
1、CNN的整體網(wǎng)絡(luò)結(jié)構(gòu)
卷積神經(jīng)網(wǎng)絡(luò)是在BP神經(jīng)網(wǎng)絡(luò)的改進(jìn),與BP類(lèi)似,都采用了前向傳播計(jì)算輸出值,反向傳播調(diào)整權(quán)重和偏置;CNN與標(biāo)準(zhǔn)的BP最大的不同是:CNN中相鄰層之間的神經(jīng)單元并不是全連接,而是部分連接,也就是某個(gè)神經(jīng)單元的感知區(qū)域來(lái)自于上層的部分神經(jīng)單元,而不是像BP那樣與所有的神經(jīng)單元相連接。CNN的有三個(gè)重要的思想架構(gòu):
局部區(qū)域感知
權(quán)重共享
空間或時(shí)間上的采樣
局部區(qū)域感知能夠發(fā)現(xiàn)數(shù)據(jù)的一些局部特征,比如圖片上的一個(gè)角,一段弧,這些基本特征是構(gòu)成動(dòng)物視覺(jué)的基礎(chǔ)[3];而B(niǎo)P中,所有的像素點(diǎn)是一堆混亂的點(diǎn),相互之間的關(guān)系沒(méi)有被挖掘。
CNN中每一層的由多個(gè)map組成,每個(gè)map由多個(gè)神經(jīng)單元組成,同一個(gè)map的所有神經(jīng)單元共用一個(gè)卷積核(即權(quán)重),卷積核往往代表一個(gè)特征,比如某個(gè)卷積和代表一段弧,那么把這個(gè)卷積核在整個(gè)圖片上滾一下,卷積值較大的區(qū)域就很有可能是一段弧。注意卷積核其實(shí)就是權(quán)重,我們并不需要單獨(dú)去計(jì)算一個(gè)卷積,而是一個(gè)固定大小的權(quán)重矩陣去圖像上匹配時(shí),這個(gè)操作與卷積類(lèi)似,因此我們稱(chēng)為卷積神經(jīng)網(wǎng)絡(luò),實(shí)際上,BP也可以看做一種特殊的卷積神經(jīng)網(wǎng)絡(luò),只是這個(gè)卷積核就是某層的所有權(quán)重,即感知區(qū)域是整個(gè)圖像。權(quán)重共享策略減少了需要訓(xùn)練的參數(shù),使得訓(xùn)練出來(lái)的模型的泛華能力更強(qiáng)。
采樣的目的主要是混淆特征的具體位置,因?yàn)槟硞€(gè)特征找出來(lái)后,它的具體位置已經(jīng)不重要了,我們只需要這個(gè)特征與其他的相對(duì)位置,比如一個(gè)“8”,當(dāng)我們得到了上面一個(gè)"o"時(shí),我們不需要知道它在圖像的具體位置,只需要知道它下面又是一個(gè)“o”我們就可以知道是一個(gè)'8'了,因?yàn)閳D片中"8"在圖片中偏左或者偏右都不影響我們認(rèn)識(shí)它,這種混淆具體位置的策略能對(duì)變形和扭曲的圖片進(jìn)行識(shí)別。
CNN的這三個(gè)特點(diǎn)是其對(duì)輸入數(shù)據(jù)在空間(主要針對(duì)圖像數(shù)據(jù))上和時(shí)間(主要針對(duì)時(shí)間序列數(shù)據(jù),參考TDNN)上的扭曲有很強(qiáng)的魯棒性。CNN一般采用卷積層與采樣層交替設(shè)置,即一層卷積層接一層采樣層,采樣層后接一層卷積...這樣卷積層提取出特征,再進(jìn)行組合形成更抽象的特征,最后形成對(duì)圖片對(duì)象的描述特征,CNN后面還可以跟全連接層,全連接層跟BP一樣。下面是一個(gè)卷積神經(jīng)網(wǎng)絡(luò)的示例:
圖1(圖片來(lái)源)
卷積神經(jīng)網(wǎng)絡(luò)的基本思想是這樣,但具體實(shí)現(xiàn)有多重版本,我參考了matlab的Deep Learning的工具箱DeepLearnToolbox,這里實(shí)現(xiàn)的CNN與其他最大的差別是采樣層沒(méi)有權(quán)重和偏置,僅僅只對(duì)卷積層進(jìn)行一個(gè)采樣過(guò)程,這個(gè)工具箱的測(cè)試數(shù)據(jù)集是MINIST,每張圖像是28*28大小,它實(shí)現(xiàn)的是下面這樣一個(gè)CNN:
圖2
2、網(wǎng)絡(luò)初始化
CNN的初始化主要是初始化卷積層和輸出層的卷積核(權(quán)重)和偏置,DeepLearnToolbox里面對(duì)卷積核和權(quán)重進(jìn)行隨機(jī)初始化,而對(duì)偏置進(jìn)行全0初始化。
3、前向傳輸計(jì)算
前向計(jì)算時(shí),輸入層、卷積層、采樣層、輸出層的計(jì)算方式不相同。
3.1 輸入層:輸入層沒(méi)有輸入值,只有一個(gè)輸出向量,這個(gè)向量的大小就是圖片的大小,即一個(gè)28*28矩陣;
3.2 卷積層:卷積層的輸入要么來(lái)源于輸入層,要么來(lái)源于采樣層,如上圖紅色部分。卷積層的每一個(gè)map都有一個(gè)大小相同的卷積核,Toolbox里面是5*5的卷積核。下面是一個(gè)示例,為了簡(jiǎn)單起見(jiàn),卷積核大小為2*2,上一層的特征map大小為4*4,用這個(gè)卷積在圖片上滾一遍,得到一個(gè)一個(gè)(4-2+1)*(4-2+1)=3*3的特征map,卷積核每次移動(dòng)一步,因此。在Toolbox的實(shí)現(xiàn)中,卷積層的一個(gè)map與上層的所有map都關(guān)聯(lián),如上圖的S2和C3,即C3共有6*12個(gè)卷積核,卷積層的每一個(gè)特征map是不同的卷積核在前一層所有map上作卷積并將對(duì)應(yīng)元素累加后加一個(gè)偏置,再求sigmod得到的。還有需要注意的是,卷積層的map個(gè)數(shù)是在網(wǎng)絡(luò)初始化指定的,而卷積層的map的大小是由卷積核和上一層輸入map的大小決定的,假設(shè)上一層的map大小是n*n、卷積核的大小是k*k,則該層的map大小是(n-k+1)*(n-k+1),比如上圖的24*24的map大小24=(28-5+1)。 斯坦福的深度學(xué)習(xí)教程更加詳細(xì)的介紹了卷積特征提取的計(jì)算過(guò)程。
圖3
3.3 采樣層(subsampling,Pooling):采樣層是對(duì)上一層map的一個(gè)采樣處理,這里的采樣方式是對(duì)上一層map的相鄰小區(qū)域進(jìn)行聚合統(tǒng)計(jì),區(qū)域大小為scale*scale,有些實(shí)現(xiàn)是取小區(qū)域的最大值,而ToolBox里面的實(shí)現(xiàn)是采用2*2小區(qū)域的均值。注意,卷積的計(jì)算窗口是有重疊的,而采用的計(jì)算窗口沒(méi)有重疊,ToolBox里面計(jì)算采樣也是用卷積(conv2(A,K,'valid'))來(lái)實(shí)現(xiàn)的,卷積核是2*2,每個(gè)元素都是1/4,去掉計(jì)算得到的卷積結(jié)果中有重疊的部分,即:
圖4
4、反向傳輸調(diào)整權(quán)重
反向傳輸過(guò)程是CNN最復(fù)雜的地方,雖然從宏觀上來(lái)看基本思想跟BP一樣,都是通過(guò)最小化殘差來(lái)調(diào)整權(quán)重和偏置,但CNN的網(wǎng)絡(luò)結(jié)構(gòu)并不像BP那樣單一,對(duì)不同的結(jié)構(gòu)處理方式不一樣,而且因?yàn)闄?quán)重共享,使得計(jì)算殘差變得很困難,很多論文[1][5]和文章[4]都進(jìn)行了詳細(xì)的講述,但我發(fā)現(xiàn)還是有一些細(xì)節(jié)沒(méi)有講明白,特別是采樣層的殘差計(jì)算,我會(huì)在這里詳細(xì)講述。
4.1輸出層的殘差
和BP一樣,CNN的輸出層的殘差與中間層的殘差計(jì)算方式不同,輸出層的殘差是輸出值與類(lèi)標(biāo)值得誤差值,而中間各層的殘差來(lái)源于下一層的殘差的加權(quán)和。輸出層的殘差計(jì)算如下:
公式來(lái)源
這個(gè)公式不做解釋?zhuān)梢圆榭垂絹?lái)源,看斯坦福的深度學(xué)習(xí)教程的解釋。
4.2 下一層為采樣層(subsampling)的卷積層的殘差
當(dāng)一個(gè)卷積層L的下一層(L+1)為采樣層,并假設(shè)我們已經(jīng)計(jì)算得到了采樣層的殘差,現(xiàn)在計(jì)算該卷積層的殘差。從最上面的網(wǎng)絡(luò)結(jié)構(gòu)圖我們知道,采樣層(L+1)的map大小是卷積層L的1/(scale*scale),ToolBox里面,scale取2,但這兩層的map個(gè)數(shù)是一樣的,卷積層L的某個(gè)map中的4個(gè)單元與L+1層對(duì)應(yīng)map的一個(gè)單元關(guān)聯(lián),可以對(duì)采樣層的殘差與一個(gè)scale*scale的全1矩陣進(jìn)行克羅內(nèi)克積進(jìn)行擴(kuò)充,使得采樣層的殘差的維度與上一層的輸出map的維度一致,Toolbox的代碼如下,其中d表示殘差,a表示輸出值:
擴(kuò)展過(guò)程:
圖5
利用卷積計(jì)算卷積層的殘差:
圖6
4.3 下一層為卷積層(subsampling)的采樣層的殘差
當(dāng)某個(gè)采樣層L的下一層是卷積層(L+1),并假設(shè)我們已經(jīng)計(jì)算出L+1層的殘差,現(xiàn)在計(jì)算L層的殘差。采樣層到卷積層直接的連接是有權(quán)重和偏置參數(shù)的,因此不像卷積層到采樣層那樣簡(jiǎn)單?,F(xiàn)再假設(shè)L層第j個(gè)map Mj與L+1層的M2j關(guān)聯(lián),按照BP的原理,L層的殘差Dj是L+1層殘差D2j的加權(quán)和,但是這里的困難在于,我們很難理清M2j的那些單元通過(guò)哪些權(quán)重與Mj的哪些單元關(guān)聯(lián),Toolbox里面還是采用卷積(稍作變形)巧妙的解決了這個(gè)問(wèn)題,其代碼為:
rot180表示對(duì)矩陣進(jìn)行180度旋轉(zhuǎn)(可通過(guò)行對(duì)稱(chēng)交換和列對(duì)稱(chēng)交換完成),為什么這里要對(duì)卷積核進(jìn)行旋轉(zhuǎn),答案是:通過(guò)這個(gè)旋轉(zhuǎn),'full'模式下得卷積的正好抓住了前向傳輸計(jì)算上層map單元與卷積和及當(dāng)期層map的關(guān)聯(lián)關(guān)系,需要注意的是matlab的內(nèi)置函數(shù)convn在計(jì)算卷積前,會(huì)對(duì)卷積核進(jìn)行一次旋轉(zhuǎn),因此我們之前的所有卷積的計(jì)算都對(duì)卷積核進(jìn)行了旋轉(zhuǎn):
convn在計(jì)算前還會(huì)對(duì)待卷積矩陣進(jìn)行0擴(kuò)展,如果卷積核為k*k,待卷積矩陣為n*n,需要以n*n原矩陣為中心擴(kuò)展到(n+2(k-1))*(n+2(k-1)),所有上面convn(a,k,'full')的計(jì)算過(guò)程如下:
圖7
實(shí)際上convn內(nèi)部是否旋轉(zhuǎn)對(duì)網(wǎng)絡(luò)訓(xùn)練沒(méi)有影響,只要內(nèi)部保持一致(即都要么旋轉(zhuǎn),要么都不旋轉(zhuǎn)),所有我的卷積實(shí)現(xiàn)里面沒(méi)有對(duì)卷積核旋轉(zhuǎn)。如果在convn計(jì)算前,先對(duì)卷積核旋轉(zhuǎn)180度,然后convn內(nèi)部又對(duì)其旋轉(zhuǎn)180度,相當(dāng)于卷積核沒(méi)有變。
為了描述清楚對(duì)卷積核旋轉(zhuǎn)180與卷積層的殘差的卷積所關(guān)聯(lián)的權(quán)重與單元,正是前向計(jì)算所關(guān)聯(lián)的權(quán)重與單元,我們選一個(gè)稍微大一點(diǎn)的卷積核,即假設(shè)卷積層采用用3*3的卷積核,其上一層采樣層的輸出map的大小是5*5,那么前向傳輸由采樣層得到卷積層的過(guò)程如下:
圖8
這里我們采用自己實(shí)現(xiàn)的convn(即內(nèi)部不會(huì)對(duì)卷積核旋轉(zhuǎn)),并假定上面的矩陣A、B下標(biāo)都從1開(kāi)始,那么有:
我們可以得到B矩陣每個(gè)單元與哪些卷積核單元和哪些A矩陣的單元之間有關(guān)聯(lián):
然后再用matlab的convn(內(nèi)部會(huì)對(duì)卷積核進(jìn)行180度旋轉(zhuǎn))進(jìn)行一次convn(B,K,'full'),結(jié)合圖7,看紅色部分,除去0,A11=B'33*K'33=B11*K11,發(fā)現(xiàn)A11正好與K11、B11關(guān)聯(lián)對(duì)不對(duì);我們?cè)倏匆粋€(gè)A24=B'34*K'21+B'35*K'22+B'44*K'31+B'45*K'32=B12*K23+B13*K22+B22*K13+B23*K12,發(fā)現(xiàn)參與A24計(jì)算的卷積核單元與B矩陣單元,正好是前向計(jì)算時(shí)關(guān)聯(lián)的單元,所以我們可以通過(guò)旋轉(zhuǎn)卷積核后進(jìn)行卷積而得到采樣層的殘差。
殘差計(jì)算出來(lái)后,剩下的就是用更新權(quán)重和偏置,這和BP是一樣的,因此不再細(xì)究,有問(wèn)題歡迎交流。
5、代碼實(shí)現(xiàn)
詳細(xì)的代碼不再這里貼了,我依舊放在了github,歡迎參考和指正。我又是在重造車(chē)輪了,沒(méi)有使用任何第三方的庫(kù)類(lèi),這里貼一下調(diào)用代碼:
數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶(hù) ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱(chēng) BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢(xún)到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢(xún)結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢(xún)結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專(zhuān)注于從單 ...
2025-07-09year_month數(shù)據(jù)類(lèi)型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類(lèi)型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門(mén)控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書(shū)考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專(zhuān)業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03