deeplearning.ai (7)卷積神經網路

deeplearning.ai (7)卷積神經網路

來自專欄手把手深度學習,再學不會就放棄吧

關鍵詞:卷積運算 邊緣檢測 padding 卷積步長 卷積層 pooling 卷積神經網路示例 為什麼使用卷積

這一篇的內容對應於deeplearning.ai的第四門課卷積神經網路的第一周內容:卷積神經網路

卷積運算

最簡單的卷積運算,相對應位置直接乘,然後將所有位置的乘積加在一起得到結果。

數學上的卷積運算之前,需要先進行翻轉,之後再進行累加。(具體怎麼計算,我也給忘了。。。)

機器學習上的卷積嚴格來說只是互相關,再累加之前沒有進行翻轉,只是被稱為卷積。

邊緣檢測

傳統的機器學習方法是自己總結一些數據特徵,然後特徵數據作為網路的輸入進行訓練,最後應用模型。

在計算機視覺中,我們直接將每一張的圖片的各個顏色通道中的像素值信息作為網路的輸入,但是一般來說,圖像中包含的像素信息都是很多的,如果不進行處理,造成參數矩陣非常大,很容易造成過擬合。卷積就是為了解決這個問題的。

邊緣檢測,通過特定的核與圖像數據進行卷積運算,得到新的矩陣。

比如垂直邊緣檢測器

如果圖像在水平方向上沒有變動(對應沒有垂直邊緣),卷積計算結果為0。

以上的檢測器其實對於垂直邊緣,可能會檢測出正值以及負值,這兩者有什麼區別呢?

正值負值表示了顏色是由亮變暗還是由暗變亮,如果不關心這個的話,可以對於卷積之後的結果取絕對值。

我們可以將檢測器中的各個參數作為模型中的可以學習的參數,通過反向傳播來學習,從而學習各種不同的檢測器,從而提升對於圖像數據的捕捉能力。

除了這種的濾波器之外,還有1,2,1(sobel filter),3,10,3(schoss filter),這些濾波器添加了對於中間的元素的重視程度。

padding

卷積需要注意的是:在卷積運算之前就需要padding,而不是卷積計算之後padding

上面的卷積運算有兩個缺點:

  1. 每次卷積之後,圖像的大小都會減小
  2. 邊緣的角落的像素點,很少能夠被計算過程覆蓋

padding,在圖像的外邊緣,填充1個或多個像素點,能夠解決以上的問題。添加一層像素點,P=1,以此類推。

一般來說,padding都是和卷積搭配使用。通過是不是用padding,可以將卷積(convolution)分為兩種,valid convolution和same convolution。

f是卷積核的大小,而且卷積核一般都是奇數大小,且橫向和縱向的大小相等。

valid convolution:沒有padding的過程,卷積之後,圖像會變小,而且邊緣信息會丟失,圖像大小(n)->(n - f + 1),這時候P=0,不使用填充。

same convolution:利用padding技巧,使得卷積之後的圖像大小和之前的相同,padding的層數也就是P的大小和過濾器(核,filter的大小相關)。需要填充(f - 1)/2層,就可以達到我們的目標,使得卷積前後的大小相等。

卷積步長stride

之前介紹的卷積中,我們使用的卷積步長都是1,也就是每一次計算之後,卷積核都是向右或者向下移動一個像素,計算下一個位置的卷積結果。

我們也可以指定卷積的步長來得到不同的結果。

f 是filter的大小

p 是padding的寬度

s 是卷積的步長

圖像大小變換關係n -> (n + 2 * p - f) / s + 1

如果計算結果不是整數,就向下取整,這時候,就發生了移動了位置之後,發現沒有足夠的數據進行計算,卷積核的一部分已經超出了圖像的範圍。

卷積層

因為圖像有三個圖像通道,所以從數據是一個三維數據體,那麼過濾器也是一個三維立體的,分別對應圖像中的三個通道,不過處理完的結果並不是一個三維的,而是一個二維的

6*6*3 3*3*3 -> 4*4(圖像的通道數和過濾器的通道數是相等的)。

這樣的三維過濾器可以過濾特定顏色的,比如紅色邊緣可以讓第二層和第三層的過濾器參數為0,不關注顏色的時候,可以三個通道都設置同樣的參數。

