卷積神經網絡(CNN)之網絡結構解析

CNN的層級結構

[參考CNN的網絡結構](https://blog.csdn.net/u014303046/article/details/86021346)

一、數據的輸入層
二、卷積計算層(核心部分)

  • 1、傳統的電腦進行圖片匹配:
    我們給定一個字母X的圖片,若電腦中存在一張一模一樣的圖片,我們將其進行比對則可以識別;若X經過放縮或者旋轉後,則電腦可能就無法識別(照片中對應點的像素值不同)
  • 2、CNN識別:
    在這裏插入圖片描述
    (1)CNN可以對一些經過變化後的圖片進行識別,它是通過將未知圖片的局部和標準圖片的局部進行一個局部的對比,如上圖。將兩者局部對比的過程,則爲卷積的操作,結果爲1則表示匹配,否則表示不匹配。

在這裏插入圖片描述
(2)對於CNN來說,它是一塊一塊地來進行比對。它拿來比對的這個“小塊”我們稱之爲feature(特徵)。在兩幅圖中大致相同的位置找到一些粗糙的特徵進行匹配,CNN能夠更好的看到兩幅圖的相似性,相比起傳統的整幅圖逐一比對的方法。其中每一個feature就像是一個小圖(就是一個比較小的有值的二維數組)。不同的feature匹配圖像中不同的特徵。在字母"X"的例子中,那些由對角線和交叉線組成的features基本上能夠識別出大多數"X"所具有的重要特徵。

在這裏插入圖片描述
這是標準X中的features;這些features幾乎可以匹配含有X的圖中,字母X的四個角和它的中心,具體匹配如下:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
(3)上圖中每一個小塊之間的匹配則爲卷積操作。對圖像(不同的數據窗口數據)和濾波矩陣(一組固定的權重:因爲每個神經元的多個權重固定,所以又可以看作一個恆定的濾波器filter)做內積(逐個元素相乘再進行求和)的操作就是卷積操作。
在這裏插入圖片描述
(4)同一張圖片中的像素點是固定的,我們可以通過不同的濾波矩陣(共享權值矩陣)得出我們從圖片中想要得到的不同特徵,在下圖中我們通過兩組不同的濾波,分別得出了顏色深淺信息和輪廓信息

在這裏插入圖片描述

  • 3、卷積層的計算
    (1)在CNN中,濾波器filter(帶着一組固定共享的權重神經元)對局部輸入的數據進行卷積計算。每次計算完一個數據窗口內的數據後,數據窗口平滑移動,直到計算完所有的數據。在計算中有如下幾個參數:
    深度depth:神經元個數,決定輸出的depth厚度。同時代表濾波器的個數
    步長stride:決定一次移動幾步,一共多少步可以到達邊緣
    填充值zero-padding:在外圍邊緣補充若干圈0,方便從初始位置以步長爲單位可以剛好滑到末尾的位置,也可以通過這種方法來控制輸出數據的大小
    在這裏插入圖片描述
    (2)如下在實際的三通道彩色圖片的計算
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    上圖的計算可以得出:
    P1:輸入層爲773(77表示的是圖像的像素,外圈的0是我們自己補充的,3代表的是R、G、B三通道)
    P2:存在兩個神經元(濾波器W0、濾波器W1),即depth=2
    P3:步長爲2,每次滑動的距離爲2,即stride = 2
    P4:在周圍補充了一圈零,zero-padding = 1
    P5:輸出爲最右側兩個不同的3
    3的數值矩陣
    P6:每一次平滑移動後的新數據都會進行不同的計算,這些新數據的計算就相當於局部感知機制。

height = (H-F)/S+1;width = (W-F)/S+1;H、W分別指輸入圖的尺寸,F爲卷積核大小,S表示步長

4、卷積核大小的選取
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
三、激勵層
1、引入激活函數的目的是,在模型中引入非線性。如果沒有激活函數,無論神經網絡有多少層,最終都是一個線性映射,單純的線性映射,無法解決線性不可分問題。引入非線性可以讓模型解決線性不可分問題。
2、Relu(z)Relu(z)激活函數
(1)relu函數計算簡單,可以加快模型的計算速度
在這裏插入圖片描述
四、池化層(pooling)
1、池化,實際是一個下采樣的過程。由於輸入的圖片尺寸可能比較大,這時候,我們可以通過下采樣來減小圖片的尺寸。池化層,可以減小模型的規模,提高運算的速度以及提高所提取特徵的魯棒性。
2、池化操作也有核大小ff和步長ss參數,它們的含義和卷積參數的意義相同
3、介紹常用的兩種池化(最大池化(Max Pooling)和平均池化(Average Pooling))
(1)最大池化
所謂最大池化,就是對於f×ff×f大小的池化核,選取原圖中數值最大的那個保留下來。比如,池化核 222*2大小,步長爲2的池化過程如下(左邊是池化前,右邊是池化後),對於每個池化區域都取最大值:
(2)平均池化:
所謂平均池化,就是對於f×ff×f大小的池化核,選取原圖中的平均數值進行計算。比如,池化核 222*2大小,步長爲2的池化過程如下(左邊是池化前,右邊是池化後),對於每個池化區域都取平均值:
在這裏插入圖片描述
五、卷積神經網絡的前向傳播過程
在這裏插入圖片描述

1、傳播流程(多個卷積、池化…類似全連接神經網絡中的多層隱藏層結構)
(1)輸入數據:三通道彩色圖像WH3
(2)卷積操作:卷積過程採用n個卷積核,每個卷積核都有三個通道(卷積核的通道和輸入圖片的通道數目相同),隨着特徵圖的通道數不同,每次的通道數可能都會發生改變。
(3)激活操作:將卷積後的結果進行激活(個人認爲偏置應該在激活前處理)
(4)池化操作
(5)將(4)得到的結果爲(WHnW\prime*H\prime*n)進行下一步的卷積操作(此時卷積核的層數應該爲n),重複(2)(3)(5)操作,直到最後的全連接操作。
(6)全連接結構和BP網絡類似。我們需要設計合適的損失函數,反向傳播最小化的損失函數,優化網絡的參數,達到模型的預期效果

2、一些卷積網絡中的符號表示
(1)卷積conv2d(input,filter,strides,padding)

  • input:卷積輸入(H×W×Cin,Cin)(H×W×C_{in},C_in​指的是輸入的通道數)
  • filter:卷積核W (fheight×fwidth×Cin×Cout)(f_{height}×f_{width}×C_{in}×C_{out})
  • strides:步長,一般爲1×1×1×11×1×1×1
  • padding:指明padding的算法,‘SAME’或者‘VALID’(SAME表示維持原有的維度不變)

(2)激活relu(conv)

  • conv:卷積的結果

(3)偏置相加add(conv,b)

  • conv:卷積的激活輸出
  • b:偏置係數

(4)池化max_pool(value,ksize,strides,padding)

  • value:卷積的輸出
  • ksize:池化尺寸 一般爲2*2
  • strides:步長
  • padding:指明padding的算法,‘SAME’(輸出爲等大的矩陣)或者‘VALID’

六、卷積神經網絡的反向傳播過程
1、對比全連接神經網絡的反向傳播過程。卷積神經網絡的反向傳播過程與其類似,但是並不是一樣的,區別如下
(1)卷積神經網絡的卷積核,每次滑動只與部分輸入相連,具有局部映射的特點,在誤差反向傳播的時候,需要確定卷積核的局部連接方式。
(2)卷積神經網絡的池化過程中丟失了大量的信息,誤差反傳,則需要恢復這些丟失的信息
2、卷積層的誤差反傳
(1)假設損失函數爲Loss,現在通過損失函數對參數W和偏置b的梯度進行求解。
(2)卷積核W的梯度

  • Z[l]=conv2d(Zpool[l1],(W,b),strides=1,padding=SAME)Z{^{[l]}} = conv2d(Z{^{[l-1]}_{pool}},(W,b),strides = 1,padding='SAME')=mnWm,n[l]Zpool_m,n[l1]+b[l]=\sum^m\sum^nW{_{m',n'}^{[l]}}Z{_{pool\_m,n}^{[l-1]}}+b^{[l]}
  • 其中Zpool_m,nZ{_{pool\_m,n}}表示上一層池化的輸出結果,它作爲第(l)層的輸入數據,m和n分別表示輸入的長和寬;m’和n’表示(l-1)層卷積核的尺寸。
  • 卷積層的反向傳播的基礎依舊是鏈式法則,所以我們需要理解權重W的局部連接方式。

在這裏插入圖片描述

卷積核在輸入的特徵圖ZL1Z^{L-1}層上滑動,所以特徵圖ZL1Z^{L-1}層上所有的像素點都參與了卷積核的運算;同時輸出特徵圖ZLZ^{L}層上的每個像素也都核卷積核W直接相連。

  • LossWm,n[l]=i=0Weightj=0HeightLossZi,j[l]Zi,j[l]Wm,n[l]\frac{\partial{Loss}}{\partial{W{^{[l]}_{m',n'}}}}=\sum{_{i=0}^{Weight}}\sum{_{j=0}^{Height}}{\frac{\partial{Loss}}{\partial{Z{^{[l]}_{i,j}}}}}{\frac{\partial{Z^{[l]}_{i,j}}}{\partial{W{^{[l]}_{m',n'}}}}}
    =i=0Weightj=0HeightdZi,j[l]Zi,j[l]Wm,n[l]=\sum{_{i=0}^{Weight}}\sum{_{j=0}^{Height}}{dZ{^{[l]}_{i,j}}}{\frac{\partial{Z^{[l]}_{i,j}}}{\partial{W{^{[l]}_{m',n'}}}}}
    其中Z表示沒有激活的輸出,dZ[l]dZ^{[l]}表示lthl^{th}層的誤差。所以將後面部分進行展開求解
    Zi,j[l]Wm,n[l]=Wm,n[l](mnWm,n[l]Zpool_m,n[l1]+b[l]){\frac{\partial{Z^{[l]}_{i,j}}}{\partial{W{^{[l]}_{m',n'}}}}}=\frac{\partial}{\partial{W{_{m',n'}^{[l]}}}}(\sum^m\sum^nW{_{m',n'}^{[l]}}Z{_{pool\_m,n}^{[l-1]}}+b^{[l]})
    =Wm,n[l](W0,0[l]Zpool_i+0,j+0[l1]+...+Wm,n[l]Zpool_i+m,j+m[l1]+b[l])=\frac{\partial}{\partial{W{_{m',n'}^{[l]}}}}(W{_{0,0}^{[l]}}Z{_{pool\_i+0,j+0}^{[l-1]}}+...+W{_{m',n'}^{[l]}}Z{_{pool\_i+m',j+m'}^{[l-1]}}+b^{[l]})
    =Zpool_i+m,j+n[l1]=Z{^{[l-1]}_{pool\_i+m',j+n'}}
    注意上面的式子是Zi,j[l]{{Z^{[l]}_{i,j}}}Wm,n[l]{{W^{[l]}_{m',n'}}}的偏導數,我們必須找到這一點Zi,j[l]{Z^{[l]}_{i,j}}和權值W的關係,在(l-1)層中只有和卷積核等大的某個區域纔會對(l)層的某個點產生影響,然後再去求出相應權值的偏導數。個人對偏導數的理解(用全連接的方式來類比),下圖只是部分的內容關於ll層的某一點對卷積核的偏導,更多的點自己補全。
    在這裏插入圖片描述
    LossWm,n[l]=i=0Weightj=0HeightdZi,j[l]Zi,j[l]Wm,n[l]\frac{\partial{Loss}}{\partial{W{^{[l]}_{m',n'}}}}=\sum{_{i=0}^{Weight}}\sum{_{j=0}^{Height}}{dZ{^{[l]}_{i,j}}}{\frac{\partial{Z^{[l]}_{i,j}}}{\partial{W{^{[l]}_{m',n'}}}}}
    =i=0Weightj=0HeightdZi,j[l]Zpool_i+m,j+m[l1]=\sum{_{i=0}^{Weight}}\sum{_{j=0}^{Height}}{dZ{^{[l]}_{i,j}}}Z{_{pool\_i+m',j+m'}^{[l-1]}}

(3)卷積核b的梯度

Lossb[l]=i=0Weightj=0HeightdZi,j[l]\frac{\partial{Loss}}{\partial{b^{[l]}}}=\sum{_{i=0}^{Weight}}\sum{_{j=0}^{Height}}{dZ{^{[l]}_{i,j}}}

  • 最後對dZi,j[l]{dZ{^{[l]}_{i,j}}}進行相應的求解
    dZi,j[l]=LossZi,j[l]=LossZ[l+1]Z[l+1]Zi,j[l]=dZ[l+1]Z[l+1]Zi,j[l]dZ{_{i,j}^{[l]}}= \frac{\partial{Loss}}{\partial{Z{_{i,j}^{[l]}}}} =\frac{\partial{Loss}}{\partial{Z{^{[l+1]}}}} \frac{\partial{Z^{[l+1]}}}{\partial{Z{_{i,j}^{[l]}}}}=dZ{^{[l+1]}}\frac{\partial{Z{^{[l+1]}}}}{\partial{Z{_{i,j}^{[l]}}}}
    因爲(l)層中的某個像素點可能會影響到第(l+1)層的一塊區域內的像素點的值(根據卷積核的大小來確定)

在這裏插入圖片描述
3、池化層的誤差反傳
池化層中沒有要學習的參數,但在下采樣的操作中損失了大量的信息,因此我們在反向傳播的過程中需要採用上採樣的方法(升維),在最大池化和均值池化中,兩者的上採樣方法不同
(1)最大池化的誤差反傳

  • 我們必須要直到最大元素的位置,然後將池化中的值放到相應的位置,其餘位置用零進行補充即可

在這裏插入圖片描述

(2)均值池化的誤差反傳

  • 我們需要將某一個值取平均之後(根據下采樣的核ff來確定),以核爲222*2進行舉例說明,將一個數升維到22(2*2)的矩陣。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章