日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Deep learn toolbox:CNN BP求导解析

發(fā)布時(shí)間:2025/3/15 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Deep learn toolbox:CNN BP求导解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

《Notes on Convolutional Neural Networks》中詳細(xì)講解了CNN的BP過(guò)程,下面結(jié)合Deep learn toolbox中CNN的BP源碼對(duì)此做一些解析

?卷積層:

? ? ? ?卷積層的前向傳導(dǎo):

? ??? ? ? ? ? ? ? ? ?

? ? ? ?誤差反傳:

? ? ? ? 當(dāng)卷基層的下一層是pooling層時(shí),如果pooling層的誤差敏感項(xiàng)為時(shí),那么卷基層的誤差敏感項(xiàng)為:

? ? ??

? ? ? ?其中,upsample表示對(duì)進(jìn)行上采樣,表示激活函數(shù)對(duì)輸入的導(dǎo)數(shù),代表點(diǎn)積操作

? ? ? ?upsample根據(jù)pooling時(shí)采用方法來(lái)定,大概思想為:pooling層的每個(gè)節(jié)點(diǎn)是由卷積層中多個(gè)節(jié)點(diǎn)(一般為一個(gè)矩形區(qū)域)共同計(jì)算得到,所以pooling層每個(gè)節(jié)點(diǎn)的誤差敏感值也是由卷積層中多個(gè)節(jié)點(diǎn)的誤差敏感值共同產(chǎn)生的,只需滿足兩層的誤差敏感值總和相等即可,下面以mean-pooling和max-pooling為例來(lái)說(shuō)明。

假設(shè)卷積層的矩形大小為4×4, pooling區(qū)域大小為2×2, 很容易知道pooling后得到的矩形大小也為2*2(本文默認(rèn)pooling過(guò)程是沒(méi)有重疊的,卷積過(guò)程是每次移動(dòng)一個(gè)像素,即是有重疊的,后續(xù)不再聲明),如果此時(shí)pooling后的矩形誤差敏感值如下:

?  

  則按照mean-pooling,首先得到的卷積層應(yīng)該是4×4大小,其值分布為(等值復(fù)制):

?  

  因?yàn)榈脻M足反向傳播時(shí)各層見(jiàn)誤差敏感總和不變,所以卷積層對(duì)應(yīng)每個(gè)值需要平攤(除以pooling區(qū)域大小即可,這里pooling層大小為2×2=4)),最后的卷積層值

分布為:

?  

  如果是max-pooling,則需要記錄前向傳播過(guò)程中pooling區(qū)域中最大值的位置,這里假設(shè)pooling層值1,3,2,4對(duì)應(yīng)的pooling區(qū)域位置分別為右下、右上、左上、左下。則此時(shí)對(duì)應(yīng)卷積層誤差敏感值分布為:

  ?

  求得后,我們就要求卷積層的導(dǎo)數(shù)了,論文中給出的公式為:

? ? ??

? ? 上式中表示的(u,v)項(xiàng)的值,表示與進(jìn)行卷積的結(jié)果的(u,v)項(xiàng)所對(duì)應(yīng)的的patch。

? ? ?上述公式和下面的公式是等價(jià)的:

? ? 損失函數(shù)對(duì)b的導(dǎo)數(shù)為:

? ? ? ? ?

?deep learn toolbox就是按照上述2個(gè)公式計(jì)算的。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??


?pooling層

? ? ??pooling層的前向傳導(dǎo):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ??down(.)表示一個(gè)下采樣函數(shù)。典型的操作一般是對(duì)輸入圖像的不同nxn的塊的所有像素進(jìn)行求和。這樣輸出圖像在兩個(gè)維度上都縮小了n倍。每個(gè)輸出map都對(duì)應(yīng)一個(gè)屬于自己的乘性偏置β和一個(gè)加性偏置b

? ? 已知卷積層的誤差敏感項(xiàng)時(shí),那么pooling層的誤差敏感項(xiàng)為:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? 得到誤差敏感項(xiàng)后,由于pooling只有兩個(gè)參數(shù),分別求導(dǎo):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ?但在deep learn toolbox中,只是簡(jiǎn)單地進(jìn)行subsampling,并沒(méi)有加sigmoid激活函數(shù),因而pooling層沒(méi)有參數(shù),不需要對(duì)pooling層求導(dǎo),也不

要對(duì)其參數(shù)進(jìn)行更新。

? ?

? ?下面是deep learn toolbox 中CNN BP算法的代碼:

? ?

