0002深度学习初体验-基于Tensorflow and Keras 实现卷积神经网络(CNN-AlexNET)实现CIFAR图像训练
0002深度學習初體驗-基于Tensorflow and Keras 實現卷積神經網絡(CNN-AlexNET)實現CIFAR圖像訓練
摘要
LeNet 是最早推動深度學習領域發展的卷積神經網絡之一。這項由 Yann LeCun等完成的開創性工作自1988年以來多次成功迭代之后被命名為LeNet 5,被應用于手寫體的識別。AlexNet 是 Alex等人在 2012 年發表的《ImageNet Classification with Deep Convolutional Neural Networks》論文中提出的,并奪得了 2012 年 ImageNet LSVRC 的冠軍,引起了很大的轟動。AlexNet 可以說是具有歷史意義的一個深層網絡結構,在此之前,深度學習已經沉寂了很長時間,自 2012 年 AlexNet 誕生之后,后面的 ImageNet 冠軍都是用卷積神經網絡(CNN)來做的,并且層次越來越深,使得CNN成為在圖像識別分類的核心算法模型,帶來了深度學習的大爆發。本文將詳細講解 AlexNet 模型及使用 Keras與Tensorflow 搭建AlexNet的過程,完成對CIFAR 中圖像的分類,準確率達到99.64%。
關鍵詞 卷積神經網絡;AlexNet;圖像分類;深度學習;CIFAR
AlexNet Image Recognition Based on Deep Convolution Neural Network
LeNet is one of the earliest convolutional neural networks to promote the development of deep learning. This pioneering work completed by Yann LeCun et al. has been successfully iterated since 1988, and then named LeNet 5, which has been applied to handwriting recognition. AlexNet was put forward by Alex et al. in the paper ImageNet Classification with Deep Voluntary Neural Networks published in 2012, and won the title of ImageNet LSVRC in 2012, which caused a great sensation. AlexNet can be said to be a deep network structure with historical significance. Before that, deep learning has been silent for a long time. Since AlexNet was born in 2012, the following ImageNet champions are all made by Convolutional Neural Network (CNN), and the level is getting deeper and deeper, which makes CNN become the core algorithm model in image recognition and classification, which brings a great explosion of deep learning. In this paper, the AlexNet model and the process of building AlexNet with Keras and Tensorflow will be explained in detail, and the classification of images in CIFAR will be completed, with an accuracy rate of 99.62%.
Key words CNN;AlexNet ;Image classification ;Deep learning;
CIFAR
1.引言
Artificial Intelligence,即人工智能。自1939年阿蘭?圖靈(Alan Turing)設計出第一臺機器—恩尼格瑪(Enigma)以來,機器智能的命題就一直延續到現在。1956年,在美國漢諾夫小鎮的達特茅斯學院來了很多像香農(Shanon)、明斯基(Minsky)等天才專家,他們嘗試著弄清楚如何讓機器像人類一樣思考,如何使用自然語言來交流,如何伸出手去抓取東西,他們想要解決人類現存的各種問題,這次會議被命名為“人工智能夏季研討班”,這也是“人工智能”這一名詞被首次提出,從那以后,人工智能的相關研究歷經沉浮。
[1] Alex Krizhevsky,Ilya Sutskever,Geoffrey E. Hinton. ImageNet classification with deep convolutional neural networks[J]. Communications of the ACM,2017,60(6).
雖然計算機技術已經取得了長足的進步,但是到目前為止,還沒有一臺電腦能產生“自我”的意識。在人類和大量現成數據的幫助下,電腦可以表現的十分強大,但是離開了這兩者,它甚至都不能分辨出圖片中是一只貓還是一條狗[2]。
AI許多早期的成功發生在相對樸素且形式化的環境中,而且不要求計算機具備很多關于世界的知識。例如,IBM的深藍(Deep Blue)國際象棋系統在1997年擊敗了世界冠軍卡斯帕洛夫Garry Kasparov 。依靠硬編碼的知識體系面臨著各種問題,AI系統需要具備自己獲取知識的能力,即從原始數據中提取模式的能力。這種能力被稱為機器學習。引入機器學習使計算機能夠解決涉及現實世界知識的問題,并能做出看似主觀的決策。
[2] Ian Goodfellow,Yoshua Bengio ,Aaron Courville. Deep learning [M]. MIT press, 2016.
近年來,深度學習技術在圖像處理、視頻音頻處理、語音識別等領域的發展速度迅猛,尤其是以卷積神經網絡CNN(Convolutional Neural Networks)為代表的深層結構前向反傳神經網絡[1]。對卷積神經網絡的主要研究始于上世紀80到90年代,Yann LeCun 等在1989年首次提出將反向傳播算法引入卷積神經網絡之中,并發明了權值共享、池化等技巧,擴大了卷積神經網絡適用范圍與算法性能。深度學習的概念最早由Hinton等人在2006年提出,基于深度置信網絡(DBN,Deep Belief Networks),提出非監督貪心逐層訓練算法,為解決深層結構相關的優化難題帶來希望,隨后提出多層自動編碼器深層結構[2]。此外LeCun等人提出的卷積神經網絡是第一個真正意義上的多層結構學習算法,它利用空間相對關系減少參數數目以提高訓練性能。Alex在2012年提出的AlexNet網絡結構模型引爆了神經網絡的應用熱潮,并贏得了圖像識別大賽的冠軍,使得CNN成為在圖像分類上的核心算法模型[1]。
在解決如何識別圖像中的物體之前,我們還要知道是什么導致了卷積神經網絡的發展?
1981年的諾貝爾醫學獎,頒發給了 David Hubel(出生于加拿大的美國神經生物學家) 和Torsten Wiesel。1962年,他們的發現對當代深度學習模型最大的影響就是基于記錄貓的單個神經元的活動。他們觀察了貓的腦內神經元如何響應投影在貓前面屏幕上精確位置的圖像,他們偉大的發現是提出了“感受野”的概念。1979年,日本學者Fukushima 在局部感受野的基礎上提出了神經認知機模型,該模型被認為是實現的第一個卷積神經網絡。1989年,LeCun等人首次使用了權值共享技術,設計了LeNet。1998年,LeCun等人又將卷積層和下采樣層相結合,設計卷積神經網絡的主要結構,形成了現代卷積神經網絡的雛形LeNet 5[2]。2012年,卷積神經網絡的發展取得了歷史性的突破,Alex等人采用修正線性單元(Rectified Linear Unit,RELU)作為激活函數,并在大規模圖像測評中遠超第二名并獲得冠軍,這是一次在人工智能歷史上的重要拐點。2016年3月在韓國打響的又一場世紀大戰,則在全球范圍內迅速引爆了人工智能的熱潮,隨著李世乭被使用深度學習算法的AlphaGo以4:1擊敗后,人工智能又一次進入了大眾的視野。
卷積神經網絡與其他機器學習方法不同的是引入了權值共享的機制。在處理圖像數據時,由于圖像的像素值以及使用全連接神經網絡,得到的權值參數以及偏置會非常多,這不但影響了網絡的處理速度,也使網絡的泛化能力降低。以往的BP(Back Propagation)神經網絡會由于神經元個數以及各種權值與偏置參數過多,導致訓練速度慢的問題[3]。
典型的深層網絡往往存在梯度消失和梯度爆炸的問題,也就是說,累積的反向傳播誤差信號在神經網絡的層數增加時出現指數衰減或爆炸的現象,從而導致數值計算快速收縮或越界。深度神經網絡正式發展于2006年,Hinton等人[2]發表了題為“A fast learning algorithm for deep belief nets”以及“Reducing the dimensionality of the data with neural networks”,在此之后,各種深度學習模型都相繼發展起來,包括深度置信網絡(DBN,Deep Belief Network)、循環神經網絡(RNN,Recurrent Neural Network)以及卷積神經網絡(CNN,Convolutional Neural Network)、長短時記憶網絡(LSTM,Long Short-Term Memory Network)、生成對抗網絡(GAN,Generative Adversarial Network)、殘差神經網絡(Residual Neural Network)以及圖神經網絡(GNN,Graph Neural Networks)等[4]。
2.基于卷積神經網絡的AlexNet網絡識別
2.1圖像信息
AlexNet的圖像數據均來自于由斯坦福大學的華裔科學家李飛飛(Fei-Fei Li)2010年正式組織并啟動的大規模視覺圖像識別賽(ImageNet Large Scale Visual Recognition Challenge , ILSVRC)的數據庫ImageNet,另外一個比較著名的華人科學家吳恩達(Andrew Ng)創立了人工智能在線教育平臺Coursera。該數據集包含 14,197,122張圖片和21,841個Synset索引。 Synset是WordNet層次結構中的一個節點,它又是一組同義詞集合[1]。
ImageNet數據集一直是評估圖像分類算法性能的基準。ImageNet是一個按照WordNet層次結構(目前只有名詞)組織的圖像數據庫,其中層次結構的每個節點都由成百上千個圖像來描述。目前,我們平均每個節點有500多個圖像。ImageNet數據集的意義:1.ImageNet擁有用于分類、定位和檢測任務評估的數據。2.與分類數據類似,定位任務有1000個類別。準確率是根據最高五項檢測結果計算出來的。 3.所有圖像中至少有一個邊框。對200個目標的檢測問題有470000個圖像,平均每個圖像有1.1個目標[2]。
由于ImageNet中的數據太過龐大,數據超過1TB,所需要的算力非常大,訓練時間非常長。所以我們使用對CIFAR進行測試,這個數據集是 Visual Dictionary(Teaching computers to recognize objects) 的子集,由Alex Krizhevsky、Vinod Nair和Geoffrey Hinton三個教授收集,主要來自Google和各類搜索引擎的圖片[5]。
與MNIST數據集的灰度圖片不同,CIFAR-10數據集由10類32x32的RGB彩色圖片組成,一共包含60000張圖片,每一類包含6000圖片。其中50000張圖片作為訓練集,10000張圖片作為測試集。
**
2.2Alex卷積神經網絡詳解
**
2012年,Alex使用卷積神經網絡AlexNet奪得冠軍,搭建了如下圖所示的網絡結構。
由圖2-4可以看出,AlexNet有6000萬個參數,65萬個神經元,包含輸入層、5個卷積層和3個全連接層。其中,有三個卷積層還做了最大池化操作。AlexNet各層的組織結構圖如下表2.1所示,其中conv表示卷積運算操作,ReLU(Rectified Linear Unit)表示線性修正單元,pool表示池化操作,norm表示局部響應歸一化,dropout表示丟失輸出操作,IP表示全連接,Softmax表示歸一化分類器,具體結構如下圖2-5所示[1]。
2.3卷積層
卷積(Convolution)是一種數學運算,它采用某種方式將一個函數“應用”到另一個函數,結果可以理解為兩個函數的“混合體”。事實證明,卷積非常擅長檢測圖像中的簡單結構,然后結合這些簡單特征來構造更復雜的特征。在卷積網絡中,會在一系列的層上發生此過程,每層對前一層的輸出執行一次卷積。卷積運算的目的是提取輸入的不同特征,第一層卷積層可能只能提取一些低級的特征如邊緣、線條和角等層級,更多層的網路能從低級特征中迭代提取更復雜的特征。
權值全局共享機制是卷積神經網絡的特點。圖像是一種二階或三階字節數組,二階數組包含寬度和高度2個維度,三階數組有3個維度,包括寬度、高度和通道,所以灰度圖是二階的,而 RGB圖是三階的(包含3個通道)。字節的值被簡單解釋為整數值,描述了必須在相應像素上使用的特定通道數量[6]。所以在處理計算機視覺時,可以將一個圖像想象為一個 2D 數字數組(對于RGB或RGBA圖像,可以將它們想象為3個或4個2D數字數組的相互重疊),計算過程如下圖2-6所示。
如果使用卷積核進行運算后,所得到的結果受到多個超參數因素影響:卷積核(kernel)或者叫過濾器(filter)的大小、步長(stride)以及Padding操作。對于CNN網絡,一般來說,假設輸入形狀是 NhNw,卷積核窗口形狀是 KhKw,那么輸出形狀將會是Nh-Kh+1Nw-Kw+1。所以卷積層的輸出形狀由輸入形狀和卷積核窗口形狀決定。卷積層還有兩個超參數,即填充和步長,它們可以對給定形狀的輸入和卷積核改變輸出形狀。
填充(padding)是指在輸入高和寬的兩側填充元素(通常是0),具體的操作如下式2-1所示。
一般來說,如果在高的兩側一共填充Ph行,在寬的兩側一共填充 Pw列,那么輸出形狀將會是Nh-Kh+Ph+1Nw-Kw+Pw+1。這種操作稱為Same,當沒有填充時,稱為Valid,Valid操作會丟棄圖像邊緣的所有剩余值,而且會使圖像越來越小,在更深層的網絡中不足以提取特征,這些特征叫做Feature Map。
另一個超參數是步長(stride),代表同一個卷積窗口從輸入數組的最左上方開始,按從左往右、從上往下的順序,依次在輸入數組上滑動。我們將每次滑動的行數和列數稱為步長,當stride = 1時如下圖2-7所示。
在神經網絡中,當輸入激勵達到一定強度,神經元就會被激活,產生輸出信號。模擬這一細胞激活過程的函數,就叫激活函數。卷積運算是線性操作,而神經網絡要擬合的是非線性的函數,所以我們使用激活函數來進行非線性擬合。在AlexNet之前,神經網絡(包括LeNet)一般都把激活函數選為Sigmoid或tanh。
Sigmoid函數是深度學習領域開始時使用頻率最高的activation function。它是便于求導的平滑函數,其導數為,這是優點。然而,Sigmoid有三大缺點:
1.容易出現梯度消失gradient vanishing;
2.函數輸出并不是零中心zero-centered;(雖然雙邊Sigmoid是零中心)
3.冪運算相對來講比較耗時。
tanh讀作Hyperbolic Tangent(雙曲正切函數),如下圖2-9所示,它雖然解決了zero-centered的輸出問題,然而,gradient vanishing的問題和冪運算的問題仍然存在。
為了解決這些問題,Alex提出了另一種新的激活函數—ReLU(Rectified Linear Unit,線性修正單元)。
ReLU函數在現如今比較常用,它有以下特點:
1.解決了gradient vanishing問題;在(0—+∞)區間
2.計算速度非常快,只需要判斷輸入是否大于0;
3.收斂速度遠快于sigmoid和tanh。
3.收斂速度遠快于sigmoid和tanh。
Sigmoid 的導數只有在 0 的附近時有較好的激活性,而在正負飽和區域的梯度趨向于0, 從而產生梯度彌散的現象,而ReLU在大于0的部分梯度為常數,所以不會有梯度彌散現象。ReLU的導數計算的更快。ReLU在負半區的導數為0, 所以神經元激活值為負時,梯度為0, 此神經元不參與訓練,具有稀疏性。ReLU是一種非飽和函數,在訓練時間上比飽和函數更快。梯度消失現象相對較弱,有助于訓練更深的網絡[8]。
池化操作是對數據進行計算的過程,主要包括最大池化、平均池化。傳統的池化窗口是沒有重疊的,不同窗口的池化過程分別獨立計算。如果設置 s<z(每次移動的步長小于池化的窗口長度),我們就獲得重疊池化。AlexNet首次使用了重疊池化(overlap pooling),允許池化窗口重疊。與不重疊的池化相比,重疊池化有助于緩解過擬合(overfitting),使AlexNet在ImageNet中top-1和top-5錯誤率分別降低了0.4%和0.3%[2]。池化操作圖如下圖2-11所示。
池化層也叫下采樣層(subsampled),它具有以下特點:
1.降維,縮減模型大小,提高計算速度;
2.降低過擬合概率,提升特征提取魯棒性;
3.對平移和旋轉不敏感;
局部歸一化(Local Response Normalization,簡稱LRN),為了改善卷積神經網絡的性能,AlexNet還對某些層進行了局部響應歸一化處理,在神經生物學有一個概念叫做“側抑制”(lateral inhibitio),指的是被激活的神經元抑制相鄰神經元。歸一化(normalization)的目的是“抑制”,局部歸一化就是借鑒了“側抑制”的思想來實現局部抑制,尤其當使用 ReLU 時這種“側抑制”很管用,因為 ReLU 的響應結果是無界的(可以非常大),所以需要歸一化。使用局部歸一化的方法有助于增加泛化能力,計算公式如式2-6所示。
其中,N是卷積面(或池化面)的總數,n是相鄰面的個數,k、α、β 是可調參數。當選用k = 2,n = 5,α = e-4 ,β = 0.75時,AlexNet利用局部響應歸一化的技巧,可以將在ImageNet中top-1和top-5錯誤率分別降低了1.4%和1.2%[7]。
2.4全連接層
全連接層(Full Connected )的輸入是一維向量,需要將Pooling 層的輸出向量壓平(Flatten)成一個一維的向量,然后輸入到全連接層中,最后送到Softmax層進行分類。卷積神經網絡為什么用卷積而不用全連接的原因之一就是:全連接計算量太大。全連接層就是一個線性特征映射的過程,將多維的特征輸入映射為二維的特征輸出,高維表示樣本批次,低維常常對應任務目標(例如分類就對應每一個類別的概率)[8]。全連接層主要對特征進行重新擬合,減少特征信息的丟失;輸出層主要準備做好最后目標結果的輸出,全連接層的結構如下圖2-12所示。
目前由于全連接層參數冗余(僅全連接層參數就可占整個網絡參數80%左右),近期一些性能優異的網絡模型如ResNet和GoogLeNet等均用全局平均池化(global average pooling,GAP)取代FC來融合學到的深度特征,最后仍用Softmax等損失函數作為網絡目標函數來指導學習過程。需要指出的是,用GAP替代FC的網絡通常有較好的預測性能[9]。
2.5減少過擬合
AlexNet約有6000萬個參數,遠遠多于LeNet的參數。為了減少過擬合,AlexNet還使用了數據擴充和Dropout丟失數據的訓練技巧。數據擴充(Data Augmentation)有兩種方法:一是圖像的平移和翻轉,二是基于PCA的RGB強度調整。數據擴充可以使AlexNet的top-1誤差率至少減少了1.0%。早期最常見的針對圖像數據減少過擬合的方法就是人工地增大數據集[10],AlexNet中使用了兩種增大數據量的方法:
在訓練神經網絡時,如果訓練樣本過少,一般就需要考慮采用某些正則化技巧來防止過擬合。Dropout(丟失輸出),是一種簡單有效的正則化技巧,其基本思想就是通過阻止特征檢測器的共同作用來提高神經網絡的泛化能力。
Dropout丟失輸出是指在神經網絡的訓練過程中隨機得讓網絡中的一些節點(包括輸入和隱含層節點)不工作。那些不工作的網絡節點可以暫時認為不是網絡結構的一部分。引入Dropout主要是為了防止過擬合。在神經網絡中Dropout通過修改神經網絡本身結構來實現,對于某一層的神經元,通過定義的概率將神經元置為0,這個神經元就不參與前向和后向傳播,就如同在網絡中被刪除了一樣,同時保持輸入層與輸出層神經元的個數不變,然后按照神經網絡的學習方法進行參數更新。在下一次迭代中,又重新隨機刪除一些神經元(置為0),直至訓練結束。
Dropout是AlexNet中一個很大的創新,現在神經網絡中的必備結構之一。Dropout也可以看成是一種模型組合,每次生成的網絡結構都不一樣,通過組合多個模型的方式能夠有效地減少過擬合,Dropout只需要兩倍的訓練時間即可實現模型組合(類似取平均)的效果,非常高效[11],具體操作入下圖2-14所示。
2.6使用雙GPU訓練
隨著數據集越來越大,機器學習對圖像處理的計算力需求逐步超越了CPU的性能水平,這導致圖形處理器(Graphics Processing Unit ,GPU)得到了迅猛的發展。與CPU不同,GPU是專門執行復雜的數學和和幾何計算而設計的。現在,GPU已經超越了3D圖形處理的局限,被廣泛用于浮點運算和并行運算,可以提供數十倍乃至上百倍的CPU的性能。早期的LeNet并沒有使用GPU,而AlexNet使用了兩個GPU來提升訓練速度,分別放置一半卷積核(或神經元),并限制在某些層之間的GPU通信,如下圖2-15所示。
因為AlexNet訓練時使用了兩塊GPU,因此這個結構圖中不少組件都被拆成了兩部分。現在我們GPU的顯存可以放下全部模型數據,因此只考慮一塊GPU的情況即可。
2.7塊歸一化(Batch Normalization)
塊歸一化(Batch Normalization),又稱為批量歸一化。對神經網絡的訓練過程進行塊歸一化,不僅可以提高網絡的訓練速度,還可以提高網絡的泛化能力。塊歸一化可以理解為把對輸入數據的歸一化擴展到對其它層的輸入數據進行歸一化,以減小內部數據分布偏移(internal covariate shift)的影響。經過塊歸一化后,一方面可以通過選擇比較大的初始學習率極大提升訓練速度,另一方面還可以不用太關心初始化方法和正則化技巧的選擇,從而減少對網絡訓練過程的人工干預[9]。
2.8參數初始化
AlexNet使用了mini-batch SGD,batch的大小為128,梯度下降的算法選擇了momentum,動量衰減參數設置為0.9,加入了L2正則化,或者說權重衰減參數為0.0005。論文中提到這么小的權重衰減參數幾乎可以說沒有正則化效果,但對模型的學習非常重要,這里的權重衰減不僅僅是一個正規化器,同時它減少了模型的訓練誤差[10]。對于所有層都使用了相等的學習率,這是在整個訓練過程中手動調整的。當驗證誤差率在當前學習率下不再降低時,就將學習率除以10[11]。學習率初始化為0.01,在訓練結束前共減小3次。Alex訓練該網絡時大致將這120萬張圖像的訓練集循環了90次,在兩個NVIDIA GTX 580 3GB GPU上花了五到六天。另外,在AlexNet中所有層的權重初始化為服從0均值,標準差為0.001的高斯分布,第2、4、5卷積層以及全連接層的偏置量初始化為1,這樣做的好處是它通過給ReLU函數一個正激勵從而加速早期學習的速度,其他層的偏置量初始化為0[12]。
3.基于AlexNet的CIFAR-10識別模型搭建
3.1環境準備
本次模型搭建使用的是Windows10操作系統,10代i7酷睿8核處理器,GTX 1650Ti 16G顯卡,Python 3.7.6語言環境,Anaconda 包管理系統,Spyder 編譯器,安裝了Tensorflow 2.0 深度學習開發框架,配合Keras 2.3.1搭建整個神經網絡。
3.2導入庫
在編程之前需要導入需要的庫和模塊。由于Keras已經被集成在Tensorflow中,我們直接導入Tensorflow下的keras模塊包。CIFAR數據集也被Keras收錄,就直接導入。數據集共有60000張圖片,我們將隨即取出50000張作為訓練集,10000張作為測試集。
3.3模型搭建
通過借鑒AlexNet網絡,我們搭建了模型如下圖3-1所示。
共有21622154個參數進行訓練,經過6個小時的訓練,模型就可以訓練好了。
4.結論
本文主要講解了AlexNet的模型結構與功能創新,并利用Tensorflow 搭建了Alex模型,在CIFAR數據集上進行了訓練,具體的模型保存在model中,在訓練集中的準確率達到了99.64%,loss減小到0.012;在測試集中的準確率達到了75.86%,loss減小到1.5897。使用TensorBoard對訓練過程進行可視化。
經過300次epoch的準確率
訓練集與測試集的準確率變化
訓練集與測試集的loss損失變化
學習率變化
AlexNet結構圖
參考文獻
[1]Alex Krizhevsky,Ilya Sutskever,Geoffrey E. Hinton. ImageNet classification with deep convolutional neural networks[J]. Communications of the ACM,2017,60(6).
[2]Ian Goodfellow,Yoshua Bengio ,Aaron Courville. Deep learning [M]. MIT press, 2016.
[3]LeCun, Yoshua Bengio, Boser, B., Denker, J.S., Henderson, D., Howard, R.E., Hubbard, W. and Jackel, L.D., 1989. Backpropagation applied to handwritten zip code recognition. Neural computation, 1(4), pp.541-551.
[4]Francois Chollet. Deep Learning With Python [M].MIT press, 2017.
總結
以上是生活随笔為你收集整理的0002深度学习初体验-基于Tensorflow and Keras 实现卷积神经网络(CNN-AlexNET)实现CIFAR图像训练的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5 实心圆点,html5使用ca
- 下一篇: 北京 php 外包,=== | php外