天天看點

卷積神經網絡及其在圖像進行中的應用

作者:AI喬治
卷積神經網絡及其在圖像進行中的應用

一,前言

卷積神經網絡(Constitutional Neural Networks, CNN)是在多層神經網絡的基礎上發展起來的針對圖像分類和識别而特别設計的一種深度學習方法。先回顧一下多層神經網絡:

卷積神經網絡及其在圖像進行中的應用

多層神經網絡包括一個輸入層和一個輸出層,中間有多個隐藏層。每一層有若幹個神經元,相鄰的兩層之間的後一層的每一個神經元都分别與前一層的每一個神經元連接配接。在一般的識别問題中,輸入層代表特征向量,輸入層的每一個神經元代表一個特征值。

在圖像識别問題中,輸入層的每一個神經元可能代表一個像素的灰階值。但這種神經網絡用于圖像識别有幾個問題,一是沒有考慮圖像的空間結構,識别性能會受到限制;二是每相鄰兩層的神經元都是全相連,參數太多,訓練速度受到限制。

而卷積神經網絡就可以解決這些問題。卷積神經網絡使用了針對圖像識别的特殊結構,可以快速訓練。因為速度快,使得采用多層神經網絡變得容易,而多層結構在識别準确率上又很大優勢。

二,卷積神經網絡的結構

卷積神經網絡有三個基本概念:局部感覺域(local receptive fields),共享權重(shared weights)和池化(pooling)。

局部感覺域: 在上圖中的神經網絡中輸入層是用一列的神經元來表示的,在CNN中,不妨将輸入層當做二維矩陣排列的神經元。

與正常神經網絡一樣,輸入層的神經元需要和隐藏層的神經元連接配接。但是這裡不是将每一個輸入神經元都與每一個隐藏神經元連接配接,而是僅僅在一個圖像的局部區域建立連接配接。以大小為28X28的圖像為例,假如第一個隐藏層的神經元與輸入層的一個5X5的區域連接配接,如下圖所示:

卷積神經網絡及其在圖像進行中的應用

這個5X5的區域就叫做局部感覺域。該局部感覺域的25個神經元與第一個隐藏層的同一個神經元連接配接,每個連接配接上有一個權重參數,是以局部感覺域共有5X5個權重。如果将局部感覺域沿着從左往右,從上往下的順序滑動,就會得對應隐藏層中不同的神經元,如下圖分别展示了第一個隐藏層的前兩個神經元與輸入層的連接配接情況。

卷積神經網絡及其在圖像進行中的應用
卷積神經網絡及其在圖像進行中的應用

如果輸入層是尺寸為28X28的圖像,局部感覺域大小為5X5,那麼得到的第一個隐藏層的大小是24X24。

共享權重: 上面得到的第一隐藏層中的24X24個神經元都使用同樣的5X5個權重。第個隐藏層中第個神經元的輸出為:

這裡是神經元的激勵函數(可以是sigmoid函數、thanh函數或者rectified linear unit函數等)。是該感覺域連接配接的共享偏差。是個5X5共享權重矩陣。是以這裡有26個參數。 代表在輸入層的處的輸入激勵。

這就意味着第一個隐藏層中的所有神經元都檢測在圖像的不同位置處的同一個特征。是以也将從輸入層到隐藏層的這種映射稱為特征映射。該特征映射的權重稱為共享權重,其偏差稱為共享偏差。

為了做圖像識别,通常需要不止一個的特征映射,是以一個完整的卷積層包含若幹個不同的特征映射。下圖中是個三個特征映射的例子。

卷積神經網絡及其在圖像進行中的應用

在實際應用中CNN可能使用更多的甚至幾十個特征映射。以MNIST手寫數字識别為例,學習到的一些特征如下:

卷積神經網絡及其在圖像進行中的應用

這20幅圖像分别對應20個不同的特征映射(或稱作filters, kernels)。每一個特征映射由5X5的圖像表示,代表了局部感覺域中的5X5個權重。亮的像素點代表小的權重,與之對應的圖像中的像素産生的影響要小一些。暗的像素點代表的大的權重,也意味着對應的圖像中的像素的影響要大一些。可以看出這些特征映射反應了某些特殊的空間結構,是以CNN學習到了一些與空間結構有關的資訊用于識别。

池化層(pooling layers) 池化層通常緊随卷積層之後使用,其作用是簡化卷積層的輸出。例如,池化層中的每一個神經元可能将前一層的一個2X2區域内的神經元求和。而另一個經常使用的max-pooling,該池化單元簡單地将一個2X2的輸入域中的最大激勵輸出,如下圖所示:

卷積神經網絡及其在圖像進行中的應用

如果卷積層的輸出包含24X24個神經元,那麼在池化後可得到12X12個神經元。每一個特征映射後分别有一個池化處理,前面所述的卷積層池化後的結構為:

