CNN(Convolutional Neural Network) 的基础
卷積神經網絡(Convolutional Neural Network,簡稱CNN),是一種前饋神經網絡,人工神經元可以響應周圍單元,可以進行大型圖像處理。卷積神經網絡包括卷積層和池化層。?卷積神經網絡是受到生物思考方式啟發的MLPs(多層感知器),它有著不同的類別層次,并且各層的工作方式和作用也不同。
CNN網絡結構
如圖所示,CNN網絡工作時,會伴隨著卷積并且不斷轉換著這些卷積。
學習完CNN后,明白了以下問題:
1. ?為什么卷積神經網絡更適合于圖像分類?相比于傳統的神經網絡優勢在哪里?
前面說到在圖像領域,用傳統的神經網絡并不合適。我們知道,圖像是由一個個像素點構成,每個像素點有三個通道,分別代表RGB顏色,那么,如果一個圖像的尺寸是(28,28,1),即代表這個圖像的是一個長寬均為28,channel為1的圖像(channel也叫depth,此處1代表灰色圖像)。如果使用全連接的網絡結構,即,網絡中的神經與與相鄰層上的每個神經元均連接,那就意味著我們的網絡有28 * 28 =784個神經元,hidden層采用了15個神經元,那么簡單計算一下,我們需要的參數個數(w和b)就有:784*15*10+15+10=117625個,這個參數太多了,隨便進行一次反向傳播計算量都是巨大的,從計算資源和調參的角度都不建議用傳統的神經網絡。
2. 卷積層中的卷積過程是如何計算的?為什么卷積核是有效的?
可以看到這就是最簡單的內積公式。feature_map1(1,1)表示在通過第一個卷積核計算完后得到的feature_map的第一行第一列的值,隨著卷積核的窗口不斷的滑動,我們可以計算出一個3*3的feature_map1;同理可以計算通過第二個卷積核進行卷積運算后的feature_map2,那么這一層卷積操作就完成了。feature_map尺寸計算公式:[ (原圖片尺寸 -卷積核尺寸)/ 步長 ] + 1。
那么問題來了,雖然我們知道了卷積核是如何計算的,但是為什么使用卷積核計算后分類效果要由于普通的神經網絡呢?我們仔細來看一下上面計算的結果。通過第一個卷積核計算后的feature_map是一個三維數據,在第三列的絕對值最大,說明原始圖片上對應的地方有一條垂直方向的特征,即像素數值變化較大;而通過第二個卷積核計算后,第三列的數值為0,第二行的數值絕對值最大,說明原始圖片上對應的地方有一條水平方向的特征。
仔細思考一下,這個時候,我們設計的兩個卷積核分別能夠提取,或者說檢測出原始圖片的特定的特征。此時我們其實就可以把卷積核就理解為特征提取器啊!現在就明白了,為什么我們只需要把圖片數據灌進去,設計好卷積核的尺寸、數量和滑動的步長就可以讓自動提取出圖片的某些特征,從而達到分類的效果啊!
注:1.此處的卷積運算是兩個卷積核大小的矩陣的內積運算,不是矩陣乘法。即相同位置的數字相乘再相加求和。不要弄混淆了。
2.卷積核的公式有很多,這只是最簡單的一種。我們所說的卷積核在數字信號處理里也叫濾波器,那濾波器的種類就多了,均值濾波器,高斯濾波器,拉普拉斯濾波器等等,不過,不管是什么濾波器,都只是一種數學運算,無非就是計算更復雜一點。
? ? ? ? ? ? ?每一層的卷積核大小和個數可以自己定義,不過一般情況下,根據實驗得到的經驗來看,會在越靠近輸入層的卷積層設定少量的卷積核,越往后,卷積層設定的卷積核數目就越多。具體原因大家可以先思考一下,小結里會解釋原因。
3. ?尺寸必須為正方形嗎?如果是長方形因該怎么做?
卷積核的尺寸不一定非得為正方形。長方形也可以,只不過通常情況下為正方形。如果要設置為長方形,那么首先得保證這層的輸出形狀是整數,不能是小數。如果你的圖像是邊長為 28 的正方形。那么卷積層的輸出就滿足 [ (28 - kernel_size)/ stride ] + 1 ,這個數值得是整數才行,否則沒有物理意義。譬如,你算得一個邊長為 3.6 的 feature map 是沒有物理意義的。?pooling 層同理。FC 層的輸出形狀總是滿足整數,其唯一的要求就是整個訓練過程中 FC 層的輸入得是定長的。如果你的圖像不是正方形。那么在制作數據時,可以縮放到統一大小(非正方形),再使用非正方形的 kernel_size 來使得卷積層的輸出依然是整數。總之,撇開網絡結果設定的好壞不談,其本質上就是在做算術應用題:如何使得各層的輸出是整數。
4. 步長的大小會對模型的效果產生什么樣的影響?垂直方向和水平方向的步長是否得設定為相同的?
實驗結果如下:
第一次改進:僅改變第一層與第二層的卷積核數目的大小,其他保持不變。可以看到結果提升了0.06%
第二次改進:保持3*3的卷積核大小,僅改變第二層的卷積核數目,其他保持不變,可以看到結果相較于原始參數提升了0.08%
由以上結果可以看出,改變卷積核的大小與卷積核的數目會對結果產生一定影響,在目前手寫數字識別的項目中,縮小卷積核尺寸,增加卷積核數目都會提高準確率。
有stride_w和stride_h,后者表示的就是上下步長。如果用stride,則表示stride_h=stride_w=stride。
5. 為什么要采用池化層,Max Pooling有什么好處?
從計算方式來看,算是最簡單的一種了,取max即可,但是這也引發一個思考,為什么需要Max Pooling,意義在哪里?如果我們只取最大值,那其他的值被舍棄難道就沒有影響嗎?不會損失這部分信息嗎?如果認為這些信息是可損失的,那么是否意味著我們在進行卷積操作后仍然產生了一些不必要的冗余信息呢?
其實從上文分析卷積核為什么有效的原因來看,每一個卷積核可以看做一個特征提取器,不同的卷積核負責提取不同的特征,我們例子中設計的第一個卷積核能夠提取出“垂直”方向的特征,第二個卷積核能夠提取出“水平”方向的特征,那么我們對其進行Max Pooling操作后,提取出的是真正能夠識別特征的數值,其余被舍棄的數值,對于我提取特定的特征并沒有特別大的幫助。那么在進行后續計算使,減小了feature map的尺寸,從而減少參數,達到減小計算量,缺不損失效果的情況。
不過并不是所有情況Max Pooling的效果都很好,有時候有些周邊信息也會對某個特定特征的識別產生一定效果,那么這個時候舍棄這部分“不重要”的信息,就不劃算了。所以具體情況得具體分析,如果加了Max Pooling后效果反而變差了,不如把卷積后不加Max Pooling的結果與卷積后加了Max Pooling的結果輸出對比一下,看看Max Pooling是否對卷積核提取特征起了反效果。
6. Zero Padding有什么作用?如果已知一個feature map的尺寸,如何確定zero padding的數目?
? ?所以到現在為止,我們的圖片由4*4,通過卷積層變為3*3,再通過池化層變化2*2,如果我們再添加層,那么圖片豈不是會越變越小?這個時候我們就會引出“Zero Padding”(補零),它可以幫助我們保證每次經過卷積或池化輸出后圖片的大小不變,如,上述例子我們如果加入Zero Padding,再采用3*3的卷積核,那么變換后的圖片尺寸與原圖片尺寸相同,如下圖所示:
圖4 zero padding結果
? 通常情況下,我們希望圖片做完卷積操作后保持圖片大小不變,所以我們一般會選擇尺寸為3*3的卷積核和1的zero padding,或者5*5的卷積核與2的zero padding,這樣通過計算后,可以保留圖片的原始尺寸。那么加入zero padding后的feature_map尺寸 =( width + 2 * padding_size - filter_size )/stride + 1
注:這里的width也可換成height,此處是默認正方形的卷積核,weight = height,如果兩者不相等,可以分開計算,分別補零。
7. ?tensorflow ?cnn模型中中padding中 same 和 VALID的區別
Noutput=Ninput/s
Noutput=(Ninput-f+1)/s
same模式下特征相乘,如果數量缺失,在原特征中補0操作。
而在VaLID中直接缺失。
?
總結
以上是生活随笔為你收集整理的CNN(Convolutional Neural Network) 的基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zookeeper结构和命令详解
- 下一篇: 棋盘问题 dfs