CNN入門算法AlexNet介紹(論文詳細解讀) - 台部落

文章推薦指數: 80 %
投票人數:10人

AlexNet的論文中着重解釋了Tanh激活函數和ReLu激活函數的不同特點,解釋了多個GPU是如何加速訓練網絡的,也說明了防止過擬合的一些方法。

都是值得學習的很 ... 請輸入正確的登錄賬號或密碼 註冊 忘記密碼 首頁 未分類 正文 CNN入門算法AlexNet介紹(論文詳細解讀) 原創 带着小板凳学习 2019-07-0110:27 本文是深度學習經典算法解讀的一部分,原文發之:https://www.datalearner.com/blog/1051558603213207 來源論文:Krizhevsky,Alex,IlyaSutskever,andGeoffreyE.Hinton.“Imagenetclassificationwithdeepconvolutionalneuralnetworks.”Advancesinneuralinformationprocessingsystems.2012. 2012年發表的AlexNet可以算是開啓本輪深度學習浪潮的開山之作了。

由於AlexNet在ImageNetLSVRC-2012(LargeScaleVisualRecognitionCompetition)贏得第一名,並且錯誤率只有15.3%(第二名是26.2%),引起了巨大的反響。

相比較之前的深度學習網絡結構,AlexNet主要的變化在於激活函數採用了Relu、使用Dropout代替正則降低過擬合等。

本篇博客將根據其論文,詳細講述AlexNet的網絡結構及其特點。

AlexNet的論文中着重解釋了Tanh激活函數和ReLu激活函數的不同特點,解釋了多個GPU是如何加速訓練網絡的,也說明了防止過擬合的一些方法。

都是值得學習的很好的內容。

一、背景介紹 在數據量不大的情況下,目前的算法已經能很好地處理識別任務。

例如,在MINST的數字識別任務中,目前算法的錯誤率已經低於0.3%,接近人類的水平了。

但是現實世界中的對象有很大的可變性,識別這些對象需要更大的訓練數據。

由於LabelMe、ImageNet的發展,目前已經有數以百萬的標註圖像可以使用。

很大的數據集導致訓練異常困難。

而卷積神經網絡(ConvolutionalNeuralNetworks,CNN)可以通過改變其結構而控制其大小,並且CNN符合自然界的圖像識別的規律導致了其非常有效。

相比較同規模的前饋神經網絡,CNN的參數卻小很多,而性能並不會下降。

這篇論文的主要貢獻包括兩點:1)訓練了一個很大的CNN來處理大規模數據並取得了目前最好的成績。

2)公開了一個基於GPU優化的二維CNN。

二、AlexNet結構的特點 1.ReLu的非線性問題激活函數Tanh是屬於飽和非線性,使用梯度下降訓練Tanh這種激活函數會比非飽和非線性激活函數如ReLU要慢。

函數是否是飽和函數主要看定義域和值域的範圍。

非飽和函數的含義是指,當自變量趨於無窮大的時候,其值也趨向無窮大。

這個函數如果不是非飽和函數,那麼它就是飽和函數了。

例如Tanh函數的值域是[-1,1],顯然不符合非飽和函數的定義,因此它就是飽和函數。

而ReLU函數則是非飽和函數。

下圖就是ReLU激活函數的訓練速度和Tanh的對比,ReLU要比Tanh快6倍。

當然,作者也不是第一個考慮更換傳統的激活函數,也有人曾經使用|tanh(x)|來處理Caltech-101數據集,但是他們最主要的目的是防止過擬合。

而作者主要考慮的是加快訓練速度,這在大的網絡訓練中很重要。

2.在多個GPU上訓練 作者使用了兩個GPU並行計算。

當前的GPU可以很容易實現並行,因爲GPU之間可以互相直接讀取內存,而不需要通過主機內存實現。

在作者實現的並行方法中,他們將一半的kernels(或者是神經元)放到一顆GPU上,但是用了一個技巧,即GPU之間的通信僅僅在某些層上。

舉個例子,第3層的kernel從第2層直接讀取所有的kernel結果。

但是第4層僅僅從相同的GPU中讀取第3層的kernel。

但是,在交叉驗證的時候選擇連接的模式可能有點問題,但是這允許我們精確調整通信量以至於達到一個適合的計算量。

3.局部響應的正規化LocalResponseNormalization ReLU有個很好的特性是它不需要輸入正化來防止它變得飽和。

前面說過了,不飽和的函數在梯度下降求解時速度更快。

只要某些樣本上能對ReLU產生正值的輸入,那個神經元就可以學習(敲黑板,記住ReLU的形狀)。

然而,作者發現,遵從局部響應的正規化有助於泛化能力。

作者提出了一種正規化方法,效果很好,但是這個方法看起來稍微有點複雜,而且和GPU編程有關,這裏不詳細看了。