如果要檢測多個方向的邊緣,可以將原圖像和多個過濾器進行卷積,每一次卷積都得到一個二維圖像,將這些二維圖像堆砌在一起,就構成了一個多維的數據,供下一層使用。比如某一層檢測了100個特徵,那麼輸出圖像就有100個通道數。

卷積層的計算

z = w * a + b a = g(z)

w就相當於卷積核(過濾器)

a就相當於上一層的輸入圖像

w * a 就相當於做完卷積之後得到的多維圖像(多少個過濾器,下一層就有多少個通道數)

+ b 就相當於對於多維圖像加上一個偏置

g(z) 相當於在加偏置之後的圖像上添加了一個ReLu函數作用,得到下一層的輸入圖像

pooling池化層

pooling的作用:縮減網路的規模,提升計算速度,提高所提取特徵的魯棒性。

池化層感覺就是一個採樣層,max pooling選取區域中的最大值。

池化層的超參數也有F和S

  1. F表示選取的小區域的大小,2*2的小區域,F就是2。
  2. S表示步長,比如一次前進兩步,S就是2,當S較小時,兩個小區域可能會有重疊的部分

池化層的直觀理解,池化層的輸入可以視為是某一種特徵的激活水平,如果某個區域內出現了這個特徵,就將其的最大值保留下來。

池化層沒有參數供學習,超參數確定之後是確定的,不會變動。

注意:池化層輸出的通道數和輸入的通道數相等,只在同一個通道中進行,不會融合多個通道的信息,每個信道都單獨計算。

平均池化,不常用,選取小區域中的平均值

常用參數F=2, S=2,小區域大小時2,步長也是2,小區域之間沒有重疊的部分,長度和寬度都減半。

池化的時候,很少使用padding技巧。

卷積神經網路示例

卷積網路的前面的層都是在進行卷積計算,將一個圖像映射為另一個圖像,圖像的大小可能在變化(應該是變小,或者是不變),通道數隨著過濾器的個數差異(應該是變大,大部分情況下,過濾器的個數都在增加)。

最後一層的時候,將倒數第二層的卷積結果展開為一個一維向量,將數據餵給一個邏輯回歸或者是softmax,生成最終的結果。

在卷積神經網路中,一般在卷積層之後添加一個池化層,由於池化層一般沒有參數供學習,我們將池化層視為卷積層的一個部分,卷積層和池化層在一起稱為一層。

全連接層出現在將卷積層的輸出結果展開為一個高維向量,並且同下一層的網路節點之間全部連接,所以被稱為全連接層。全連接層就是一個傳統意義上的神經網路的一層。

一般對於卷積層來說,隨著層數的增加,輸入信號的高和寬都會縮小(filter的作用,池化層的作用),而信道個數會增加。每一層的激活信號個數是總體大致下降的(寬度和高度降低,信道數目增加)。剛開始圖像中的像素點數目很多,最終全連接中的節點數量大幅降低。

為什麼使用卷積

卷積神經網路大幅降低了所需要的參數數目

1. 參數共享:通過一個過濾器,可以將這個過濾器作用到整個圖像上,都可以達到同樣的效果,例如垂直邊緣檢測器在圖像的任何位置都可以起作用。傳統的全連接網路中沒有這個性質,認為不同的位置的垂直邊緣檢測器都需要不同的參數,所以重新學習,增加了參數數目。

2. 稀疏連接:輸出層上的每一個輸出值都只依賴於輸入層的很少的部分數據,沒有對於全部輸入層數據。比如對於filter是3*3*5的大小來說,每一個輸出單元都只依賴於45個輸入數據

卷積神經網路善於捕捉平移不變性,在最近的論文中已經證明隨意的平移並不能做到這一點。

比如說,圖像平移幾個像素,圖中的貓照樣可以識別

訓練方法和傳統的神經網路相同,設定好損失函數之後,一直迭代,降低損失函數就可以了

推薦閱讀:

PCA之奇異值分解
Python擴大領先優勢,PyTorch僅佔6.4%:2018年數據科學語言&工具排名
循環神經網路不需要訓練?復現「世界模型」的新發現

TAG:機器學習 | 深度學習DeepLearning | 卷積神經網路CNN |