【Python教程】計算機視覺的基石——讀懂 CNN卷積神經網路
神經網路接受輸入影像/特徵向量,並通過一系列隱藏層轉換,然後使用非線性啟用函式。每個隱藏層也由一組神經元組成,其中每個神經元都與前一層中的所有神經元完全連線。神經網路的最後一層(即“輸出層”)也是全連線的,代表網路的最終輸出分類。
CNN神經網路
一般卷積神經網路有如下結構:
- •資料輸入層/ Input layer
- •卷積計算層/ CONV layer
- •ReLU激勵層 / ReLU layer
- •池化層 / Pooling layer
- •全連線層 / FC layer
當然卷積層,Relu激勵層與Pooling層可以多次使用
輸入層/ Input layer
該層要做的處理主要是對原始影像資料進行預處理,其中包括:
•去均值:把輸入資料各個維度都中心化為0,如下圖所示,其目的就是把樣本的中心拉回到座標系原點上。
•歸一化:幅度歸一化到同樣的範圍,如下所示,即減少各維度資料取值範圍的差異而帶來的干擾,比如,我們有兩個維度的特徵A和B,A範圍是0到10,而B範圍是0到10000,如果直接使用這兩個特徵是有問題的,好的做法就是歸一化,即A和B的資料都變為0到1的範圍。
•PCA/白化:用PCA降維;白化是對資料各個特徵軸上的幅度歸一化
卷積層
卷積層是卷積神經網路的核心構建塊。這層引數由一組K 個可學習過濾器(即“核心”)組成,其中每個過濾器都有寬度和高度,並且幾乎總是正方形。
對於 CNN 的輸入,深度是影像中的通道數(即,處理 RGB 影像時深度為 3,每個通道一個)。對於網路中更深的卷積,深度將是前一層應用的過濾器數量。
為了讓這個概念更清晰,讓我們考慮 CNN 的前向傳遞,我們在輸入體積的寬度和高度上對K 個濾波器中的每一個進行卷積。更簡單地說,我們可以想象我們的K 個核心中的每一個都在輸入區域上滑動,計算元素級乘法、求和,然後將輸出值儲存在二維啟用圖中。
左:在 CNN 的每個卷積層,有K 個核心。中間:K 個核心中的每一個都與輸入進行了卷積。右圖:每個核心產生一個 2D 輸出,稱為啟用圖。卷積過程可以參考下圖
在將所有K 個過濾器應用於輸入體積後,我們現在有K個二維啟用圖。然後我們沿著陣列的深度維度堆疊我們的K 個啟用圖,以形成最終的輸出體積。
獲得K個啟用圖後,將它們堆疊在一起,形成網路中下一層的輸入。
因此,輸出中的每一個都是一個神經元的輸出,它只“觀察”輸入的一小部分割槽域。通過這種方式,神經網路“學習”過濾器,當它們在輸入中的給定空間位置看到特定型別的特徵時啟用。在網路的較低層,當過濾器看到類似邊緣或類似角落的區域時,它們可能會啟用。
這裡有三個引數控制輸出體積的大小:depth、stride和zero-padding大小
depth
輸出影像的深度。每個過濾器都會生成一個啟用圖,在K個核心的卷積中,啟用圖的深度將為K,或者只是我們在當前層中學習的過濾器的數量。
stride
考慮我們將卷積操作描述為在大矩陣上“滑動”一個小矩陣,在每個座標處停止,計算元素乘法求和,然後儲存輸出。這個描述類似於一個滑動視窗,它從左到右、從上到下在影像上滑動。這裡我們有一個 5 × 5 的輸入影像和一個 3 × 3 的卷積核心。
使用S = 1,我們的核心從左到右和從上到下滑動,一次一個畫素,產生以下輸出(左圖)。若使用S = 2的步幅,我們一次跳過兩個畫素(沿x軸的兩個畫素和沿y軸的兩個畫素),將會輸出更少的資料量(右圖)
左: 1 × 1 步長的卷積輸出。右圖: 2 × 2 步長的卷積輸出
zero-padding
在應用卷積時,我們需要“填充”輸入影像的邊界以保留經過CNN卷積後的原始影像大小。使用zero-padding,我們可以沿著邊界“填充”我們的輸入影像,使得我們經過CNN後輸出體積大小與我們的輸入體積大小完全一樣。我們應用的填充量由引數P控制。
為了視覺化zero-padding,我們將 3 × 3 卷積核心應用於步長為S = 1的 5 × 5 輸入影像
從上圖中,我們可以看到卷積後的圖片尺寸為3*3,如果我們改為設定P = 1,我們可以用零填充我們的輸入圖片(右)以建立一個 7 × 7 的圖片尺寸,然後應用卷積操作,得到5*5的輸出圖片,這跟輸入圖片的尺寸大小完全一致。
•ReLU激勵層 / ReLU layer
左上角:階躍函式。右上角: Sigmoid 啟用函式。左中:雙曲正切。中右: ReLU 啟用(深度神經網路最常用的啟用函式)。左下: Leaky ReLU,允許負數的 ReLU 變體。右下: ELU,ReLU 的另一種變體,其效能通常優於 Leaky ReLU。
CNN採用的激勵函式一般為ReLU(The Rectified Linear Unit/修正線性單元),它的特點是收斂快,求梯度簡單,但較脆弱,影像如下。
在輸入圖片進行CNN卷積後,通常我們需要使用激勵函式對輸出的圖片資料進行激勵,一般神經網路最常見的是ReLU激勵函式,說白一點,此函式便是當小於0的資料全部替換成0,大於0的資料是y=x,直接是輸入的值
此層接受大小為W input ×H input ×D input的輸入圖片,然後應用給定的啟用函式。由於啟用函式以元素方式應用,啟用層的輸出始終與輸入維度相同,W input = W output,H input = H output,D input = D output。
啟用函式
池化層 / Pooling layer
有兩種方法可以減小輸入圖片的大小,CNN 以及pooling,常見的卷積神經網路的步驟為
輸入 = >CNN = > RELU = >pooling= >CNN = > RELU = >pooling = > FC
池化層夾在連續的卷積層中間, 用於壓縮資料和引數的量,減小過擬合。簡而言之,如果輸入是影像的話,那麼池化層的最主要作用就是壓縮影像。池化層用的方法有Max pooling 和 average pooling,而實際用得較多的是Max pooling。
通常我們使用 2 × 2的池大小,我們還將步幅設定為S = 1 或S = 2。下圖應用最大池化的示例,其中池大小為 2 × 2,步幅為S = 1。每 2 × 2 塊,我們只保留最大值,從而產生 3 × 3的輸出體積大小。
我們可以通過增加步幅來進一步減小輸出體積的大小——這裡我們將S = 2 應用於相同的輸入。對於輸入中的每個 2 × 2 塊,我們只保留最大值,然後以兩個畫素為步長,再次應用該操作,我們得到2*2的輸出圖片大小。
全連線層
深度神經網路的最後一層往往是全連線層+Softmax(分類網路),如下圖所示
全連線層將權重矩陣與輸入向量相乘再加上偏置,將n個(−∞,+∞)的實數對映為K個(−∞,+∞)的實數(分數);Softmax將K個(−∞,+∞)的實數對映為K個(0,1)的實數(概率),同時保證它們之和為1。具體如下:
其中,x為全連線層的輸入,Wn*K為權重,b為偏置,y^為Softmax輸出的概率,Softmax的計算方式如下:
dropout
Dropout 實際上是一種正則化形式,旨在通過提高測試準確性來幫助防止過度擬合,可能會以犧牲訓練準確性為代價。對於我們訓練集中的每個小批量,dropout 層以概率p隨機斷開網路架構中從前一層到下一層的輸入。
我們應用 dropout 的原因是通過在訓練時,改變網路架構來減少過擬合
如上圖:圖中黑色曲線是正常模型,綠色曲線就是overfitting模型。儘管綠色曲線很精確地區分了所有的訓練資料,但是並沒有描述資料的整體特徵,對新測試資料的適應性較差,且訓練模型太複雜,後期的訓練資料會很龐大。
假設有一個神經網路:
按照之前的方法,根據輸入X,先正向更新神經網路,得到輸出值,然後反向根據backpropagation演算法來更新權重和偏向。而Dropout不同的是,
1)在開始,隨機刪除掉隱藏層一半的神經元,如圖,虛線部分為開始時隨機刪除的神經元:
2)然後,在刪除後的剩下一半的神經元上正向和反向更新權重和偏差;
3)再恢復之前刪除的神經元,再重新隨機刪除一半的神經元,進行正向和反向更新w和b;
4)重複上述過程。
最後還是要推薦下我自己建的Python學習群:[856833272],群裡都是學Python的,如果你想學或者正在學習Python ,歡迎你加入,大家都是軟體開發黨,不定期分享乾貨,還有免費直播課程領取。包括我自己整理的一份2021最新的Python進階資料和零基礎教學,歡迎進階中和對Python感興趣的小夥伴加入!還可以掃碼加VX領取資料哦!
相關文章
- 卷積神經網路CNN卷積神經網路CNN
- CNN神經網路之卷積操作CNN神經網路卷積
- 卷積神經網路(CNN)詳解卷積神經網路CNN
- Tensorflow-卷積神經網路CNN卷積神經網路CNN
- 利用Python實現卷積神經網路的視覺化Python卷積神經網路視覺化
- 卷積神經網路十五問:CNN與生物視覺系統的研究探索卷積神經網路CNN視覺
- 卷積神經網路中的視覺化方法卷積神經網路視覺化
- 卷積神經網路:Convolutional Neural Networks(CNN)卷積神經網路CNN
- 卷積神經網路(Convolutional Neural Network,CNN)卷積神經網路CNN
- 直白介紹卷積神經網路(CNN)卷積神經網路CNN
- TensorFlow上實現卷積神經網路CNN卷積神經網路CNN
- Keras上實現卷積神經網路CNNKeras卷積神經網路CNN
- 卷積神經網路CNN-學習1卷積神經網路CNN
- 谷歌的googLeNet卷積神經網路為什麼在計算機視覺領域如此強大?谷歌Go卷積神經網路計算機視覺
- 卷積神經網路表徵視覺化研究綜述卷積神經網路視覺化
- 卷積神經網路(CNN)介紹與實踐卷積神經網路CNN
- “卷積神經網路(Convolutional Neural Network,CNN)”之問卷積神經網路CNN
- 【機器學習基礎】卷積神經網路(CNN)基礎機器學習卷積神經網路CNN
- 設計卷積神經網路CNN為什麼不是程式設計?卷積神經網路CNN程式設計
- Matlab程式設計之——卷積神經網路CNN程式碼解析Matlab程式設計卷積神經網路CNN
- 卷積神經網路卷積神經網路
- CNN-卷積神經網路簡單入門(2)CNN卷積神經網路
- 卷積神經網路中感受野的理解和計算卷積神經網路
- 卷積神經網路的引數量和計算量卷積神經網路
- 9 大主題卷積神經網路(CNN)的 PyTorch 實現卷積神經網路CNNPyTorch
- 卷積神經網路概述卷積神經網路
- 解密卷積神經網路!解密卷積神經網路
- 5.2.1 卷積神經網路卷積神經網路
- 卷積神經網路-AlexNet卷積神經網路
- 卷積神經網路-1卷積神經網路
- 卷積神經網路-2卷積神經網路
- 卷積神經網路-3卷積神經網路
- 卷積神經網路的原理及Python實現卷積神經網路Python
- 《卷積神經網路的Python實現》筆記卷積神經網路Python筆記
- 深度學習之卷積神經網路(Convolutional Neural Networks, CNN)(二)深度學習卷積神經網路CNN
- Pytorch_第十篇_卷積神經網路(CNN)概述PyTorch卷積神經網路CNN
- 【Python】keras卷積神經網路識別mnistPythonKeras卷積神經網路
- 機器學習從入門到放棄:卷積神經網路CNN(二)機器學習卷積神經網路CNN