4.OverlappingPooling CNN的池化層在之前用的都是不重疊的,在這裏作者發現帶重疊的池化層效果更好。

重疊的意思就是步長小於kernel的長,這樣就產生重疊了。

作者觀察發現:訓練帶有重疊池化的模型要更加難以過擬合。

至於這個爲啥,並沒有很清晰的結論。

大家可以看下面的一個討論:https://www.quora.com/Why-do-training-models-with-overlapping-pooling-make-it-harder-to-overfit-CNNs-in-Krizhevsky-2012 三、AlexNet模型架構 AlexNet總共有8層網絡。

AlexNet針對的是ILSVRC2012的比賽圖像,共有1000個類別。

與LeNet-5不同的是,AlexNet輸入的圖像不再是灰度圖像,而是具有RGB三個通道的彩色圖片,且大小是256x256。

對於不符合要求的需要重新剪裁轉換。

AlexNet的每一層如下: Input:256x256的RGB三通道圖像。

因此輸入維度是training_numx256x256x3。

Layer1:卷積層,96個11x11大小的卷積核掃描,步長爲4。

使用ReLU激活函數。

採用maxpooling池化,3x3,步長爲2。

然後做了一次局部正規化。

Layer2:卷積層,256個5x5的卷積核,步長爲1,但是做了padding,padding長度爲2。

使用ReLU激活函數。

採用maxpooling池化,3x3,步長爲2。

然後做了一次局部正規化。

Layer3:卷積層,384個3x3的卷積核,步長爲1,使用ReLU激活函數。

做了padding,padding長度爲1。

Layer4:卷積層,384個3x3的卷積核,步長爲1,使用ReLU激活函數。

做了padding,padding長度爲1。

Layer5:卷積層,256個3x3的卷積核,步長爲1,使用ReLU激活函數。

做了padding,padding長度爲1。

採用maxpooling池化,3x3,步長爲2。

然後做了一次Dropout(rate=0.5)。

Layer6:全連接層,加上ReLU激活函數,4096個神經元。

然後做了一次Dropout(rate=0.5)。

Layer7:全連接層,加上ReLU激活函數,4096個神經元。

Layer8:全連接層,加上ReLU激活函數,1000個神經元。

這一層也就是輸出層了。

AlexNet總共有6230萬個參數(大約),一次前饋計算需要11億的計算。

這裏的卷積參數實際只有370萬,只佔6%左右,但是消耗了95的計算量。

這個發現也使得Alex發了另一篇論文來解決這個問題。

參考:https://medium.com/@smallfishbigsea/a-walk-through-of-alexnet-6cbd137a5637 四、防止過擬合 如前所述,AlexNet有六千多萬個參數,過擬合是很可能發生的事情。

爲了防止過擬合,Alex做了如下工作。

1.數據增強 數據增強是計算機視覺中最常用的防止過擬合的方法。

作者在這裏主要使用了兩種方法,一個是水平翻轉,第二個是更改RGB通道的密集度。

2.丟棄法Dropout Dropout就是隨機刪除隱藏層中的神經元,被刪除的神經元不會在本次迭代中傳遞值。

因此,每一次迭代都有一個不太一樣的網絡架構,但是他們都共享權重。

這種技術降低了神經元的co-adaptions的複雜性,因此某個神經元不能只依靠某些特定的神經元來計算,這強制整個網絡學習更加具有魯棒性的特徵。

在測試的時候不會使用Dropout。

但是會把結果乘以0.5,近似模仿這種行爲。

如前面所述,在第5層的卷幾層結束做了Dropout,在第6層的全連接層做了Dropout,所以這影響的是最開始的兩個全連接層。

最後一層輸出沒有收到影響。

Dropout大約使得收斂的迭代次數翻倍了。

這要記住。

五、AlexNet網絡特點及問題 作者使用了ReLU方法加快訓練速度,並且使用Dropout來防止過擬合,通過多GPU的訓練降低訓練時間,儘管這些都不是作者自己提出的技巧,但是,作者的工作引起來大家的廣泛關注,使得很多人開始利用GPU來訓練大型的CNN網絡。

當然,作者提出的局部響應正規化也在後來被證明沒啥效果(看VGG的論文)。

但不管如何,這篇論文引起了很多人對深度學習和GPU訓練的重視,也算是非常有影響的工作了。

六、代碼實現 PyTorch最簡單:https://github.com/pytorch/vision/blob/master/torchvision/models/alexnet.py 預訓練的模型:https://github.com/onnx/models/tree/master/bvlc_alexnet   發表評論 登录 所有評論 還沒有人評論,想成為第一個評論的人麼?請在上方評論欄輸入並且點擊發布. 相關文章 Qt編寫物聯網管理平臺30-用戶登錄退出 一、前言 一個用戶登錄界面,是一個完整的應用系統,尤其是客戶端系統必備的一個功能模塊,傳統的登錄處理一般都是和本地的用戶信息進行比對,而現代的登錄系統一般是發送請求到服務器進行驗證,無論何種方式,都是需要去用戶信息表找到對應的用戶信息,取出 飛揚青雲 2022-05-2314:40:44 SQLite3使用筆記(2)——插入 目錄1.論述2.總結 1.論述 如同上一篇文章SQLite3使用筆記(1)——查詢所述,使用SQLite進行查詢操作同樣有兩種方式。

