【DL筆記7】他山之玉——窺探CNN經典模型

從【DL筆記1】到【DL筆記N】,是我學習深度學習一路上的點點滴滴的記錄,是從Coursera網課、各大博客、論文的學習以及自己的實踐中總結而來。從基本的概念、原理、公式,到用生動形象的例子去理解,到動手做實驗去感知,到著名案例的學習,到用所學來實現自己的小而有趣的想法......我相信,一路看下來,我們可以感受到深度學習的無窮的樂趣,並有興趣和激情繼續鑽研學習。 正所謂 Learning by teaching,寫下一篇篇筆記的同時,我也收穫了更多深刻的體會,希望大家可以和我一同進步,共同享受AI無窮的樂趣。


上一篇文章介紹了CNN的基礎知識以及它的優勢,今天這篇文章主要來看一看一些著名的卷積神經網絡的結構特點,以便我們對CNN有更加直觀地認識。

一、LeNet-5

論文:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

這個可以說是CNN的開山之作,由Yann LeCun在1998年提出,可以實現對手寫數字、字母的識別。結構如下:

圖中的 subsampling,即“亞採樣”,就是我們前面說的pooling,因爲pooling其實就是對原圖像進行採樣的一個過程。它總共7層,分別有2個CONV層,2個POOL層,3個FC層。當然,它的輸入規模很小,是32×32大小的單通道圖片。

我們可以用下面的式子,來表示上面的網絡結構:

Input(32×32)→CONV(6 filters)→AvgPOOL→CONV(16 filters)→AvgPOOL→FC(120)→FC(84)→FC(10)

細節沒什麼好說的。後面我們可以試着用TensorFlow或者Keras來複現一下。

二、AlexNet

論文:http://vision.stanford.edu/teaching/cs231b_spring1415/slides/alexnet_tugce_kyunghee.pdf

AlexNet於2012年由Alex Krizhevsky, Ilya Sutskever 和 Geoffrey Hinton等人提出,並在2012 ILSVRC (ImageNet Large-Scale Visual Recognition Challenge)中取得了最佳的成績。這也是第一次CNN取得這麼好的成績,並且把第二名遠遠地甩在了後面,因此震驚了整個領域,從此CNNs纔開始被大衆所熟知。

這裏簡單地說一下這個ILSVRC,它是一個ImageNet發起的挑戰,是計算機視覺領域的奧運會。全世界的團隊帶着他們的模型來對ImageNet中的數以千萬的共1000個類別的圖片進行分類、定位、識別。這個是一個相當有難度的工作,1000個類別啊。

那我們來看看這個AlexNet的結構把:

輸入的圖片是256×256,然後進行隨機的裁剪得到227×227大小,然後輸入進網絡中。可見,這個輸入比LeNet的要大得多,這種大小,在當年已經是圖片的主流大小了。

AlexNet共有8層其中5個CONV層和3個FC層,這裏沒有算上POOL層,因爲嚴格意義上它不算層,因爲沒有可訓練的參數。

關於AlexNet有如下要點:

  1. 用ImageNet的1500萬張來自2萬2千個類別的圖片進行訓練,在兩個GTX 580 GPU上訓練了5,6天;
  2. 使用ReLU激活函數,而之前的神經網絡,包括LeNet,都是使用sigmoid或者tanh激活函數,AlexNet證明了ReLU函數在效率效果上更佳,速度提高很多倍;
  3. 使用了很多的數據擴增技術(Dada Augmentation),比如圖片反轉、剪切、平移等等,來擴充訓練集,使得訓練的模型魯棒性更強;
  4. 第一次使用dropout正則化技術;
  5. 使用mini-batch SGD(也成隨機梯度下降)來加快訓練。

總之,AlexNet讓人們認識到CNN的強大和巨大的潛能,併爲之後的研究提供了很多有用的經驗和技術。

三、VGG Net

論文:https://arxiv.org/pdf/1409.1556.pdf

這個網絡於2014年被牛津大學的Karen Simonyan 和Andrew Zisserman提出,主要特點是 “簡潔,深度”。 深, 是因爲VGG有19層,遠遠超過了它的前輩; 而簡潔,則是在於它的結構上,一律採用stride爲1的3×3filter,以及stride爲2的2×2MaxPooling。所以雖然深,但是結構大家一眼就可以記住。

這個圖來自於VGG的論文,每一列是他們研究的不同的結構,我們直接看E的那個結構,不難發現,若干個CONV疊加,然後配一個MaxPooling,再若干個CONV,再加一個MaxPooling,最後三個FC。而且,每個MaxPooling之後,CONV的filter的個數都翻倍,分別是64,128,256,512,結構十分規則有規律。

