深度學習筆記(一):卷積層+激活函數+池化層+全連接層

寫在前面:大家好!我是【AI 菌】,一枚愛彈吉他的程序員。我熱愛AI、熱愛分享、熱愛開源! 這博客是我對學習的一點總結與記錄。如果您也對 深度學習、機器視覺、算法、Python、C++ 感興趣,可以關注我的動態,我們一起學習,一起進步~
我的博客地址爲:【AI 菌】的博客
我的Github項目地址是:【AI 菌】的Github
本教程會持續更新,如果對您有幫助的話,歡迎star收藏~


前言:
  在圖像分類以及目標檢測等任務中,卷積神經網絡已經得到了充分地運用。而對於常見的卷積神經網絡,我們經常可以看到卷積層、池化層、激活函數、全連接層的身影。直到現在,卷積層+激活函數+池化層+全連接層的結構仍然很實用,似乎已經成爲搭建卷積神經網絡的標配。下面我將從這四個方面分別介紹。
注:通常,池化層和激活函數又歸類於卷積層。這裏爲了講解方便,我分開介紹。

理論系列:

    深度學習筆記(二):激活函數總結

    深度學習筆記(三):BatchNorm(BN)層

    深度學習筆記(四):梯度下降法與局部最優解

    深度學習筆記(五):欠擬合、過擬合

    防止過擬合(5.1):正則化

    防止過擬合(5.2):Dropout

    防止過擬合(5.3):數據增強

實戰系列:

    深度學習環境搭建:Anaconda3+tensorflow2.0+PyCharm

    TF2.0深度學習實戰(一):分類問題之手寫數字識別

    TF2.0深度學習實戰(二):用compile()和fit()快速搭建MINIST分類器

    TF2.0深度學習實戰(三):LeNet-5搭建MINIST分類器

    TF2.0深度學習實戰(四):搭建AlexNet卷積神經網絡

    TF2.0深度學習實戰(五):搭建VGG系列卷積神經網絡

    TF2.0深度學習實戰(六):搭建GoogLeNet卷積神經網絡


1. 卷積層

卷積是一種有效提取圖片特徵的方法 。 一般用一個正方形卷積核,遍歷圖片上的每一個像素點。圖片與卷積核重合區域內相對應的每一個像素值,乘卷積核內相對應點的權重,然後求和, 再加上偏置後,最後得到輸出圖片中的一個像素值。
圖片分灰度圖和彩色圖,卷積核可以是單個也可以是多個,因此卷積操作分以下三種情況:

1.1 單通道輸入,單卷積核

這裏單通道指的是輸入爲灰度圖,單卷積核值卷積核個數是1個。
在這裏插入圖片描述
上面是 5x5x1 的灰度圖片,1 表示單通道,5x5 表示分辨率,共有 5 行 5列個灰度值。若用一個 3x3x1 的卷積覈對此 5x5x1 的灰度圖片進行卷積,偏置項b=1,則求卷積的計算是:(-1)x1+0x0+1x2+(-1)x5+0x4+1x2+(-1)x3+0x4+1x5+1=1(注意不要忘記加偏置 1)。

1.2 多通道輸入,單卷積核

多數情況下,輸入的圖片是 RGB 三個顏色組成的彩色圖,輸入的圖片包含了紅、綠、藍三層數據,卷積核的深度(通道數)應該等於輸入圖片的通道數,所以使用 3x3x3的卷積核,最後一個 3 表示匹配輸入圖像的 3 個通道,這樣這個卷積核有三通道,每個通道都會隨機生成 9 個待優化的參數,一共有 27 個待優化參數 w 和一個偏置 b。
在這裏插入圖片描述
注:這裏還是單個卷積核的情況,但是一個卷積核可以有多個通道。默認情況下,卷積核的通道數等於輸入圖片的通道數。

1.3 多通道輸入,多卷積核

