"如果我們想讓機器思考,我們需要教他們看(感知)" - 李飛飛
在本文中將討論卷積神經網絡的一些更復雜的方面,以及它們如何與特定任務相關,如對象檢測和麵部識別。
本文中將討論的主題是:
- CNN評論
- 感受野和擴張的卷積
- 顯著性圖
- 轉置卷積
- 經典網絡
- 殘餘網絡
- 遷移學習
這篇文章更具體地涉及深度學習在計算機視覺中的應用。
CNN評論
CNN的獨特方面如下:
- 與完全連接的網絡相比,參數(權重和偏差)更少。
- 對象轉換不變 - 它們不依賴於圖像中特徵的出現位置。
- 可以容忍圖像中的一些失真。
- 能夠概括和學習功能。
- 需要網格輸入。
卷積層由濾波器,特徵映射和激活函數形成。這些卷積層可以是完整的,相同的或有效的。
如果輸入中的層數已知,我們可以確定給定卷積塊的輸出層數nᵢ,該階段中的濾波器數量f,步幅的大小s和濾波器尺寸k,填充p(假設它是方形)。
池化層用於減少過擬合。完全連接的層用於將空間和通道特徵混合在一起。每個卷積層對應於在圖像上繪製特徵圖之後的圖像,這是提取特徵的方式。
明確輸入和輸出層的數量很重要,因為這決定了構成神經網絡參數的權重和偏差的數量。網絡中的參數越多,需要訓練的參數越多,導致訓練時間越長。訓練時間對於深度學習非常重要,因為它是一個限制因素,除非你可以訪問強大的計算資源,如計算集群。
下面是一個示例網絡,我們將為其計算參數總數。
在這個網絡中,我們在卷積濾波器上有250個權重和10個偏差項。我們在max-pooling層上沒有權重。在最大池化層之後,我們有13×13×10 = 1,690個輸出元素。我們有一個200節點的完全連接層,在完全連接層中總共產生1,690×200 = 338,000個權重和200個偏置項。因此,我們在網絡中共有338,460個參數需要接受訓練。我們可以看到大多數訓練的參數出現在完全連接的輸出層。
每個CNN層都學習越來越複雜的濾波器。第一層學習基本特徵檢測濾波器,例如邊緣和角落。中間層學習檢測對象部分的濾波器 - 對於面部,他們可能學會對眼睛和鼻子做出反應。最後的圖層具有更高的表示形式:它們學習識別不同形狀和位置的完整對象。
感受野和擴張卷積
感知字段被定義為輸入空間中特定CNN的特徵正在查看(即受其影響)的區域。在5×5輸入映射上應用內核大小為k=3×3,填充大小為p =1×1,步幅s=2×2 的卷積C,我們將得到一個3×3輸出特徵映射(綠色映射) 。
在3×3特徵圖之上應用相同的卷積,我們將得到2×2特徵圖(橙色圖)。
讓我們再次以一維方式看待感受野,沒有填充,步幅為1,內核大小為3×1。
我們可以跳過其中一些連接以創建擴張卷積,如下所示。
這種擴張的卷積以與正常卷積類似的方式工作,主要區別在於感受野不再由連續像素組成,而是由其他像素分開的各個像素組成。擴散卷積層應用於圖像的方式如下圖所示。
下圖顯示了二維數據的擴張卷積。紅點是過濾器的輸入,其為3×3,綠色區域是由這些輸入中的每一個捕獲的感受野。感受野是每個輸入(單位)到下一層的初始輸入上捕獲的隱含區域。
使用擴張卷積背後的動機是:
- 通過處理更高分辨率的輸入來檢測精細細節。
- 更廣泛的視角,用於捕獲更多上下文信息。
- 運行時間更短,參數更少
在下一節中,我們將討論使用顯著性映射來檢查卷積網絡的性能。
顯著性圖
顯著性圖是數據科學家可用於檢查卷積網絡的有用技術。它們可用於研究神經元的激活模式,以查看圖像的哪些特定部分對於特定特徵是重要的。
讓我們想象一下,你會得到一張狗的圖像並要求對它進行分類。這對於人類來說非常簡單,但是,深度學習網絡可能不像你那麼聰明,而是可能將其歸類為貓或獅子。為什麼這樣做?
網絡可能錯誤分類圖像的兩個主要原因:
- 偏見化訓練數據
- 沒有正則化
我們想要了解是什麼讓網絡將某個類作為輸出 - 這樣做的一種方法是使用顯著性圖。顯著性圖是一種測量給定圖像中特定類的空間支持的方法。
"當我通過我的網絡傳輸圖像時,找到負責C類分數S(C)的像素"。
對於任何函數f(x,y,z),我們可以通過在該點找到關於這些變量的偏導數,找到變量x,y,z對任何特定點(x 1,y 1,z 1)的影響。類似地,為了找到負責的像素,我們對C類取分數函數S,並對每個像素取部分導數。
這很難自己實現,但幸運的是,auto-grad可以做到這一點!該程序的工作原理如下:
- 通過網絡正向傳遞圖像。
- 計算每個類的分數。
- 對於除C類之外的所有類,在最後一層強制執行得分S的導數為0,對於C,將其設置為1。
- 通過網絡反向傳播此梯度。
- 渲染它們,你就有了顯著性圖。
注意:在步驟#2中,我們將其轉換為二進制分類並使用概率,而不是執行softmax。
以下是顯著性圖的一些示例。
我們如何處理彩色圖像?獲取每個頻道的顯著性圖,並採用最大值,平均值或使用所有3個頻道。
以下是Jupyter notebook中的代碼片段:
from vis.visualization import visualize_saliency
from vis.utils import utils
from keras import activations
# Utility to search for layer index by name.
# Alternatively we can specify this as -1 since it corresponds to the last layer.
layer_idx = utils.find_layer_idx(model, 'preds')
plt.rcParams["figure.figsize"] = (5,5)
from vis.visualization import visualize_cam
import warnings
warnings.filterwarnings('ignore')
# This corresponds to the Dense linear layer.
for class_idx in np.arange(10):
indices = np.where(test_labels[:, class_idx] == 1.)[0]
idx = indices[0]
f, ax = plt.subplots(1, 4)
ax[0].imshow(test_images[idx][..., 0])
for i, modifier in enumerate([None, 'guided', 'relu']):
grads = visualize_cam(model, layer_idx, filter_indices=class_idx,
seed_input=test_images[idx], backprop_modifier=modifier)
if modifier is None:
modifier = 'vanilla'
ax[i+1].set_title(modifier)
ax[i+1].imshow(grads, cmap='jet')
該代碼產生在下面的顯著性映射:
在下一節中,我們將討論通過使用轉置卷積進行上採樣的想法。
轉置卷積
到目前為止,我們所看到的卷積要麼保持其輸入的大小,要麼使其變小。我們可以使用相同的技術使輸入張量更大,此過程稱為上採樣。當我們在卷積步驟中進行時,它被稱為轉置卷積。
為了說明轉置卷積的工作原理,我們將看一些卷積的例子。
第一個是沒有填充的典型卷積層的示例,作用於大小為5×5的圖像。在卷積之後,我們最終得到3×3圖像。
現在我們看一個填充為1的卷積層。原始圖像是5×5,卷積後的輸出圖像也是5×5。
現在我們看一個填充為2的卷積層。原始圖像是3×3,卷積後的輸出圖像也是5×5。
當在Keras中使用時,例如在變分自動編碼器的開發中,這些是使用上採樣層實現的。希望如果你之前已經看到過,現在可以理解這些卷積層如何通過使用轉置卷積來增加圖像的大小。
在下一節中,我們將討論一些經典網絡的體系結構。這些網絡中的每一個在某種意義上都是革命性的,用於轉發深度卷積網絡領域。
經典網絡
在本節中將介紹一些CNN的經典架構。這些網絡被用於深度學習領域的一些開創性工作中,並且經常用於遷移學習目的。
提出類似於卷積神經網絡的第一項研究由Kunihiko Fukushima於1980年撰寫,被稱為NeoCognitron1,受到哺乳動物視覺皮層發現的啟發。福島將NeoCognitron應用於手寫字符識別。
到20世紀80年代末,已經制作了幾篇論文,大大推動了該領域的發展。反向傳播的概念首先由Yann LeCun於1985年以法語出版,緊隨其後的是Waiber等人的TDNN。在1989年 - 開發了一個像反向傳播訓練的卷積式網絡。最初的應用之一是LeCun等人。1989年,使用反向傳播應用於手寫郵政編碼識別。
LeNet-5
與目前的做法相比,LeNet-5的配方有點過時了。這是20世紀末深度學習初期階段開發的第一個神經架構之一。
1998年11月,LeCun發表了他最受認可的論文之一,描述了用於文檔識別的"現代"CNN架構,稱為LeNet1。這不是他的第一次迭代,事實上,這是LeNet-5,但本文是關於LeNet的常被引用的出版物。
它使用卷積網絡,然後使用完全連接的層彙集圖層和完成。網絡首先從高維特徵開始,並在增加通道數量的同時減小其尺寸。該網絡中有大約60,000個參數。
AlexNet
AlexNet架構是深度學習中最重要的架構之一,引用次數超過25,000次 - 這在研究文獻中幾乎聞所未聞。AlexNet於2012年由多倫多大學的Alex Krizhevsky,Ilya Sutskever和Geoffrey Hinton開發,摧毀了2012年ImageNet大規模視覺識別挑戰賽(ILSVRC)的競爭。
該網絡在ImageNet數據集上進行了訓練,該數據集是使用數據增強功能的120萬高分辨率(227x227x3)圖像的集合,由1000個不同的類組成。模型的深度比當時任何其他網絡都要大,並且使用GPU進行了5-6天的訓練。該網絡由12層組成,利用了丟包和智能優化器層,是最早實現ReLU激活功能的網絡之一,目前仍在廣泛使用。該網絡有超過6000萬個參數進行優化(~255 MB)。
通過展示CNN的令人印象深刻的性能和潛在的好處,這個網絡幾乎單槍匹馬地啟動了AI革命。該網絡贏得了ImageNet比賽的前5名誤差為15.3%,比下一個亞軍低了10.8個百分點。
我們將討論贏得ILSVRC的其餘網絡,因為其中大多數是處於深度學習研究前沿的革命性網絡。
ZFNet
該網絡由紐約大學的Matthew Zeiler和Rob Fergus介紹,他們以11.2%的錯誤率贏得了ILSVRC 2013。網絡減少了過濾器的尺寸,並訓練了12天。
本文介紹了一種名為"反捲積網絡"的可視化技術,該技術有助於檢查不同的特徵激活及其與輸入空間的關係。
VGG16和VGG19
2014年,Simonyan和Zisserman(牛津大學)推出了VGG網絡。該網絡在其固有的簡單性和結構方面具有革命性。它由16或19層(因此得名)組成,總共有1.38億個參數(522 MB),並使用3x3卷積濾波器,專門使用相同的填充和1步幅,以及2x2最大池層,步長為2。
作者表明,兩個3x3濾波器的有效感受區域為5x5,隨著空間尺寸的減小,深度增加。該網絡經過兩到三週的訓練,至今仍在使用 - 主要用於遷移學習。該網絡最初是為2014年的ImageNet挑戰而開發的。
- 2014年ImageNet挑戰賽; 16或19層
- 1.38億個參數(522 MB)。
- 卷積層使用"相同"填充並且步幅s = 1。
- 最大池化層使用過濾器大小f = 2和步幅s = 2。
GoogLeNet(Inception-v1)
GoogLeNet網絡由Szegedy等人介紹。該網絡是ILSVRC 2014的贏家,擊敗了VGG架構。該網絡引入了初始模塊的概念 - 具有不同濾波器大小的並行卷積層。
這裡的想法是,我們沒有一個先驗知道哪個濾鏡尺寸是最好的,所以我們只讓網絡決定。初始網絡是通過連接其他初始模塊而形成的。它包括幾個softmax輸出單元,以強制正規化。這是一個關鍵的想法,這對於未來架構的開發非常重要。
另一個有趣的特徵是最後沒有完全連接的層,而是用平均池層替換。刪除這個完全連接的層會使網絡的參數比AlexNet少12倍,從而使訓練速度更快。
ResNet
第一個剩餘網絡由微軟的He等人在2015年提出。該網絡在多個類別中贏得了2015年ILSVRC。該網絡背後的主要思想是剩餘塊。該網絡允許開發極深的神經網絡,其可以包含100層或更多層。
這是革命性的,因為到目前為止,深度神經網絡的發展受到消失梯度問題的抑制,當在大量層上傳播和乘以小梯度時會出現這種問題。
作者認為,優化殘差映射比原型神經架構更容易。此外,如果需要,殘餘塊可以決定"自行關閉"。讓我們比較普通網絡和剩餘網絡的網絡結構。普通的網絡結構如下:
殘餘網絡結構如下所示:
何開明,張翔宇,任少卿,孫健,"計算機視覺與模式識別會議(CVPR)",2016年6月"圖像識別深度學習"。
描述該網絡的等式是:
通過這種額外的連接,梯度可以更容易地向後移動。它成為一個靈活的塊,可以擴展網絡的容量,或簡單地轉換為不影響訓練的身份功能。
殘餘網絡順序堆疊殘餘塊。
這個想法是讓網絡變得更深,而不會增加訓練的複雜性。
殘餘網絡使用卷積層實現具有"相同"填充選項的塊(即使在最大池化時)。這允許塊學習身份功能。
設計人員可能希望減小功能的大小並使用"有效"填充。 - 在這種情況下,快捷方式路徑可以實現一組新的卷積層,從而適當地減小大小。
這些網絡變得龐大而且非常複雜,它們的圖表看起來類似於描述發電廠功能的圖表。這是這種網絡的一個例子。
將之前ImageNet獲勝者的誤差值與ResNet配方的誤差值進行比較,我們可以看到性能的明顯提升。Alexnet(2012)的前5名誤差為15.3%(第二名為26.2%),隨後ZFNet(2013)實現了前8名誤差14.8%(功能可視化),其次是GoogLeNet(2014)誤差為7.8%,然後是ResNet(2015)首次達到5%以下的精度。
DenseNet
最初由Huang等人提出。2016年作為ResNet理念的激進延伸。每個塊使用每個先前的特徵映射作為輸入,有效地連接它們。這些連接意味著網絡具有L(L + 1)/2個直接連接,其中L是網絡中的層數。人們可以將該架構視為展開的遞歸神經網絡。
每個層都將自己的k個特徵映射添加到此狀態。增長率規定了每層為全球國家做出多少新信息。這裡的想法是我們在每個點都有所有以前的信息。與直覺相反,該架構減少了所需參數的總數。
網絡的工作原理是,通過將每個層直接與每個其他層連接,允許每層的最大信息(和梯度)流。通過這種方式,DenseNets通過特徵重用來利用網絡的潛力,這意味著無需學習冗餘特徵映射。DenseNet圖層相對較窄(例如12個濾鏡),它們只添加了一小組新的特徵圖。
DenseNet架構通常具有優於ResNet架構的性能,並且可以使用更少的參數實現相同或更高的精度,並且網絡更容易訓練。
網絡公式最初可能有點令人困惑,但它本質上是一個ResNet架構,分辨率塊被密集塊代替。密集連接具有正則化效果,可減少訓練集大小較小的任務的過度擬合。
值得注意的是,DenseNets不會將圖層的輸出要素圖與傳入的要素圖相加,實際上它們會將它們連接起來:
特徵圖的尺寸在塊內保持不變,但過濾器的數量在它們之間變化,這被稱為增長率k。
以下是密集網絡的完整架構。當我們以完整的分辨率查看網絡時,這是相當複雜的,這就是為什麼通常更容易以抽象的形式進行可視化。
總結
正如我們所看到的,在短短几年的時間裡,我們已經從ImageNet數據集的錯誤率大約15%變為大約3的錯誤率4%。如今,最先進的網絡能夠始終如一地低於3%。
在我們能夠獲得這些網絡的完美分數之前還有很長的路要走,但在過去的十年中,進展速度相當驚人,而且應該從中看出為什麼我們目前正在經歷一場深刻的學習革命 - 我們已經從人類具有卓越視覺識別的階段,到這些網絡具有卓越視覺的階段。
這推動了機器學習算法向需要大量使用圖像分析的各種商業領域的轉變,例如醫學成像(檢查腦部掃描,X射線,乳房X射線攝影掃描)和自動駕駛汽車(計算機視覺)。圖像分析很容易擴展到視頻,因為這只是每秒多個圖像幀的快速連續 - 儘管這需要更多的計算能力。
遷移學習
遷移學習是一個重要的課題,本文將概述遷移學習背後的基本思想,以便讀者能夠在感興趣的情況下對其進行更多的研究。
如何製作一個可以在幾小時(幾分鐘)內在CPU上訓練的圖像分類器?
通常情況下,圖像分類模型可能需要數小時,數天甚至數週才能進行訓練,特別是如果他們接受了特大型網絡和數據集的訓練。
但是,我們知道像谷歌和微軟這樣的公司擁有專門的數據科學家團隊,他們花了數年時間開發出用於圖像分類的特殊網絡 - 為什麼不將這些網絡作為你自己的圖像分類項目的起點呢?
這是遷移學習背後的想法,使用預先訓練的模型,即具有已知權重的模型,以便將它們應用於不同的機器學習問題。顯然,僅僅純粹轉移模型將沒有用處,你仍然必須在新數據上訓練網絡,但通常會凍結前一層的權重,因為這些是更廣義的功能,在訓練期間可能會保持不變。你可以將此視為生成預初始化網絡的智能方式,而不是具有隨機初始化網絡。
通常,在遷移學習中使用較小的學習速率而不是典型的網絡訓練,因為我們實質上是在調整網絡。如果使用較大的學習率並且網絡中的早期層未被凍結,則轉移學習可能不會帶來任何好處。通常,在遷移學習問題中訓練的只是最後一層或最後幾層。
遷移學習最適用於相當普遍的問題,並且網絡上可以自由使用網絡(例如圖像分析),並且當用戶擁有相對較小的數據集時,它不足以訓練神經網絡 - 這是一個相當普遍的問題。
總結主要思想:網絡的前期層學習低級特徵,通過改變後期和完全連接層的權重,可以適應新域。
這方面的一個例子是使用經過任何複雜的大型網絡訓練的ImageNet,然後在幾千個熱狗圖像上重新訓練網絡。
遷移學習的步驟如下:
- 獲取現有網絡權重
- 解凍"頭部"完全連接的圖層並訓練你的新圖像
- 解凍最新的卷積層並以非常低的學習速率訓練,從先前訓練的權重開始。這將改變最新的層卷積權重,而不會觸發在我們沒有完成#2時會發生的大梯度更新。