CNN入門算法AlexNet介紹(論文詳細解讀) - 台部落
文章推薦指數: 80 %
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
延伸文章資訊
- 1ImageNet Classification with Deep Convolutional Neural ...
- 2大話CNN經典模型:AlexNet | 程式前沿
AlexNet網路結構共有8層,前面5層是卷積層,後面3層是全連線層,最後一個全連線層的輸出傳遞給一個1000路的softmax層,對應1000個類標籤的分佈。 由於 ...
- 3AlexNet_百度百科
AlexNet是2012年ImageNet競賽冠軍獲得者Hinton和他的學生Alex Krizhevsky設計的。也是在那年之後,更多的更深的神經網絡被提出,比如優秀的vgg,GoogLeNet。
- 4卷積神經網絡CNN 經典模型— LeNet、AlexNet、VGG - Medium
本文要來介紹CNN 的經典模型LeNet、AlexNet、VGG、NiN,並使用Pytorch 實現。其中LeNet 使用MNIST 手寫數字圖像作為訓練集,而其餘的模型則是 ...
- 5[魔法陣系列] 王者誕生:AlexNet 之術式解析
AlexNet 的架構共八層,第一層到第五層是Convolutional Layers 做卷積操作(Convolution Operation)與池化(Pooling);第六層到第八層是Full...