卷積神經網絡及其在圖像進行中的應用

Max-pooling并不是唯一的池化方法,另一種池化方法是,該方法是将卷積層2X2區域中的神經元的輸出求平方和的平方根。盡管細節與Max-pooling不一樣,但其效果也是簡化卷積層輸出的資訊。

将上述結構連接配接在一起,再加上一個輸出層,得到一個完整的卷積神經網絡。在手寫數字識别的例子中輸出層有十個神經元,分别對應0,1, … ,9的輸出。

卷積神經網絡及其在圖像進行中的應用

網絡中的最後一層是一個全連接配接層,即該層的每個神經元都與最後一個Max-pooling層的每個神經元連接配接。

這個結構這是一個特殊的例子,實際CNN中也可在卷積層和池化層之後可再加上一個或多個全連接配接層。

三,卷積神經網絡的應用

3.1 手寫數字識别

Michael Nielsen提供了一個關于深度學習和CNN的線上電子書,并且提供了手寫數字識别的例子程式,可以在GitHub上下載下傳到。該程式使用Python和Numpy, 可以很友善地設計不同結構的CNN用于手寫數字識别,并且使用了一個叫做Theano的機器學習庫來實作後向傳播算法和随機梯度下降法,以求解CNN的各個參數。Theano可以在GPU上運作,是以可大大縮短訓練過程所需要的時間。CNN的代碼在network3.py檔案中。

作為一個開始的例子,可以試着建立一個僅包含一個隐藏層的神經網絡,代碼如下:

>>> import network3
>>> from network3 import Network
>>> from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer
>>> training_data, validation_data, test_data = network3.load_data_shared()
>>> mini_batch_size = 10
>>> net = Network([
FullyConnectedLayer(n_in=784, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data)           

該網絡有784個輸入神經元,隐藏層有100個神經元,輸出層有10個神經元。在測試資料上達到了97.80%的準确率。

如果使用卷積神經網絡會不會比它效果好呢?可以試一下包含一個卷積層,一個池化層,和一個額外全連接配接層的結構,如下圖

卷積神經網絡及其在圖像進行中的應用

在這個結構中,這樣了解:卷積層和池化層學習輸入圖像中的局部空間結構,而後面的全連接配接層的作用是在一個更加抽象的層次上學習,包含了整個圖像中的更多的全局的資訊。

>>> net = Network([
ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),
filter_shape=(20, 1, 5, 5),
poolsize=(2, 2)),
FullyConnectedLayer(n_in=20*12*12, n_out=100),
SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
>>> net.SGD(training_data, 60, mini_batch_size, 0.1,
validation_data, test_data)           

這種CNN的結構達到的識别準确率為98.78%。如果想進一步提高準确率,還可以從以下幾方面考慮:

再添加一個或多個卷積-池化層

再添加一個或多個全連接配接層

使用别的激勵函數替代sigmoid函數。比如Rectifed Linear Units函數: Rectified Linear Units函數相比于sigmoid函數的優勢主要是使訓練過程更加快速。

使用更多的訓練資料。Deep Learning因為參數多而需要大量的訓練資料,如果訓練資料少可能無法訓練出有效的神經網絡。通常可以通過一些算法在已有的訓練資料的基礎上産生大量的相似的資料用于訓練。例如可以将每一個圖像平移一個像素,向上平移,向下平移,向左平移和向右平移都可以。

使用若幹個網絡的組合。建立若幹個相同結構的神經網絡,參數随機初始化,訓練以後測試時通過他們的輸出做一個投票以決定最佳的分類。其實這種Ensemble的方法并不是神經網絡特有,其他的機器學習算法也用這種方法以提高算法的魯棒性,比如Random Forests。

3.2 ImageNet圖像分類

Alex Krizhevsky等人2012年的文章“ImageNet classification with deep convolutional neural networks”對ImageNet的一個子資料集進行了分類。ImageNet一共包含1500萬張有标記的高分辨率圖像,包含22,000個種類。這些圖像是從網絡上搜集的并且由人工進行标記。從2010年開始,有一個ImageNet的圖像識别競賽叫做ILSVRC(ImageNet Large-Scale Visual Recognition Challenge)。 ILSVRC使用了ImageNet中的1000種圖像,每一種大約包含1000個圖像。總共有120萬張訓練圖像,5萬張驗證圖像(validation images)和15萬張測試圖像(testing images)。該文章的方法達到了15.3%的錯誤率,而第二好的方法錯誤率是26.2%。

卷積神經網絡及其在圖像進行中的應用

這篇文章中使用了7個隐藏層,前5個是卷積層(有些使用了max-pooling),後2個是全連接配接層。輸出層是有1000個單元的softmax層,分别對應1000個圖像類别。

該CNN使用了GPU進行計算,但由于單個GPU的容量限制,需要使用2個GPU (GTX 580,分别有3GB顯存)才能完成訓練。

該文章中為了防止過度拟合,采用了兩個方法。一是人工生成更多的訓練圖像。比如将已有的訓練圖像進行平移或者水準翻轉,根據主成分分析改變其RGB通道的值等。通過這種方法是訓練資料擴大了2048倍。二是采用Dropout技術。Dropout将隐藏層中随機選取的一半的神經元的輸出設定為0。通過這種方法可以加快訓練速度,也可以使結果更穩定。

卷積神經網絡及其在圖像進行中的應用

輸入圖像的大小是224X224X3,感覺域的大小是11X11X3。第一層中訓練得到的96個卷積核如上圖所示。前48個是在第一個GPU上學習到的,後48個是在第二個GPU上學習到的。

3.3 醫學圖像分割

Adhish Prasoon等人在2013年的文章“Deep feature learning for knee cartilage segmentation using a triplanar convolutional neural network”中,用CNN來做MRI中膝關節軟骨的分割。傳統的CNN是二維的,如果直接擴充到三維則需要更多的參數,網絡更複雜,需要更長的訓練時間和更多的訓練資料。而單純使用二維資料則沒有利用到三維特征,可能導緻準确率下降。為此Adhish采用了一個折中方案:使用,和三個2D平面的CNN并把它們結合起來。

卷積神經網絡及其在圖像進行中的應用

三個2D CNN分别負責對,和平面的處理,它們的輸出通過一個softmax層連接配接在一起,産生最終的輸出。該文章中采用了25個病人的圖像作為訓練資料,每個三維圖像中選取4800個體素,一共得到12萬個訓練體素。相比于傳統的從三維圖像中人工提取特征的分割方法,該方法在精度上有明顯的提高,并且縮短了訓練時間。

3.4 谷歌圍棋AlphaGo戰勝人類

谷歌旗下DeepMind團隊使用深度卷積神經網絡在電腦圍棋上取得了重大突破。早期,IBM的深藍超級計算機通過強大的計算能力使用窮舉法戰勝了人類專業象棋選手,但那不算“智能”。

圍棋上的計算複雜度遠超象棋,即使通過最強大的計算機也無法窮舉所有的可能的走法。計算圍棋是個極其複雜的問題,比國際象棋要困難得多。圍棋最大有3^361 種局面,大緻的體量是10^170,而已經觀測到的宇宙中,原子的數量才10^80。國際象棋最大隻有2^155種局面,稱為香農數,大緻是10^47。

DeepMind所研究的AlphaGo使用了卷積神經網絡來學習人類下棋的方法,最終取得了突破。AlphaGo在沒有任何讓子的情況下以5:0完勝歐洲冠軍,職業圍棋二段樊麾。研究者也讓AlphaGo和其他的圍棋AI進行了較量,在總計495局中隻輸了一局,勝率是99.8%。它甚至嘗試了讓4子對陣Crazy Stone,Zen和Pachi三個先進的AI,勝率分别是77%,86%和99%。可見AlphaGo有多強大。

在谷歌團隊的論文中,提到“我們用19X19的圖像來傳遞棋盤位置”,來“訓練”兩種不同的深度神經網絡。“政策網絡”(policy network)和 “值網絡”(value network)。它們的任務在于合作“挑選”出那些比較有前途的棋步,抛棄明顯的差棋,進而将計算量控制在計算機可以完成的範圍裡,本質上和人類棋手所做的一樣。

其中,“值網絡”負責減少搜尋的深度——AI會一邊推算一邊判斷局面,局面明顯劣勢的時候,就直接抛棄某些路線,不用一條道算到黑;而“政策網絡”負責減少搜尋的寬度——面對眼前的一盤棋,有些棋步是明顯不該走的,比如不該随便送子給别人吃。利用蒙特卡洛拟合,将這些資訊放入一個機率函數,AI就不用給每一步以同樣的重視程度,而可以重點分析那些有戲的棋着。

卷積神經網絡及其在圖像進行中的應用

為幫助更多對人工智能感興趣的小夥伴們能夠有效的系統性的學習以及論文的研究,小編特意制作整理了一份人工智能學習資料給大家,整理了很久,非常全面。

大緻内容包括一些人工智能基礎入門視訊和文檔+AI常用架構實戰視訊、計算機視覺、機器學習、圖像識别、NLP、OpenCV、YOLO、pytorch、深度學習與神經網絡等學習資料、課件源碼、國内外知名精華資源、以及AI熱門論文等全套學習資料。

卷積神經網絡及其在圖像進行中的應用

需要以上這些文中提到的資料,請先關注作者頭條【AI喬治】,回複【666】,即可免費擷取~~~~

每一個專欄都是大家非常關心,和非常有價值的話題,如果我的文章對你有所幫助,還請幫忙點贊、好評、轉發一下,你的支援會激勵我輸出更高品質的文章,非常感謝!

卷積神經網絡及其在圖像進行中的應用