編寫C語言版本的卷積神經(jīng)網(wǎng)絡(luò)CNN之三:CNN的誤差反向傳播過程

https://blog.csdn.net/tostq/article/details/51788093

上一節(jié)我們介紹了卷積神經(jīng)網(wǎng)絡(luò)的前向傳播過程,這一節(jié)我們重點(diǎn)介紹反向傳播過程揍堕,反向傳播過程反映神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)訓(xùn)練過程郑象。
誤差反向傳播方法是神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的基礎(chǔ)精耐,網(wǎng)絡(luò)上已經(jīng)有許多相關(guān)的內(nèi)容了,不過關(guān)于卷積網(wǎng)絡(luò)的誤差反向傳遞的公式推導(dǎo)卻比較少,而且也不是很清晰桃熄,本文將會(huì)詳細(xì)推導(dǎo)這個(gè)過程,雖然內(nèi)容很復(fù)雜型奥,但卻值得學(xué)習(xí).

首先我們需要知道的是誤差反向傳播的學(xué)習(xí)方法瞳收,實(shí)際是梯度下降法求最小誤差的權(quán)重過程。當(dāng)然我們的目的是求誤差能量關(guān)于參數(shù)(權(quán)重)的導(dǎo)數(shù).

梯度下降法更新權(quán)重公式如下所示:

這里W表示權(quán)重厢汹,E表示誤差能量螟深,n表示第n輪更新迭代,η表示學(xué)習(xí)參數(shù)烫葬,Y表示輸出界弧,\delta表示局域梯度凡蜻。

而另一方面誤差能量關(guān)于參數(shù)(權(quán)重)的導(dǎo)數(shù)同當(dāng)前層輸入是相關(guān)的,所以我們需要一個(gè)更好地將當(dāng)前層誤差傳遞給下一層的量垢箕,因?yàn)檫@個(gè)\delta同當(dāng)前層的輸出無關(guān)划栓,其只是反映了當(dāng)前層的固定結(jié)構(gòu),所以我們可以將這個(gè)固有性質(zhì)\delta反向傳遞給下一層条获,其定義為:

接下來我們分層分析整個(gè)網(wǎng)絡(luò)的反向傳播過程忠荞。在本文的卷積神經(jīng)網(wǎng)絡(luò)中主要有以下四種情況:

一、輸出層(單層神經(jīng)網(wǎng)絡(luò)層)

(1)誤差能量定義為實(shí)際輸出與理想輸出的誤差

這里的d是理想預(yù)期輸出帅掘,y指實(shí)際輸出委煤,i指輸出位,本文的網(wǎng)絡(luò)輸出為10位修档,所以N=10碧绞。

(2)誤差能量關(guān)于參數(shù)(權(quán)重)的導(dǎo)數(shù)。

這一層是比較簡(jiǎn)單的

由于本文是采用Sigmoid系數(shù)的激活函數(shù)吱窝,所以其導(dǎo)數(shù)可以求出為:

其局域梯度\delta表示為:

二讥邻、后接輸出層的采樣層S4

后接輸出層的采樣層向多層感知器的隱藏神經(jīng)元的反向傳播是類似的。

由于這一層沒有權(quán)重癣诱,所以不需要進(jìn)行權(quán)重更新计维,但是我們也需要將誤差能量傳遞給下一層,所以需要計(jì)算局域梯度\delta撕予,其定義如下鲫惶,這里j指輸出圖像中的像素序號(hào),S4層共有12\times4\times4=192個(gè)輸出像素实抡,所以j=1 ~ 192欠母。

另外輸出層O5的局域梯度\delta也已經(jīng)計(jì)算過了:

由于采樣層沒有激活函數(shù),所以φ的導(dǎo)數(shù)為1吆寨,則最終可以得到

通過上式赏淌,我們就可以算出由輸出層O5傳遞到S4層的局域梯度\delta值∽那澹可以看出傳遞到采樣層各輸出像素j的局域梯度\delta值六水,實(shí)際是相當(dāng)于與其相連的下層輸出的局域梯度\delta值乘上相連權(quán)重的總和。