[cpp]?view plaincopy
  • function?net?=?cnnbp(net,?y)????
  • ????n?=?numel(net.layers);????
  • ????//??error????
  • ????net.e?=?net.o?-?y;????
  • ????//??loss?function????
  • ????net.L?=?1/2*?sum(net.e(:)?.^?2)?/?size(net.e,?2);????
  • ????//從最后一層的error倒推回來(lái)deltas????
  • ????//和神經(jīng)網(wǎng)絡(luò)的bp有些類似????
  • ??????backprop?deltas????
  • ????net.od?=?net.e?.*?(net.o?.*?(1?-?net.o));???//??output?delta????
  • ????net.fvd?=?(net.ffW'?*?net.od);??????????????//??feature?vector?delta????
  • ????if?strcmp(net.layers{n}.type,?'c')?????????//??only?conv?layers?has?sigm?function????
  • ????????net.fvd?=?net.fvd?.*?(net.fv?.*?(1?-?net.fv));????
  • ????end????
  • ????//和神經(jīng)網(wǎng)絡(luò)類似,參看神經(jīng)網(wǎng)絡(luò)的bp????
  • ????
  • ????//??reshape?feature?vector?deltas?into?output?map?style????
  • ????sa?=?size(net.layers{n}.a{1});????
  • ????fvnum?=?sa(1)?*?sa(2);????
  • ????for?j?=?1?:?numel(net.layers{n}.a)????
  • ????????net.layers{n}.d{j}?=?reshape(net.fvd(((j?-?1)?*?fvnum?+?1)?:?j?*?fvnum,?:),?sa(1),?sa(2),?sa(3));????
  • ????end????
  • ????//這是算delta的步驟????
  • ????//這部分的計(jì)算參看Notes?on?Convolutional?Neural?Networks,其中的變化有些復(fù)雜????
  • ????//和這篇文章里稍微有些不一樣的是這個(gè)toolbox在subsampling(也就是pooling層)沒(méi)有加sigmoid激活函數(shù)????
  • ????//所以這地方還需仔細(xì)辨別????
  • ????//這這個(gè)toolbox里的subsampling是不用計(jì)算gradient的,而在上面那篇note里是計(jì)算了的????
  • ????for?l?=?(n?-?1)?:?-1?:?1????
  • ????????if?strcmp(net.layers{l}.type,?'c')????
  • ????????????for?j?=?1?:?numel(net.layers{l}.a)????
  • ????????????????net.layers{l}.d{j}?=?net.layers{l}.a{j}?.*?(1?-?net.layers{l}.a{j})?.*?(expand(net.layers{l?+?1}.d{j},?[net.layers{l?+?1}.scale?net.layers{l?+?1}.scale?1])?/?net.layers{l?+?1}.scale?^?2);????
  • ????????????end????
  • ????????elseif?strcmp(net.layers{l}.type,?'s')????
  • ????????????for?i?=?1?:?numel(net.layers{l}.a)????
  • ????????????????z?=?zeros(size(net.layers{l}.a{1}));????
  • ????????????????for?j?=?1?:?numel(net.layers{l?+?1}.a)????
  • ?????????????????????z?=?z?+?convn(net.layers{l?+?1}.d{j},?rot180(net.layers{l?+?1}.k{i}{j}),?'full');????
  • ????????????????end????
  • ????????????????net.layers{l}.d{i}?=?z;????
  • ????????????end????
  • ????????end????
  • ????end????
  • ????//參見(jiàn)paper,注意這里只計(jì)算了'c'層的gradient,因?yàn)橹挥羞@層有參數(shù)????
  • ??????calc?gradients????
  • ????for?l?=?2?:?n????
  • ????????if?strcmp(net.layers{l}.type,?'c')????
  • ????????????for?j?=?1?:?numel(net.layers{l}.a)????
  • ????????????????for?i?=?1?:?numel(net.layers{l?-?1}.a)????
  • ????????????????????net.layers{l}.dk{i}{j}?=?convn(flipall(net.layers{l?-?1}.a{i}),?net.layers{l}.d{j},?'valid')?/?size(net.layers{l}.d{j},?3);????
  • ????????????????end????
  • ????????????????net.layers{l}.db{j}?=?sum(net.layers{l}.d{j}(:))?/?size(net.layers{l}.d{j},?3);????
  • ????????????end????
  • ????????end????
  • ????end????
  • ????//最后一層perceptron的gradient的計(jì)算????
  • ????net.dffW?=?net.od?*?(net.fv)'?/?size(net.od,?2);????
  • ????net.dffb?=?mean(net.od,?2);????
  • ????
  • ????function?X?=?rot180(X)????
  • ????????X?=?flipdim(flipdim(X,?1),?2);????
  • ????end????
  • end????

  • 總結(jié)

    以上是生活随笔為你收集整理的Deep learn toolbox:CNN BP求导解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。