- 深度學習經典案例解析:基于MATLAB
- 趙小川
- 1472字
- 2021-10-27 15:43:52
2.1 CNN的核心——“卷積”
本案例主要介紹卷積神經網絡(Convolutional Neural Networks,CNN)。在此之前,需要先對“二維卷積”(以下簡稱“卷積”)進行深入了解,它是研究卷積神經網絡的前提和基礎。
從系統工程的角度看,卷積是為研究系統對輸入信號的響應而提出的,卷積有很多種,本節著重介紹二維滑動卷積。
滑動卷積涉及三個矩陣:第一個矩陣通常尺寸較大且固定不動,本書稱之為“輸入矩陣”(或“待處理矩陣”);第二個矩陣尺寸較小,在輸入矩陣上從左到右、從上到下進行滑動,本書稱之為“卷積核”;卷積核在輸入矩陣上面滑動的過程中,將對應的兩個小矩陣的相應元素相乘并求和,結果依次作為第三個矩陣元素,本書稱該矩陣為“特征矩陣”。上述三個矩陣及卷積運算符如圖2-1所示。
下面,詳細地看一下滑動卷積的運算過程。將圖2-1中所示的兩個矩陣進行卷積運算。
步驟1:將陰影部分的4個元素與卷積核對應位置的元素相乘后,再相加,作為特征矩陣的第1個元素,如圖2-2所示。

圖2-1 輸入矩陣、卷積核、特征矩陣及卷積運算符

圖2-2 滑動卷積運算步驟1
計算過程如下。
(1×1) +(3×0) +(2×0) +(9×1) =10
步驟2:在步驟1的基礎上,向右滑動1個單位,將陰影部分的4個元素與卷積核對應位置的元素相乘后,再相加,作為特征矩陣的第2個元素,如圖2-3所示。

圖2-3 滑動卷積運算步驟2
步驟3:在步驟2的基礎上,向右滑動1個單位,將陰影部分的4個元素與卷積核對應位置的元素相乘后,再相加,作為特征矩陣的第3個元素,如圖2-4所示。

圖2-4 滑動卷積運算步驟3
步驟4:一旦完成第一行的運算之后,上述運算過程就從下一行開始從左到右繼續進行,如圖2-5所示。

圖2-5 滑動卷積運算步驟4
步驟5:重復相同的步驟,直到全部完成(見圖2-6)。

圖2-6 滑動卷積運算的結果
在上述卷積運算的過程中,每次都是滑動1個像素。當然,也可以每次滑動兩個像素乃至多個像素。每次滑動的像素個數,本書稱之為步長(Stride)。
請讀者仔細觀察圖2-1所示的輸入矩陣與特征矩陣的元素的個數,不難發現,特征矩陣元素的個數少于輸入矩陣的元素個數(請讀者思考其中的原因)。如果需要得到與輸入矩陣元素個數相等的特征矩陣該如何處理呢?方法很簡單,需要對輸入矩陣的邊緣添加0元素,這個過程稱之為零填充(Zero Padding)。通過零填充,實現滑動卷積的過程如圖2-7所示。
在二維滑動卷積運算過程中,卷積核在滑動過程中始終都在輸入矩陣內部,所得到的特征矩陣的元素個數會比輸入矩陣元素個數少,在程序中稱這種滑動卷積方式為valid;如果采用零填充的方式,使特征矩陣元素的個數與輸入矩陣元素個數相同,在程序中稱這種滑動卷積方式為same。
如圖2-8所示,特征矩陣的(3,1)元素的值最大。那么,為什么該元素的值最大呢?通過觀察輸入矩陣和卷積核元素的特征可知:第(3,1)元素所對應的子矩陣與卷積核在形態上類似,二者都是對角矩陣,而且相同位置上的數值都較大。由此可見,子矩陣與卷積核在形態上類似時,卷積運算就會生成一個較大的值。

圖2-7 通過零填充實現滑動卷積的過程示意圖

圖2-8 特征矩陣中第(3,1)元素的計算過程
如圖2-9所示,輸入矩陣中第(3,1)元素的值為20,在輸入矩陣中的值是最大的,但通過卷積運算后結果為2,原因是子矩陣與卷積核的形態差異很大。

圖2-9 特征矩陣中第(2,1)元素的計算過程
如果要使特征矩陣中第(2,1)元素的值變大,可以將卷積核更換為和對應的子矩陣與卷積核在形態上類似的,如圖2-10所示。

圖2-10 更換卷積核后特征矩陣中第(2,1)元素的計算過程
通過上面的分析可知,對二維數字圖像進行卷積運算,可以判斷圖像的像素與卷積核的相似程度,相似程度越高,得到的響應值越大,因此可以通過滑動卷積運算來提取圖像的特征。
- Cocos2d Cross-Platform Game Development Cookbook(Second Edition)
- Game Programming Using Qt Beginner's Guide
- C語言程序設計基礎與實驗指導
- NumPy Essentials
- The Computer Vision Workshop
- 精通Linux(第2版)
- Node.js 12實戰
- Building Serverless Web Applications
- C++程序設計教程
- Akka入門與實踐
- Mastering PowerCLI
- Office VBA開發經典:中級進階卷
- 利用Python駕馭Stable Diffusion:原理解析、擴展開發與高級應用(智能系統與技術叢書)
- 前端Serverless:面向全棧的無服務器架構實戰
- Qt編程快速入門