三辣卒、后接采樣層的卷積層C1掷贾、C3

前面為了方便計(jì)算,S4層和O5層的輸出都被展開成了一維荣茫,所以像素都是以i和j作為標(biāo)號(hào)的想帅,到了C3層往前,我們以像素的坐標(biāo)m(x啡莉,y)來標(biāo)號(hào)港准,m(x旨剥,y)表示第m張輸出模板的(x,y)位置的像素。局域梯度\delta值定義為:

image.png

傳遞到該像素的誤差能量等于所有與其相連的像素誤差能量和浅缸,這里的i指的m(x,y)采樣鄰域Θ內(nèi)的所有像素

因?yàn)楸疚牟捎玫氖瞧骄鵓ooling方法轨帜,S4的輸出就是該像素鄰域內(nèi)的所有像素的平均值,這里的S指鄰域Θ內(nèi)的所有像素的總數(shù)疗杉,本文采用的是2\times2的采樣塊阵谚,所以S=4。

(1)因此由S4傳遞到C3層的局域梯度\delta值為:

接下來我們依據(jù)局域梯度\delta值烟具,來計(jì)算C3層的權(quán)重更新值。

(2)C3層的權(quán)重更新值奠蹬。

C3層共有6\times12個(gè)5\times5的模板朝聋,我們首先定義n=1 ~ 6m=1~12表示模板的標(biāo)號(hào)囤躁,s,t表示模板中參數(shù)的位置

(3)C1層的權(quán)重更新公式和局域梯度\delta

同理冀痕,我們也可以得到C1層的權(quán)重更新公式,這里的M=6狸演,N=1言蛇,而y是指輸入圖像

四、后接卷積層的采樣層S2

這里的n為當(dāng)前S2層的輸出圖像序號(hào)(n=1 ~ 6)宵距,n為當(dāng)前C3層的輸出圖像序號(hào)(m=1~12)腊尚。

因此第n塊圖像的局域梯度\delta值為

