卷積神經網絡(簡稱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用於圖片分類會致使模型參數過多。例如,訓練的圖片大小爲100x100x3,第一層隱層的神經元數目爲1000時,參數就達到3x107。所以,須要人們利用先驗知識來簡化ANN以達到減小模型的參數,而簡化後的結構就是CNN。機器學習
ANN的簡化依據:①對於一個神經元來講,並不須要鏈接圖片的全局區域,只須要鏈接局部區域的信息來檢測局部物體,如圖1-1所示。ide
圖1-1 總體區域與局部區域函數
②同一個物體可能會出如今不一樣圖片的不一樣區域。若有的鳥嘴位置在左上角,而在另外一張圖片中間,如圖1-2所示學習
圖1-2 鳥嘴在不一樣的區域spa
③對圖片進行子採樣,不會對人對圖片內容的理解產生太大影響。能夠把圖片的奇數行、偶數列的像素去掉,使圖片變爲原圖片的1/4,但不影響咱們理解圖片內容,如圖1-3所示。子採樣能夠減少圖片大小繼而減小模型參數量。3d
圖1-3 圖片子採樣對象
卷積層主要進行卷積操做。咱們先定義一個過濾器(也稱做卷積核),其實就是一個矩陣(如圖1-4所示)blog
圖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的圖片,做爲下一層卷積的輸入。因此,卷積以後只會獲得一個圖片,圖片的深度就是過濾器的數量。
卷積層在完成卷積操做後會獲得一個矩陣,這個矩陣被稱做特徵圖(Feature Map)。池化就是將特徵圖分爲若干區域,每一個區域用一個值來進行表示。如圖1-9,將特徵圖分爲4個2x2區域,每一個區域用最大值來進行表示(固然也能夠採用均值,最小值等其餘操做)。
圖1-9 最大池化操做
池化層的做用就是縮小特徵圖,獲得一個更小的子圖來表徵原圖。所以池化操做對應了「ANN簡化依據③」。
CNN的整個訓練過程跟ANN並無太大區別,都是利用BP來完成參數更新。可是,因爲CNN中有增長權值共享這一特性,所以在更新的時候須要特別處理。如圖1-10所示,在進行前向傳播時,不一樣顏色的權重的值是同樣的。可是在進行BP更新參數時,因爲輸入值不同,所以計算出來的梯度也是不同的。爲了使全部不一樣顏色的權重值同樣,能夠分別計算出相同顏色的每個權重的梯度,再取平均值。最後,讓每個權重更新一樣的值就能夠。
圖1-10 權值共享
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後的輸出層神經元的檢測對象
Deep Dream就是你給一張圖片,而後機器會根據圖片內容,增長機器看到的物體(效果圖如圖1-15所示)。Deep Dream的大體思想跟檢測對象的作法是類似。
圖1-15 Deep Dream效果圖
Deep Dream的作法流程如圖1-16所示,給定一張圖片,得到圖片的輸出向量。對於輸出向量,其中令正值越大,負值越小。這個作法就是要誇張化CNN所檢測的對象。最後利用修改後的向量做爲目標,來反向從新調整圖片。
圖1-16 Deep Dream大體流程
Deep Style是給定兩張圖片,一張是偏內容,一張是偏風格。而後,將兩種圖片進行「融合」,效果如圖1-17所示
圖1-17 Deep Style效果圖
Deep Style的大體思想如圖1-18所示,一個CNN提取圖片的內容;一個CNN提取圖片的風格,圖片的風格主要體如今過濾器與過濾器輸出值之間的關聯性。則最終要構造的圖片應該能使輸出跟左邊的內容很類似,且過濾器輸出值之間的關聯性跟右邊的很類似。
圖1-18 Deep Style思想
將CNN用在下圍棋的話,則輸入是當前棋盤就是,輸出就是下一子的位置。對於整個棋盤,咱們能夠用(1,-1,0)表明(黑子,白子,無子)。而CNN以後以能夠用來下圍棋,緣由在於將圍棋的一些特性跟「ANN簡化依據」類似。在圍棋上,有時候並不須要全局的信息,並且這種局部信息可能會在棋盤的不一樣位置。可是,圍棋不像圖片,不能進行子採樣。所以,將CNN應用於圍棋時,應該去掉池化層。
圖1-19 圍棋