1. 程式人生 > >CNN(Convolutional Neural Network)

CNN(Convolutional Neural Network)

過去 融合 geo 全局 圍棋 池化層 構造 圖片分類 動態

CNN(Convolutional Neural Network)

卷積神經網絡(簡稱CNN)最早可以追溯到20世紀60年代,Hubel等人通過對貓視覺皮層細胞的研究表明,大腦對外界獲取的信息由多層的感受野(Receptive Field)激發完成的。在感受野的基礎上,1980年Fukushima提出了一個理論模型Neocognitron是感受野在人工神經網絡領域的首次應用。1998年,Lecun等人提出的LeNet-5模型在手寫字符識別上取得了成功,引起了學術界對卷積神經網絡的關註。2012年,Krizhevsky 等人提出的AlexNet模型在ImageNet圖像分類競賽中取得第一名的成績,其模型準確度領先第二名11%。在AlexNet之後,VGG(Visual Geometry Group)、GoogLeNet、ResNet也相繼被提出。

ANN簡化依據

我們也可以用ANN進行圖片分類。但是,在將ANN用於圖片分類會導致模型參數過多。例如,訓練的圖片大小為100x100x3,第一層隱層的神經元數目為1000時,參數就達到3x107。因此,需要人們利用先驗知識來簡化ANN以達到減少模型的參數,而簡化後的結構就是CNN。

ANN的簡化依據:①對於一個神經元來說,並不需要連接圖片的全局區域,只需要連接局部區域的信息來檢測局部物體,如圖1-1所示。

技術分享圖片

圖1-1 整體區域與局部區域

②同一個物體可能會出現在不同圖片的不同區域。如有的鳥嘴位置在左上角,而在另一張圖片中間,如圖1-2所示

技術分享圖片

圖1-2 鳥嘴在不同的區域

③對圖片進行子采樣,不會對人對圖片內容的理解產生太大影響。可以把圖片的奇數行、偶數列的像素去掉,使圖片變為原圖片的1/4,但不影響我們理解圖片內容,如圖1-3所示。子采樣可以減小圖片大小繼而減少模型參數量。

技術分享圖片

圖1-3 圖片子采樣

CNN結構

卷積層(Convolution Layer)

卷積層主要進行卷積操作。我們先定義一個過濾器(也稱作卷積核),其實就是一個矩陣(如圖1-4所示)

技術分享圖片

圖1-4 過濾器

以圖1-4和1-5為例,卷積操作就如圖1-6所示。卷積操作就是過濾器跟過濾器覆蓋的圖片局部區域(如圖1-5的紅色區域)對應的每個像素先相乘後累加。假設過濾器上的每個像素值為fij,圖片上被覆蓋區域的像素為amn,那麽卷積操作就是技術分享圖片

技術分享圖片

圖1-5 image

技術分享圖片

圖1-6 卷積操作

在完成卷積後,會挪動過濾器再進行卷積操作,挪動的距離稱作步長(stride)。假定步長為1,則向右移動,如圖1-7所示。單個過濾器在圖片上完成卷積的動態過程如圖1-8所示

技術分享圖片

圖1-7 步長

技術分享圖片

圖1-8 完整的卷積操作

過濾器的卷積計算的作用在於如果有圖片的局部區域跟過濾器比較相似,在進行卷積後的輸出值會比較大,卷積後的值越大,就表明檢測到對應物體。過濾器的大小只覆蓋圖片的局部區域,就對應“ANN簡化依據①”;而在挪動過程中,過濾器是不變的,則可以檢測不同區域上相同的物體,對應的就是“ANN簡化依據②”。過濾器在挪動過程中對應的參數也就是不變的,因此也被稱作權值共享。

多過濾器卷積操作

對於一個輸入圖片,我們可以設置多個過濾器來進行卷積。例如,我們使用5個過濾器來進行卷積,就得到5個相同大小的特征圖。這些特征圖會從新組合成為高度為5的圖片,作為下一層卷積的輸入。所以,卷積之後只會得到一個圖片,圖片的深度就是過濾器的數量。

池化層(Pooling Layer)

卷積層在完成卷積操作後會得到一個矩陣,這個矩陣被稱作特征圖(Feature Map)。池化就是將特征圖分為若幹區域,每個區域用一個值來進行表示。如圖1-9,將特征圖分為4個2x2區域,每個區域用最大值來進行表示(當然也可以采用均值,最小值等其他操作)。

技術分享圖片

圖1-9 最大池化操作

池化層的作用就是縮小特征圖,得到一個更小的子圖來表征原圖。因此池化操作對應了“ANN簡化依據③”。

參數訓練過程