對於比較簡單的表格插入,使用sqlite3_exec()接口就可以了: stringstrSql harlee44 2022-05-2314:40:04 SQLite3使用筆記(1)——查詢 目錄1.概述2.詳論2.1.打開/關閉數據庫2.2.數據查詢3.參考 1.概述 SQLite是一個嵌入式SQL數據庫引擎。

與大多數其他SQL數據庫不同,SQLite沒有單獨的服務器進程。

SQLite直接讀寫普通磁盤文件。

harlee44 2022-05-2314:40:04 遊戲大廳從基礎開始(3)——最吸引眼球的部分客戶端與服務器的連接 遊戲大廳從基礎開始(3) ——最吸引眼球的部分客戶端與服務器的連接   看了上篇隨筆的回覆發現大家都很關心如何實現連接。

  但是本節可能不會涉及到數據連接的具體實現。

 (補充:tcp實現封裝已經完成 請參考 http MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 遊戲大廳從基礎開始(4)-通過L2X用配置文件反射組裝程序(VBonly) 遊戲大廳從基礎開始(4)-通過L2X用配置文件反射組裝程序(VBonly) 很久沒更新了。

前一陣工作比較充實(就是比較勞累拉~),加上向老趙學習努力瘦身,精神愈發痛苦,難免就懶惰下來。

通用倒了,項目突然死亡,Onbench了一個月,越 MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 遊戲大廳從基礎開始(5)--繞回來細說聊天室(上)   距離上次寫大廳已經有幾個月。

中間工作繁忙,待學習的東西又很多,又有很多新產品的想法想實踐,一直把這個坑閒置着。

直到前兩天簡單的樹遍歷枚舉器-挑戰一個程序員到底能多懶裝配腦袋的幾個回帖給我帶來一些靈感,讓我又重新看看我聊天頻道的實現, MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 遊戲大廳從基礎開始(3.5)——最吸引眼球的部分客戶端與服務器的連接的實現 遊戲大廳從基礎開始(3.5) ——最吸引眼球的部分客戶端與服務器的連接的實現     可能要犯大忌諱 本次只有代碼 所以補充兩句   正在實現策略模式的constructor   所以最近沒有時間整理註釋   大家湊合看 隨 MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 關於silverlightdepencyobject簡單的clone 最近玩silverlight 3 需要把一個 plateprojectionclone   作爲sealed class  不大好clone 於是想了個別的辦法     Codeusing System;using System MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 遊戲大廳從基礎開始(6)--繞回來細說聊天室(中)之女僕編年史1 上一篇我們大致的瞭解了幾種聊天室的行爲模式 最簡單明瞭的推模式幾乎不需要任何多餘的語言來描述它的實現 這一篇我們看看如何實現拉模式更有效。

                 本圖清晰的表現了"拉"模式聊天室的行爲。

MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 簡單的樹遍歷枚舉器v0.2-挑戰一個程序員到底能多懶-添加廣度優先遍歷 前一陣在遞歸算法相關回貼的討論中和某lz抱怨現在的同志們連用自己的棧加循環模擬遞歸都不會做了。

如果自己實現遞歸棧 又怎麼會在線程棧中儲存過多無關信息?數據全部都在堆裏又怎會stackoverflow?當時就有想法自己實現一個,造福一 MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 X360吉他英雄4鼓套裝&1TB硬盤入手 期待晚上的表現 撲通撲通的心跳阿 畝哈哈哈哈 MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 一時技癢不用模擬第一印象的構造通過三個觀察得來的規律解決N^2個往返接力問題 問題原題 見銀河使者的隨筆 http://www.cnblogs.com/nokiaguy/archive/2009/07/24/1530139.html第一印象 我得到了和他一樣的解法,就是用斜切片,每一層的x-1和y+1 來控 MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 silverlight2客戶端的僞DataTableforEF 公司需要我做SilverLightrearch    發現silverlight數據綁定多少有點痛苦   objectdatasource 要等到 vs2010    於是自己寫了一個    用得到的自然會看懂   MSFT:waywa韋恩卑鄙 2022-05-2314:39:53 【Vue】如何寫一個表格列顯隱控制的組件? 需求 公司項目需要實現對錶格列的顯示隱藏進行配置,額外配置可自行添加,這裏只是說簡單的顯隱控制,複雜的只是在頁面裏面多寫而已,核心代碼是一樣的。

簡單的: 比較複雜的: 代碼實現 表格頁面.vue



請為這篇文章評分?