VGG刷新了CNN的深度,其簡明的結構更是讓人印象深刻。

四、Inception Net(GoogleNet)

論文:https://www.cs.unc.edu/~wliu/papers/GoogLeNet.pdf

看了前面的網絡結構之後,我們會發現,他們越來越深,filter越來越多,參數越來越多。 似乎提高CNN的表現的方法就是堆疊更多的CONV、POOL層排成一列(我們稱之爲sequential model,熟悉keras的同學應該知道)就行了。確實那個時候大家都在想方設法增加網絡的層數,讓我們的CNN更加龐大。

但我們也應該清楚,一味地增加層數、增加通道數(filters越多,輸出圖像的通道數就越多),會讓我們的計算量急劇增加,模型變得過於複雜,從而更容易過擬合,這樣反而會讓模型的性能下降。

Inception Net不再是使用Sequential model,在結構上有了重大創新。

在sequential model中,所有操作,無論是CONV還是POOL,都是排成一些序列。但是Google他們就想,爲什麼不可以同時進行各種操作呢?於是論文的作者有一個大膽的想法,假如我們有3個CONV和一個MaxPOOL,何不讓它們平行地運算,然後再整合在一起?:

這樣做有一個問題,就是,整合在一起之後,channels這個維度會過大

於是作者想出了一個好辦法,那就是使用filter爲1×1的CONV來進行降維:

前面學過了卷積的操作,我們知道,一個1×1的filter去卷積,圖像的長和寬都不會變化,同時,輸出圖像的channels數等於filters的個數,所以對於圖中的192個channels的圖像,我們用32個filter,就可以把維度降低到32維。

於是,我們可以利用1×1CONV的這個特點,來改造上面的整合過程:

可見,通過使用1×1CONV,輸出的通道數大大減少,這樣,整個模型的參數也會大大減少。

上面這個部分,稱爲“Inception Module”,而Inception Network,就是由一個個的inception module組成的:

【圖片來源:https://adeshpande3.github.io/The-9-Deep-Learning-Papers-You-Need-To-Know-About.html】

通過inception module,GoogleNet成功地把CNN的層數增加到了超過100層!(如果把一個module當做一層的話,則是22層)。

這個GoogleNet就牛逼了,名副其實地“深”,而且參數的數量也比我們前面介紹的AlexNet要少很多倍!所以訓練出的模型不僅效果好,而且更快。

五、ResNet (殘差網絡)

論文:https://arxiv.org/pdf/1512.03385.pdf

最後要介紹的就是ResNet,於2015年由微軟亞洲研究院的學者們提出。

前面講了,CNN面臨的一個問題就是,隨着層數的增加,CNN的效果會遇到瓶頸,甚至會不增反降。這往往是梯度爆炸或者梯度消失引起的。

ResNet就是爲了解決這個問題而提出的,因而幫助我們訓練更深的網絡。 它引入了一個residual block(殘差塊)

這個圖來自原論文。 可以很直觀地看出,這個殘差塊把某一層的激活值,直接一把抓到了後面的某一層之前,這個過程稱之爲“skip connection(跳躍連接)”。 這個做法,相當於把前面的信息提取出來,加入到當前的計算中,論文作者認爲,這樣的做法,可以使神經網絡更容易優化。事實上卻是是這樣。

通過這種residual block,他們成功地搭建了一個擁有152層的CNN!深不見底! 我從論文中截取網絡的一部分如下:

關於具體的細節以及爲什麼residual block有效,可以查閱原論文或者網上的其他教程。


以上就是今天要介紹的主要的CNN模型了。當然,經典的CNN模型還有更多,就留給讀者自己去探索了,日後有時間也許我也會介紹其他的CNN。 有時候我們瞭解這些模型之後,會覺得壓力山大,因爲覺得這些模型一個比一個複雜,這讓人怎麼去實現啊?而且,這麼深的網絡,讓我們去訓練,簡直要命。人家研究機構是用當時最先進的GPU,用海量的數據,訓練幾天乃至幾周才訓練好,我們平民老百姓豈不是沒法玩? 事實上,我們應該高興,因爲這些著名的網絡,一般都是開源的,而且很多已經被一些深度學習框架給封裝成接口了,我們都直接拿來用。而且,我們還可以用“遷移學習(Transfer Learning)”的方法,僅僅用少量的訓練樣本,藉助這些著名的模型,就可以構建屬於我們自己的CNN架構。這些內容,將會在後面的文章中講解。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章