五、誤差反向傳播過程的代碼展示

    void cnnbp(CNN* cnn,float* outputData) // 網(wǎng)絡(luò)的后向傳播
    {
        int i,j,c,r; // 將誤差保存到網(wǎng)絡(luò)中
        for(i=0;i<cnn->O5->outputNum;i++)
            cnn->e[i]=cnn->O5->y[i]-outputData[i];
     
        /*從后向前反向計(jì)算*/
        // 輸出層O5
        for(i=0;i<cnn->O5->outputNum;i++)
            cnn->O5->d[i]=cnn->e[i]*sigma_derivation(cnn->O5->y[i]);
     
        // S4層满哪,傳遞到S4層的誤差
        // 這里沒有激活函數(shù)
        nSize outSize={cnn->S4->inputWidth/cnn->S4->mapSize,cnn->S4->inputHeight/cnn->S4->mapSize};
        for(i=0;i<cnn->S4->outChannels;i++)
            for(r=0;r<outSize.r;r++)
                for(c=0;c<outSize.c;c++)
                    for(j=0;j<cnn->O5->outputNum;j++){
                        int wInt=i*outSize.c*outSize.r+r*outSize.c+c;
                        cnn->S4->d[i][r][c]=cnn->S4->d[i][r][c]+cnn->O5->d[j]*cnn->O5->wData[j][wInt];
                    }
     
        // C3層
        // 由S4層傳遞的各反向誤差,這里只是在S4的梯度上擴(kuò)充一倍
        int mapdata=cnn->S4->mapSize;
        nSize S4dSize={cnn->S4->inputWidth/cnn->S4->mapSize,cnn->S4->inputHeight/cnn->S4->mapSize};
        // 這里的Pooling是求平均婿斥,所以反向傳遞到下一神經(jīng)元的誤差梯度沒有變化
        for(i=0;i<cnn->C3->outChannels;i++){
            float** C3e=UpSample(cnn->S4->d[i],S4dSize,cnn->S4->mapSize,cnn->S4->mapSize);
            for(r=0;r<cnn->S4->inputHeight;r++)
                for(c=0;c<cnn->S4->inputWidth;c++)
                    cnn->C3->d[i][r][c]=C3e[r][c]*sigma_derivation(cnn->C3->y[i][r][c])/(float)(cnn->S4->mapSize*cnn->S4->mapSize);
            for(r=0;r<cnn->S4->inputHeight;r++)
                free(C3e[r]);
            free(C3e);
        }
     
        // S2層,S2層沒有激活函數(shù)哨鸭,這里只有卷積層有激活函數(shù)部分
        // 由卷積層傳遞給采樣層的誤差梯度民宿,這里卷積層共有6*12個(gè)卷積模板
        outSize.c=cnn->C3->inputWidth;
        outSize.r=cnn->C3->inputHeight;
        nSize inSize={cnn->S4->inputWidth,cnn->S4->inputHeight};
        nSize mapSize={cnn->C3->mapSize,cnn->C3->mapSize};
        for(i=0;i<cnn->S2->outChannels;i++){
            for(j=0;j<cnn->C3->outChannels;j++){
                float** corr=correlation(cnn->C3->mapData[i][j],mapSize,cnn->C3->d[j],inSize,full);
                addmat(cnn->S2->d[i],cnn->S2->d[i],outSize,corr,outSize);
                for(r=0;r<outSize.r;r++)
                    free(corr[r]);
                free(corr);
            }
            /*
            for(r=0;r<cnn->C3->inputHeight;r++)
                for(c=0;c<cnn->C3->inputWidth;c++)
                    // 這里本來用于采樣的激活
            */
        }
     
        // C1層,卷積層
        mapdata=cnn->S2->mapSize;
        nSize S2dSize={cnn->S2->inputWidth/cnn->S2->mapSize,cnn->S2->inputHeight/cnn->S2->mapSize};
        // 這里的Pooling是求平均像鸡,所以反向傳遞到下一神經(jīng)元的誤差梯度沒有變化
        for(i=0;i<cnn->C1->outChannels;i++){
            float** C1e=UpSample(cnn->S2->d[i],S2dSize,cnn->S2->mapSize,cnn->S2->mapSize);
            for(r=0;r<cnn->S2->inputHeight;r++)
                for(c=0;c<cnn->S2->inputWidth;c++)
                    cnn->C1->d[i][r][c]=C1e[r][c]*sigma_derivation(cnn->C1->y[i][r][c])/(float)(cnn->S2->mapSize*cnn->S2->mapSize);
            for(r=0;r<cnn->S2->inputHeight;r++)
                free(C1e[r]);
            free(C1e);
        }    
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末活鹰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子只估,更是在濱河造成了極大的恐慌志群,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仅乓,死亡現(xiàn)場(chǎng)離奇詭異赖舟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)夸楣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門宾抓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來子漩,“玉大人,你說我怎么就攤上這事石洗〈逼茫” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵讲衫,是天一觀的道長(zhǎng)缕棵。 經(jīng)常有香客問我,道長(zhǎng)涉兽,這世上最難降的妖魔是什么招驴? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮枷畏,結(jié)果婚禮上别厘,老公的妹妹穿的比我還像新娘。我一直安慰自己拥诡,他們只是感情好触趴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渴肉,像睡著了一般冗懦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仇祭,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天披蕉,我揣著相機(jī)與錄音,去河邊找鬼前塔。 笑死嚣艇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的华弓。 我是一名探鬼主播食零,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼寂屏!你這毒婦竟也來了贰谣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤迁霎,失蹤者是張志新(化名)和其女友劉穎吱抚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體考廉,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秘豹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昌粤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片既绕。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啄刹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凄贩,到底是詐尸還是另有隱情誓军,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布疲扎,位于F島的核電站昵时,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏椒丧。R本人自食惡果不足惜壹甥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壶熏。 院中可真熱鬧盹廷,春花似錦、人聲如沸久橙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淆衷。三九已至,卻和暖如春渤弛,著一層夾襖步出監(jiān)牢的瞬間祝拯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工她肯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佳头,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓晴氨,卻偏偏與公主長(zhǎng)得像康嘉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子籽前,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容