一文看懂卷積神經網路
(本文轉載自https://www.jianshu.com/p/c0215d26d20a)
一、邊界檢測
我們來看一個最簡單的例子:“邊界檢測(edge detection)”,假設我們有這樣的一張圖片,大小8×8:
圖片中的數字代表該位置的畫素值,我們知道,畫素值越大,顏色越亮,所以為了示意,我們把右邊小畫素的地方畫成深色。圖的中間兩個顏色的分界線就是我們要檢測的邊界。
怎麼檢測這個邊界呢?我們可以設計這樣的一個 濾波器(filter,也稱為kernel),大小3×3:
然後,我們用這個filter,往我們的圖片上“蓋”,覆蓋一塊跟filter一樣大的區域之後,對應元素相乘,然後求和。計算一個區域之後,就向其他區域挪動,接著計算,直到把原圖片的每一個角落都覆蓋到了為止。這個過程就是 “卷積”。
(我們不用管卷積在數學上到底是指什麼運算,我們只用知道在CNN中是怎麼計算的。)
這裡的“挪動”,就涉及到一個步長了,假如我們的步長是1,那麼覆蓋了一個地方之後,就挪一格,容易知道,總共可以覆蓋6×6個不同的區域。
那麼,我們將這6×6個區域的卷積結果,拼成一個矩陣:
誒?!發現了什麼?
這個圖片,中間顏色淺,兩邊顏色深,這說明我們們的原圖片中間的邊界,在這裡被反映出來了!
從上面這個例子中,我們發現,我們可以通過設計特定的filter,讓它去跟圖片做卷積,就可以識別出圖片中的某些特徵,比如邊界。
上面的例子是檢測豎直邊界,我們也可以設計出檢測水平邊界的,只用把剛剛的filter旋轉90°即可。對於其他的特徵,理論上只要我們經過精細的設計,總是可以設計出合適的filter的。
我們的CNN(convolutional neural network),主要就是通過一個個的filter,不斷地提取特徵,從區域性的特徵到總體的特徵,從而進行影像識別等等功能。
那麼問題來了,我們怎麼可能去設計這麼多各種各樣的filter呀?首先,我們都不一定清楚對於一大推圖片,我們需要識別哪些特徵,其次,就算知道了有哪些特徵,想真的去設計出對應的filter,恐怕也並非易事,要知道,特徵的數量可能是成千上萬的。
其實學過神經網路之後,我們就知道,這些filter,根本就不用我們去設計,每個filter中的各個數字,不就是引數嗎,我們可以通過大量的資料,來 讓機器自己去“學習”這些引數嘛。這,就是CNN的原理。
二、CNN的基本概念
1.padding 填白
從上面的引子中,我們可以知道,原影像在經過filter卷積之後,變小了,從(8,8)變成了(6,6)。假設我們再卷一次,那大小就變成了(4,4)了。
這樣有啥問題呢?
主要有兩個問題:
每次卷積,影像都縮小,這樣卷不了幾次就沒了;
相比於圖片中間的點,圖片邊緣的點在卷積中被計算的次數很少。這樣的話,邊緣的資訊就易於丟失。
為了解決這個問題,我們可以採用padding的方法。我們每次卷積前,先給圖片周圍都補一圈空白,讓卷積之後圖片跟原來一樣大,同時,原來的邊緣也被計算了更多次。
比如,我們把(8,8)的圖片給補成(10,10),那麼經過(3,3)的filter之後,就是(8,8),沒有變。
我們把上面這種“讓卷積之後的大小不變”的padding方式,稱為 “Same”方式,
把不經過任何填白的,稱為 “Valid”方式。這個是我們在使用一些框架的時候,需要設定的超引數。
2.stride 步長
前面我們所介紹的卷積,都是預設步長是1,但實際上,我們可以設定步長為其他的值。
比如,對於(8,8)的輸入,我們用(3,3)的filter,
如果stride=1,則輸出為(6,6);
如果stride=2,則輸出為(3,3);(這裡例子舉得不大好,除不斷就向下取整)
3.pooling 池化
這個pooling,是為了提取一定區域的主要特徵,並減少引數數量,防止模型過擬合。
比如下面的MaxPooling,採用了一個2×2的視窗,並取stride=2:
除了MaxPooling,還有AveragePooling,顧名思義就是取那個區域的平均值。
4.對多通道(channels)圖片的卷積
這個需要單獨提一下。彩色影像,一般都是RGB三個通道(channel)的,因此輸入資料的維度一般有三個:(長,寬,通道)。
比如一個28×28的RGB圖片,維度就是(28,28,3)。
前面的引子中,輸入圖片是2維的(8,8),filter是(3,3),輸出也是2維的(6,6)。
如果輸入圖片是三維的呢(即增多了一個channels),比如是(8,8,3),這個時候,我們的filter的維度就要變成(3,3,3)了,它的 最後一維要跟輸入的channel維度一致。
這個時候的卷積,是三個channel的所有元素對應相乘後求和,也就是之前是9個乘積的和,現在是27個乘積的和。因此,輸出的維度並不會變化。還是(6,6)。
但是,一般情況下,我們會 使用多了filters同時卷積,比如,如果我們同時使用4個filter的話,那麼 輸出的維度則會變為(6,6,4)。
我特地畫了下面這個圖,來展示上面的過程:
圖中的輸入影像是(8,8,3),filter有4個,大小均為(3,3,3),得到的輸出為(6,6,4)。
我覺得這個圖已經畫的很清晰了,而且給出了3和4這個兩個關鍵數字是怎麼來的,所以我就不囉嗦了(這個圖畫了我起碼40分鐘)。
其實,如果套用我們前面學過的神經網路的符號來看待CNN的話,
我們的輸入圖片就是X,shape=(8,8,3);
4個filters其實就是第一層神金網路的引數W1,,shape=(3,3,3,4),這個4是指有4個filters;
我們的輸出,就是Z1,shape=(6,6,4);
後面其實還應該有一個啟用函式,比如relu,經過啟用後,Z1變為A1,shape=(6,6,4);
所以,在前面的圖中,我加一個啟用函式,給對應的部分標上符號,就是這樣的:
三、CNN的結構組成
上面我們已經知道了卷積(convolution)、池化(pooling)以及填白(padding)是怎麼進行的,接下來我們就來看看CNN的整體結構,它包含了3種層(layer):
-
Convolutional layer(卷積層–CONV)
由濾波器filters和啟用函式構成。
一般要設定的超引數包括filters的數量、大小、步長,以及padding是“valid”還是“same”。當然,還包括選擇什麼啟用函式。 -
Pooling layer (池化層–POOL)
這裡裡面沒有引數需要我們學習,因為這裡裡面的引數都是我們設定好了,要麼是Maxpooling,要麼是Averagepooling。
需要指定的超引數,包括是Max還是average,視窗大小以及步長。
通常,我們使用的比較多的是Maxpooling,而且一般取大小為(2,2)步長為2的filter,這樣,經過pooling之後,輸入的長寬都會縮小2倍,channels不變。 -
Fully Connected layer(全連線層–FC)
這個前面沒有講,是因為這個就是我們最熟悉的傢伙,就是我們之前學的神經網路中的那種最普通的層,就是一排神經元。因為這一層是每一個單元都和前一層的每一個單元相連線,所以稱之為“全連線”。
這裡要指定的超引數,無非就是神經元的數量,以及啟用函式。
接下來,我們隨便看一個CNN的模樣,來獲取對CNN的一些感性認識:
上面這個CNN是我隨便拍腦門想的一個。它的結構可以用:
X–>CONV(relu)–>MAXPOOL–>CONV(relu)–>FC(relu)–>FC(softmax)–>Y
來表示。
這裡需要說明的是,在經過數次卷積和池化之後,我們 最後會先將多維的資料進行“扁平化”,也就是把 (height,width,channel)的資料壓縮成長度為 height × width × channel 的一維陣列,然後再與 FC層連線,這之後就跟普通的神經網路無異了。
可以從圖中看到,隨著網路的深入,我們的影像(嚴格來說中間的那些不能叫影像了,但是為了方便,還是這樣說吧)越來越小,但是channels卻越來越大了。在圖中的表示就是長方體面對我們的面積越來越小,但是長度卻越來越長了。
四、卷積神經網路 VS. 傳統神經網路
其實現在回過頭來看,CNN跟我們之前學習的神經網路,也沒有很大的差別。
傳統的神經網路,其實就是多個FC層疊加起來。
CNN,無非就是把FC改成了CONV和POOL,就是把傳統的由一個個神經元組成的layer,變成了由filters組成的layer。
那麼,為什麼要這樣變?有什麼好處?
具體說來有兩點:
1.引數共享機制(parameters sharing)
我們對比一下傳統神經網路的層和由filters構成的CONV層:
假設我們的影像是8×8大小,也就是64個畫素,假設我們用一個有9個單元的全連線層:
那這一層我們需要多少個引數呢?需要 64×9 = 576個引數(先不考慮偏置項b)。因為每一個連結都需要一個權重w。
那我們看看 同樣有9個單元的filter是怎麼樣的:
其實不用看就知道,有幾個單元就幾個引數,所以總共就9個引數!
因為,對於不同的區域,我們都共享同一個filter,因此就共享這同一組引數。
這也是有道理的,通過前面的講解我們知道,filter是用來檢測特徵的,那一個特徵一般情況下很可能在不止一個地方出現,比如“豎直邊界”,就可能在一幅圖中多出出現,那麼 我們共享同一個filter不僅是合理的,而且是應該這麼做的。
由此可見,引數共享機制,讓我們的網路的引數數量大大地減少。這樣,我們可以用較少的引數,訓練出更加好的模型,典型的事半功倍,而且可以有效地 避免過擬合。
同樣,由於filter的引數共享,即使圖片進行了一定的平移操作,我們照樣可以識別出特徵,這叫做 “平移不變性”。因此,模型就更加穩健了。
2.連線的稀疏性(sparsity of connections)
由卷積的操作可知,輸出影像中的任何一個單元,只跟輸入影像的一部分有關係:
而傳統神經網路中,由於都是全連線,所以輸出的任何一個單元,都要受輸入的所有的單元的影響。這樣無形中會對影像的識別效果大打折扣。比較,每一個區域都有自己的專屬特徵,我們不希望它受到其他區域的影響。
正是由於上面這兩大優勢,使得CNN超越了傳統的NN,開啟了神經網路的新時代。
相關文章
- 卷積神經網路卷積神經網路
- 卷積神經網路-AlexNet卷積神經網路
- 5.2.1 卷積神經網路卷積神經網路
- 卷積神經網路CNN卷積神經網路CNN
- 卷積神經網路概述卷積神經網路
- 解密卷積神經網路!解密卷積神經網路
- 卷積神經網路-1卷積神經網路
- 卷積神經網路-2卷積神經網路
- 卷積神經網路-3卷積神經網路
- 卷積神經網路四種卷積型別卷積神經網路型別
- 全卷積神經網路FCN卷積神經網路
- 深度剖析卷積神經網路卷積神經網路
- 卷積神經網路鼻祖LeNet網路分析卷積神經網路
- 何為神經網路卷積層?神經網路卷積
- 卷積神經網路(CNN)詳解卷積神經網路CNN
- CNN神經網路之卷積操作CNN神經網路卷積
- 卷積神經網路 part2卷積神經網路
- 14 卷積神經網路(進階)卷積神經網路
- Tensorflow-卷積神經網路CNN卷積神經網路CNN
- 一文看懂神經網路工作原理神經網路
- 【深度學習篇】--神經網路中的卷積神經網路深度學習神經網路卷積
- 吳恩達《卷積神經網路》課程筆記(1)– 卷積神經網路基礎吳恩達卷積神經網路筆記
- 一文看懂卷積神經網路-CNN(基本原理+獨特價值+實際應用)卷積神經網路CNN
- 卷積神經網路-啟用函式卷積神經網路函式
- 深度學習三:卷積神經網路深度學習卷積神經網路
- 卷積神經網路:Convolutional Neural Networks(CNN)卷積神經網路CNN
- 卷積神經網路(Convolutional Neural Network,CNN)卷積神經網路CNN
- 直白介紹卷積神經網路(CNN)卷積神經網路CNN
- 卷積神經網路—基本部件(2)卷積神經網路
- 卷積神經網路中的Winograd快速卷積演算法卷積神經網路演算法
- 經典卷積神經網路LeNet&AlexNet&VGG卷積神經網路
- 卷積神經網路學習筆記——Siamese networks(孿生神經網路)卷積神經網路筆記
- 神經網路之卷積篇:詳解卷積步長(Strided convolutions)神經網路卷積IDE
- (四)卷積神經網路 -- 8 網路中的網路(NiN)卷積神經網路
- 神經網路之卷積篇:詳解單層卷積網路(One layer of a convolutional network)神經網路卷積
- 深度學習——LeNet卷積神經網路初探深度學習卷積神經網路
- PyTorch入門-殘差卷積神經網路PyTorch卷積神經網路
- 卷積神經網路數學原理解析卷積神經網路