CNN的整個訓練過程跟ANN並沒有太大區別,都是利用BP來完成參數更新。但是,由於CNN中有增加權值共享這一特性,因此在更新的時候需要特別處理。如圖1-10所示,在進行前向傳播時,不同顏色的權重的值是一樣的。但是在進行BP更新參數時,由於輸入值不一樣,因此計算出來的梯度也是不一樣的。為了使所有不同顏色的權重值一樣,可以分別計算出相同顏色的每一個權重的梯度,再取平均值。最後,讓每一個權重更新同樣的值就可以。

技術分享圖片

圖1-10 權值共享

CNN各層的學習對象

CNN在圖像處理上確實取得了成功,但是由於CNN的內部過於復雜,人們往往將CNN看做一個黑盒子。因此,我們還是需要去探究,CNN到底學習到了什麽。

過濾器的檢測對象

如何知道各層的過濾器在檢測的對象?對於一個正常的流程,應該是我們輸入一張圖片,進行卷積後的輸出值越大,說明過濾器就是在檢測這個對象。因此,我們需要反推正常的流程。即在確定使輸出值越大的前提下,去生成輸入的圖片。

過濾器經過卷積後的矩陣(如圖1-10所示)的各個元素記作技術分享圖片,k表示第k個過濾器。評估函數為技術分享圖片,求解的目標是技術分享圖片,利用梯度上升就可以完成的求解。

技術分享圖片

圖1-10 特征圖

過濾器學習到的檢測對象,如圖1-11所示。每一個過濾器都會檢測不同的對象,有些是豎線,有些是橫線等。

技術分享圖片

圖1-11 過濾器的檢測對象

全連接層神經元的檢測對象

我們可以利用跟過濾器檢測對象同樣的方法,生成出全連接層神經元的檢測對象。如圖1-12所示。跟過濾器的檢測對象不一樣的是,全連接層的神經元輸出更像是全局對象,而不是檢測局部對象。

技術分享圖片

圖1-12 全連接層神經元的檢測對象

輸出層神經元的檢測對象

當我們考慮輸出層神經的檢測對象時,采用跟過濾器檢測對象相同的做法,得到的結果如圖1-13所示,顯然得到的結果非常糟糕,因為根本不知道生成的圖片是什麽。

技術分享圖片

圖1-13 輸出層神經元的檢測對象

但是,你把1-13中的8作為CNN的輸入,輸出的結果會表示該圖片是8。因此,深度神經網絡似乎也不是那麽智能,很容易被欺騙。為了讓輸出層神經元的檢測對象看過去更像是一個數字,需要對評估函數做一些修改。對於數字而言,數字線條占總圖片大小的區域並不是很多。因此,我們需要讓生成的x*盡可能小。最終的評估函數為

技術分享圖片

跟原先的評估函數相比,其實就是多了L1正則化這一項。為麽是評估函數值越大,L1就需要越小越好。新的評估函數會得到稍微更好的結果,如圖1-14所示

技術分享圖片

圖1-14 L1後的輸出層神經元的檢測對象

CNN的實際應用

Deep Dream

Deep Dream就是你給一張圖片,然後機器會根據圖片內容,增加機器看到的物體(效果圖如圖1-15所示)。Deep Dream的大致思想跟檢測對象的做法是相似。

技術分享圖片

圖1-15 Deep Dream效果圖

Deep Dream的做法流程如圖1-16所示,給定一張圖片,獲得圖片的輸出向量。對於輸出向量,其中令正值越大,負值越小。這個做法就是要誇張化CNN所檢測的對象。最後利用修改後的向量作為目標,來反向重新調整圖片。

技術分享圖片

圖1-16 Deep Dream大致流程

Deep Style

Deep Style是給定兩張圖片,一張是偏內容,一張是偏風格。然後,將兩種圖片進行“融合”,效果如圖1-17所示

技術分享圖片

圖1-17 Deep Style效果圖

Deep Style的大致思想如圖1-18所示,一個CNN提取圖片的內容;一個CNN提取圖片的風格,圖片的風格主要體現在過濾器與過濾器輸出值之間的關聯性。則最終要構造的圖片應該能使輸出跟左邊的內容很相似,且過濾器輸出值之間的關聯性跟右邊的很相似。

技術分享圖片

圖1-18 Deep Style思想

Play Go

將CNN用在下圍棋的話,則輸入是當前棋盤就是,輸出就是下一子的位置。對於整個棋盤,我們可以用(1,-1,0)代表(黑子,白子,無子)。而CNN之後以可以用來下圍棋,原因在於將圍棋的一些特性跟“ANN簡化依據”相似。在圍棋上,有時候並不需要全局的信息,而且這種局部信息可能會在棋盤的不同位置。但是,圍棋不像圖片,不能進行子采樣。因此,將CNN應用於圍棋時,應該去掉池化層。

技術分享圖片

圖1-19 圍棋

參考資料

[1]機器學習-李宏毅

CNN(Convolutional Neural Network)