多通道輸入、多卷積核是深度神經網絡中間最常見的形式。指的是多通道輸入,且用多個卷積核的情況。那麼卷積過程其實也很簡單,以3通道輸入,2個卷積核爲例
(1)先取出一個卷積核與3通道的輸入進行卷積,這個過程就和多通道輸入,單卷積核一樣,得到一個1通道的輸出output1。同樣再取出第二個卷積核進行同樣的操作,得到第二個輸出output2
(2)將相同size的output1與output2進行堆疊,就得到2通道的輸出output。
爲了更直觀地理解,下面給出圖示:
在這裏插入圖片描述
圖中輸入X:[1,h,w,3]指的是:輸入1張高h寬w的3通道圖片。
卷積核W:[k,k,3,2]指的是:卷積核尺寸爲3*3,通道數爲3,個數爲2。
總結:
(1)卷積操作後,輸出的通道數=卷積核的個數
(2)卷積核的個數和卷積核的通道數是不同的概念。每層卷積核的個數在設計網絡時會給出,但是卷積核的通道數不一定會給出。默認情況下,卷積核的通道數=輸入的通道數,因爲這是進行卷積操作的必要條件

1.4 填充padding

爲了使卷積操作後能得到滿意的輸出圖片尺寸,經常會使用padding對輸入進行填充操作。默認在圖片周圍填充0。
(1)全零填充padding=‘same’
使用same時,會自動對原圖進行全0填充,當步長爲1時,可以保證輸出的圖片與輸入的圖片尺寸一致。
輸出尺寸計算公式:輸入長/步長 (向上取整)
TensorFlow中實現如下:(這裏以卷積核個數:48,卷積核尺寸:3,步長:1,全填充爲例)

layers.Conv2D(48, kernel_size=3, strides=1, padding='same')

(2)不填充padding=‘valid’
使用valid時,不進行任何填充,直接進行卷積。
輸出尺寸計算公式:(輸入長-核長)/步長+1 (向下取整)
TensorFlow中實現如下:

layers.Conv2D(48, kernel_size=3, strides=1, padding='valid')

(3)自定義填充
一般是從上下左右四個方向進行填充,且左、右填充的列數pwp_w一般相同,上、下填充的行數php_h也應該相同。如下圖所示:
在這裏插入圖片描述
輸出尺寸計算公式:
在這裏插入圖片描述
在這裏插入圖片描述
其中,h,w爲原圖的高和寬,k是卷積核的尺寸,s是步長。
在TensorFlow2.0中,自定義填充過程中,padding參數的設置格式爲:
padding=[ [0,0],[上,下],[左,右],[0,0] ]

# 例如要在上下左右各填充一個單位,實現如下:
layers.Conv2D(48, kernel_size=3, strides=1, padding=[[0,0], [1,1], [1,1], [0,0]])

2. 池化層

在卷積層中,可以通過調節步長參數 s 實現特徵圖的高寬成倍縮小,從而降低了網絡的參數量。實際上,除了通過設置步長,還有一種專門的網絡層可以實現尺寸縮減功能,它就是我們要介紹的池化層(Pooling layer)。
池化層同樣基於局部相關性的思想,通過從局部相關的一組元素中進行採樣或信息聚合,從而得到新的元素值。通常我們用到兩種池化進行下采樣:
(1)最大池化(Max Pooling)
從局部相關元素集中選取最大的一個元素值。
(2)平均池化(Average Pooling)
從局部相關元素集中計算平均值並返回。

3. 激活函數

激活函數也是神經網絡不可缺少的部分,常用的激活函數有好幾種,具體如何選擇合適的激活函數可參考我的這篇博文:神經網絡搭建:激活函數總結

4. 全連接層

全連接層簡稱FC。之所以叫全連接,是因爲每個神經元與前後相鄰層的每一個神經元都有連接關係。如下圖所示,是一個簡單的兩層全連接網絡,輸入時特徵,輸出是預測的結果。
在這裏插入圖片描述
全連接層的參數量是可以直接計算的,計算公式如下:
在這裏插入圖片描述
按照上圖搭建的兩層全連接網絡,要訓練分辨率僅僅是 28x28=784 的黑白圖像,就有近 40 萬個待優化的參數。現實生活中高分辨率的彩色圖像,像素點更多,且爲紅綠藍三通道信息。待優化的參數過多, 容易導致模型過擬合。爲避免這種現象,實際應用中一般不會將原始圖片直接喂入全連接網絡。
在實際應用中,會先對原始圖像進行卷積特徵提取,把提取到的特徵餵給全連接網絡,再讓全連接網絡計算出分類評估值。

更新:
2015 年,Google 研究人員Sergey 等基於參數標準化設計了BN層。BN層提出後,廣泛地應用在各種深度網絡模型上,使得網絡的超參數的設定更加自由,同時網絡的收斂速度更快,性能也更好。
詳細瞭解請看:神經網絡搭建:BN層

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