本章包括:
1、了解卷積神經(jīng)網(wǎng)絡(luò)(convnets)
2、使用數(shù)據(jù)增強(qiáng)來(lái)減輕過(guò)度擬合
3、使用預(yù)訓(xùn)練的convnet進(jìn)行特征提取
4、微調(diào)預(yù)訓(xùn)練的信號(hào)
5、可視化回饋學(xué)習(xí)的內(nèi)容以及他們?nèi)绾巫龀龇诸悰Q策
一、引言
一個(gè)簡(jiǎn)單的convnet示例。
??第二章中的密接網(wǎng)絡(luò)的測(cè)試精度為97.8%,而convnet的測(cè)試精度為99.3%:我們將錯(cuò)誤率降低了68%(相對(duì))。為什么這個(gè)簡(jiǎn)單的convnet比一個(gè)緊密連接的模型工作得那么好呢?為了回答這個(gè)問(wèn)題,讓我們深入研究conv2d和maxpooling2d層的作用。
1、卷積操作
??密集連接層和卷積層的根本區(qū)別在于:密集層在其輸入特征空間中學(xué)習(xí)全局模式(例如,對(duì)于mnist數(shù)字,涉及所有像素的模式),而卷積層學(xué)習(xí)局部模式(參見圖5.1):對(duì)于圖像,在輸入。在前面的示例中,這些窗口都是3×3。
??這個(gè)關(guān)鍵特性為convnets提供了兩個(gè)有趣的屬性:
- 他們學(xué)習(xí)的模式是翻譯不變的—學(xué)習(xí)了這種模式之后,convnets可以在別的任何地方識(shí)別出來(lái);這使得convnets在處理圖像時(shí)的數(shù)據(jù)效率更高(因?yàn)橐曈X(jué)世界基本上是不變的)。
-
他們可以學(xué)習(xí)模式的空間層次結(jié)構(gòu)(見圖5.2)。 第一卷積層將學(xué)習(xí)諸如邊緣的小局部圖案,第二卷積層將學(xué)習(xí)由第一層的特征構(gòu)成的較大圖案,等等。 這使得convnets能夠有效地學(xué)習(xí)越來(lái)越復(fù)雜和抽象的視覺(jué)概念(因?yàn)橐曈X(jué)世界從根本上講是空間分層的)。
??卷積作用于稱為特征映射的三維張量上,它有兩個(gè)空間軸(高度和寬度)和一個(gè)深度軸(也稱為通道軸)。對(duì)于RGB圖像,深度軸的尺寸為3,因?yàn)閳D像有三個(gè)顏色通道:紅色、綠色和藍(lán)色。對(duì)于黑白圖片,像mnist數(shù)字一樣,深度為1(灰度)。
??卷積操作從其輸入特征映射中提取補(bǔ)丁,并對(duì)所有這些補(bǔ)丁應(yīng)用相同的轉(zhuǎn)換,生成輸出特征映射。這個(gè)輸出特征映射仍然是一個(gè)三維張量:它有一個(gè)寬度和一個(gè)高度。它的深度可以是任意的,因?yàn)檩敵錾疃仁菆D層的一個(gè)參數(shù),并且該深度軸上的不同通道不再代表特定的顏色,就像在RGB輸入中一樣;相反,它們代表過(guò)濾器。
??過(guò)濾器對(duì)輸入數(shù)據(jù)的特定方面進(jìn)行編碼:例如,在高層,一個(gè)過(guò)濾器可以對(duì)“輸入中存在一個(gè)面”的概念進(jìn)行編碼。在mnist示例中,第一個(gè)卷積層獲取大小為(28、28、1)的特征映射并輸出大小為(26、26、32)的特征映射:它在其輸入上計(jì)算32個(gè)過(guò)濾器。這32個(gè)輸出通道中的每個(gè)通道都包含一個(gè)26×26的網(wǎng)格值,這是輸入端濾波器的響應(yīng)圖,指示該濾波器模式在輸入端不同位置的響應(yīng)(見圖5.3)。這就是術(shù)語(yǔ)“特征映射”的含義:深度軸中的每個(gè)維度都是特征(或過(guò)濾器),而二維張量輸出[:,:,n]是該過(guò)濾器對(duì)輸入響應(yīng)的二維空間映射。
卷積由兩個(gè)關(guān)鍵參數(shù)定義: - 從輸入中提取的補(bǔ)丁大小—通常為3×3或5×5
-
輸出特征映射的深度—由卷積計(jì)算的濾波器數(shù)量。該示例的開始深度為32,結(jié)束深度為64。
??在keras conv2d層中,這些參數(shù)是傳遞給層的第一個(gè)參數(shù):Conv2D(output_depth, (window_height, window_width)) 卷積的工作原理是將這些尺寸為3×3或5×5的窗口滑動(dòng)到三維輸入特征映射上,在每個(gè)可能的位置停止,并提取周圍特征的三維面片(shape (window_height, window_width, input_depth)) 然后,所有這些向量在空間上重新組合成三維形狀輸出圖(height,width, output_depth) 輸出特征映射中的每個(gè)空間位置對(duì)應(yīng)于輸入特征映射中的相同位置(例如,輸出的右下角包含有關(guān)輸入右下角的信息)。例如,使用3×3窗口時(shí),矢量輸出[i, j, :]來(lái)自3D補(bǔ)丁輸入[i-1:i+1, j-1:j+1, :]。整個(gè)過(guò)程如圖5.4所示。
注意,輸出寬度和高度可能與輸入寬度和高度可能因兩個(gè)原因而不同: - Border effects:可通過(guò)填充輸入特征映射來(lái)抵消。
-
The use of strides
填充:如果要獲得與輸入空間尺寸相同的輸出特征映射,可以使用填充。填充包括在輸入功能圖的每一側(cè)添加適當(dāng)數(shù)量的行和列,以便在每個(gè)輸入圖塊周圍放置中心卷積窗口。
??在conv2d層中,padding可通過(guò)padding參數(shù)進(jìn)行配置,padding參數(shù)采用兩個(gè)值:“valid”,表示沒(méi)有padding(只使用有效的窗口位置);“same”(相同),表示“pad的方式使輸出具有與輸入相同的寬度和高度?!眕adding參數(shù)默認(rèn)為“valid”。
??影響輸出大小的另一個(gè)因素是步幅的概念。迄今為止對(duì)卷積的描述假定卷積窗口的中心瓷磚都是連續(xù)的。但兩個(gè)連續(xù)窗口之間的距離是卷積,稱為步幅,默認(rèn)為1??绮骄矸e:跨步大于1的卷積。在圖5.7中,可以看到通過(guò)3×3卷積在5×5輸入(不帶填充)上使用跨距2提取的補(bǔ)丁。
??使用“跨距2”意味著特征地圖的寬度和高度將被一個(gè)系數(shù)2(除了由邊界效果引起的任何變化)所減小??绮骄矸e在實(shí)踐中很少使用,盡管對(duì)于某些類型的模型來(lái)說(shuō),跨步卷積可以派上用場(chǎng);為了縮小功能圖的樣本,我們傾向于使用max pooling操作,而不是跨步,在第一個(gè)convnet示例中在action中看到了這一操作。
2、最大池操作
??max pooling的作用:大幅縮小feature maps的樣本,很像跨步卷積。最大池包括從輸入功能圖中提取窗口并輸出每個(gè)通道的最大值。它在概念上類似于卷積,除了通過(guò)學(xué)習(xí)的線性變換(卷積核)轉(zhuǎn)換局部補(bǔ)丁之外,它們通過(guò)硬編碼的max張量操作進(jìn)行轉(zhuǎn)換。與卷積的一個(gè)大區(qū)別是,最大池通常使用2×2窗口和跨步2來(lái)完成,以便將特征映射的采樣率降低2倍。卷積通常是用3×3個(gè)窗口完成的,沒(méi)有跨距(跨距1)。使用降采樣的原因是減少要處理的特征映射系數(shù)的數(shù)量,并通過(guò)使連續(xù)的卷積層查看越來(lái)越大的窗口(根據(jù)它們覆蓋的原始輸入的比例)來(lái)誘導(dǎo)空間濾波器層次。
??注意,最大池并不是實(shí)現(xiàn)這種降采樣的唯一方法。還可以在先前的卷積層中使用跨步??梢允褂闷骄囟皇亲畲蟪?,其中每個(gè)本地輸入補(bǔ)丁都是通過(guò)在補(bǔ)丁上取每個(gè)通道的平均值而不是最大值來(lái)轉(zhuǎn)換的,但是最大池比這些可選的解決方案工作得更好。
??最合理的子采樣策略是首先生成密集的特征圖(通過(guò)無(wú)重疊卷積),然后查看小補(bǔ)丁上特征的最大激活,而不是查看輸入窗口較稀疏(通過(guò)跨步卷積)或平均輸入補(bǔ)丁,這可能會(huì)導(dǎo)致您錯(cuò)過(guò)或稀釋特征-P重置信息。
??此時(shí),應(yīng)該了解convnets特性圖、卷積和max pooling的基本知識(shí),并且知道如何構(gòu)建一個(gè)小的convnet來(lái)解決諸如mnist digits分類之類的問(wèn)題。
二、在小數(shù)據(jù)集上從頭開始訓(xùn)練convnet
??只有很少的數(shù)據(jù)來(lái)訓(xùn)練一個(gè)圖像分類模型是一種常見的情況,在這個(gè)例子里,我們將把圖像分類為“狗”或“貓”,在一個(gè)包含4000張貓和狗(2000只貓,2000只狗)圖片的數(shù)據(jù)集中。我們將使用2000張圖片進(jìn)行訓(xùn)練,1000張用于驗(yàn)證,最后1000張用于測(cè)試。
??在本節(jié)中,我們將回顧一個(gè)解決這個(gè)問(wèn)題的基本策略:從頭開始培訓(xùn)一個(gè)新模型,我們擁有的數(shù)據(jù)量很少。我們將從2000個(gè)訓(xùn)練樣本上訓(xùn)練一個(gè)小的convnet開始,不進(jìn)行任何正規(guī)化,為可以達(dá)到的目標(biāo)設(shè)定一個(gè)基線。這將使我們的分類精度達(dá)到71%。在那一點(diǎn)上,我們的主要問(wèn)題將是過(guò)度擬合。然后我們將介紹數(shù)據(jù)增強(qiáng),這是一種減輕計(jì)算機(jī)視覺(jué)中過(guò)擬合的強(qiáng)大技術(shù)。通過(guò)利用數(shù)據(jù)擴(kuò)充,我們將改進(jìn)我們的網(wǎng)絡(luò),使其精度達(dá)到82%。
??在下一節(jié)中,我們將回顧將深度學(xué)習(xí)應(yīng)用于小數(shù)據(jù)集的兩個(gè)更重要的技術(shù):使用預(yù)先訓(xùn)練的網(wǎng)絡(luò)進(jìn)行特征提?。ㄟ@將使我們的精度達(dá)到90%到93%),以及對(duì)預(yù)先訓(xùn)練的網(wǎng)絡(luò)進(jìn)行微調(diào)(這將使我們的最終精度達(dá)到95%)??傊?,這三種策略——從頭開始訓(xùn)練一個(gè)小模型,使用預(yù)先訓(xùn)練的模型進(jìn)行特征提取,以及微調(diào)預(yù)先訓(xùn)練的模型——將構(gòu)成未來(lái)解決使用小數(shù)據(jù)集進(jìn)行計(jì)算機(jī)視覺(jué)的問(wèn)題的工具箱。
1、 深度學(xué)習(xí)對(duì)小數(shù)據(jù)問(wèn)題的相關(guān)性
??有時(shí)我們會(huì)覺(jué)得,只有在有大量數(shù)據(jù)可用時(shí),深度學(xué)習(xí)才有效。這在一定程度上是一個(gè)有效的觀點(diǎn):深度學(xué)習(xí)的一個(gè)基本特征是,它能夠自己在訓(xùn)練數(shù)據(jù)中發(fā)現(xiàn)有趣的特性,而不需要任何手動(dòng)特性工程,并且只有在有大量訓(xùn)練示例的情況下才能實(shí)現(xiàn)。這對(duì)于輸入樣本是高維的問(wèn)題尤其適用,比如圖像。
??然而,相對(duì)于您試圖訓(xùn)練的網(wǎng)絡(luò)的大小和深度而言構(gòu)成“大量”樣本的因素是相對(duì)的。用幾十個(gè)樣本訓(xùn)練一個(gè)convnet來(lái)解決一個(gè)復(fù)雜的問(wèn)題是不可能的,但是如果模型很小并且很好地規(guī)范化,并且任務(wù)很簡(jiǎn)單,那么幾百個(gè)樣本就可能足夠了。由于convnet學(xué)習(xí)了局部的、翻譯不變的特征,因此它們?cè)诟兄獑?wèn)題上具有很高的數(shù)據(jù)效率。從零開始在一個(gè)非常小的圖像數(shù)據(jù)集上訓(xùn)練convnet仍然會(huì)產(chǎn)生合理的結(jié)果,盡管相對(duì)缺乏數(shù)據(jù),但不需要任何定制的特性工程。
??更重要的是,深度學(xué)習(xí)模型本質(zhì)上是高度可重用的:例如,可以采用在大型數(shù)據(jù)集上訓(xùn)練的圖像分類或語(yǔ)音到文本模型,在顯著不同的問(wèn)題上重用它,只需進(jìn)行微小的更改。具體來(lái)說(shuō),在計(jì)算機(jī)視覺(jué)的情況下,許多預(yù)先訓(xùn)練的模型(通常在ImageNet數(shù)據(jù)集上訓(xùn)練)現(xiàn)在可以公開下載,并且可以用于從非常少的數(shù)據(jù)中引導(dǎo)強(qiáng)大的視覺(jué)模型。這就是我們將在下一節(jié)中要做的?,F(xiàn)在,從掌握數(shù)據(jù)開始。
2、 下載數(shù)據(jù)
??https://www.kaggle.com/c/dogs-vs-cats/data
??下載并解壓縮后,我們將創(chuàng)建一個(gè)包含三個(gè)子集的新數(shù)據(jù)集:訓(xùn)練集每個(gè)類有1000個(gè)樣本,一個(gè)驗(yàn)證集每個(gè)類有500個(gè)樣本,最后一個(gè)測(cè)試集每個(gè)類有500個(gè)樣本。原始數(shù)據(jù)集包含25000張狗和貓的圖像(每類12500張)。每個(gè)類的樣本數(shù)是相同的:這是一個(gè)平衡的二分分類問(wèn)題,這意味著分類的準(zhǔn)確性將是成功的適當(dāng)度量。
3、 構(gòu)建網(wǎng)絡(luò)
??我們的convnet將是一個(gè)交替的conv2d(帶有relu激活)和maxpooling2d層的堆棧。對(duì)于編譯步驟,我們將像往常一樣使用RMSprop優(yōu)化器,loss的選擇:binary crossentropy
4、 數(shù)據(jù)預(yù)處理
??在將數(shù)據(jù)輸入我們的網(wǎng)絡(luò)之前,應(yīng)該將數(shù)據(jù)格式化為適當(dāng)?shù)念A(yù)處理浮點(diǎn)張量。目前,我們的數(shù)據(jù)以jpeg文件的形式存儲(chǔ)在驅(qū)動(dòng)器上,因此將其導(dǎo)入網(wǎng)絡(luò)的步驟大致如下:
- 閱讀圖片文件。
- 將jpeg內(nèi)容解碼為像素的RBG網(wǎng)格。
- 把它們轉(zhuǎn)換成浮點(diǎn)張量。
- 將像素值(介于0和255之間)重新調(diào)整為[0,1]間隔(神經(jīng)網(wǎng)絡(luò)擅長(zhǎng)處理較小的輸入值)。
??keras有一個(gè)帶有圖像處理助手工具的模塊,位于keras.preprocessing.image。特別的是,它包含了ImageDataGenerator類,它允許快速設(shè)置python生成器,該生成器可以自動(dòng)將磁盤上的圖像文件轉(zhuǎn)換成批預(yù)處理張量。這是我們將在這里使用的。
??然后使用fit_generator的方法實(shí)現(xiàn)生成器將模型與數(shù)據(jù)相擬合。
??在訓(xùn)練后始終保存我們的模型。
??用訓(xùn)練和驗(yàn)證數(shù)據(jù)來(lái)繪制模型在訓(xùn)練期間的loss 和accuracy。
??由于訓(xùn)練樣本相對(duì)較少,出現(xiàn)了過(guò)度擬合的現(xiàn)象,采用數(shù)據(jù)增強(qiáng)的方法來(lái)緩解過(guò)度擬合。
5、 使用數(shù)據(jù)增強(qiáng)
??數(shù)據(jù)增強(qiáng)采用從現(xiàn)有訓(xùn)練樣本生成更多訓(xùn)練數(shù)據(jù)的方法,通過(guò)一些隨機(jī)轉(zhuǎn)換“增強(qiáng)”樣本,生成可信的圖像。我們的目標(biāo)是,在培訓(xùn)時(shí),我們的模型不會(huì)看到完全相同的圖片兩次。這有助于模型暴露于數(shù)據(jù)的更多方面,并更好地進(jìn)行歸納。在Keras中,這可以通過(guò)配置要對(duì)ImageDataGenerator實(shí)例讀取的圖像執(zhí)行的多個(gè)隨機(jī)轉(zhuǎn)換來(lái)完成。一個(gè)例子:
- rotation_range是一個(gè)以度(0-180)為單位的值,在這個(gè)范圍內(nèi)可以隨機(jī)旋轉(zhuǎn)圖片。
- width_shift和height_shift 是一個(gè)范圍(作為總寬度或總高度的一部分),在這個(gè)范圍內(nèi)可以隨機(jī)地垂直或水平地翻譯圖片。
- shear_range 是指隨機(jī)應(yīng)用剪切變換。
- zoom_range 用于在圖片內(nèi)隨機(jī)縮放。
- horizontal_flip是指將一半圖像隨機(jī)水平翻轉(zhuǎn),這與沒(méi)有水平不對(duì)稱假設(shè)(如真實(shí)圖像)相關(guān)。
- fill_mode 是用于填充新創(chuàng)建的像素的策略,這些像素可以在旋轉(zhuǎn)或?qū)挾?高度移動(dòng)后出現(xiàn)。
三、使用預(yù)先訓(xùn)練的convnet
??對(duì)小圖像數(shù)據(jù)集進(jìn)行深入學(xué)習(xí)的一種常見且高效的方法是利用預(yù)先培訓(xùn)過(guò)的網(wǎng)絡(luò)。預(yù)先訓(xùn)練的網(wǎng)絡(luò)只是一個(gè)保存的網(wǎng)絡(luò),以前是在一個(gè)大型數(shù)據(jù)集上訓(xùn)練的,通常是在一個(gè)大型圖像分類任務(wù)上。
??在我們的例子中,我們將考慮在ImageNet數(shù)據(jù)集上訓(xùn)練的大型convnet(140萬(wàn)個(gè)標(biāo)記圖像和1000個(gè)不同的類)。Imagenet包含許多動(dòng)物類別,包括不同種類的貓和狗,因此我們可以期望在貓和狗的分類問(wèn)題上表現(xiàn)出色。
??我們將使用由Karen Simonyan和Andrew Zisserman于2014年開發(fā)的VGG16架構(gòu),這是一種簡(jiǎn)單且廣泛使用的用于Imagenet的convnet架構(gòu)。
??利用預(yù)先培訓(xùn)的網(wǎng)絡(luò)有兩種方法:特征提取和微調(diào)。我們將涵蓋這兩個(gè)方面。讓我們從特征提取開始。
1、 特征提取
??特征提取包括使用以前網(wǎng)絡(luò)學(xué)習(xí)的表示從新樣本中提取有趣的特征。然后,這些特性通過(guò)一個(gè)新的分類器運(yùn)行,這個(gè)分類器是從零開始訓(xùn)練的。
??正如我們前面做的,用于圖像分類的convnets由兩部分組成:它們從一系列池和卷積層開始,最后是一個(gè)緊密連接的分類器。第一部分是模型的“卷積基”。在convnets里,“特征提取”將簡(jiǎn)單地包括獲取先前訓(xùn)練的網(wǎng)絡(luò)的卷積基,通過(guò)它運(yùn)行新的數(shù)據(jù),并在輸出的頂部訓(xùn)練一個(gè)新的分類器。
??為什么只重用卷積基?我們也可以重用密接分類器嗎?一般來(lái)說(shuō),最好不要這樣做。另外,如果我們新數(shù)據(jù)集與訓(xùn)練原始模型的數(shù)據(jù)集有很大不同,那么最好只使用模型的前幾層進(jìn)行特征提取,而不是使用整個(gè)卷積基。
??在我們的例子中,由于imagenet類集確實(shí)包含多個(gè)dog和cat類,因此重用原始模型的緊密連接層中包含的信息可能會(huì)有所幫助。然而,我們將選擇不這樣做,以涵蓋更一般的情況,即新問(wèn)題的類集不與原始模型的類集重疊。我們通過(guò)使用在ImageNet上訓(xùn)練的VGG16網(wǎng)絡(luò)的卷積基,從貓和狗的圖像中提取有趣的特征,然后在這些特征的基礎(chǔ)上訓(xùn)練貓和狗的分類器,來(lái)實(shí)踐這一點(diǎn)。VGG16型號(hào),以及其他型號(hào),都預(yù)裝了Keras??梢詮膋eras.applications模塊導(dǎo)入它。以下是作為keras.applications的一部分提供的圖像分類模型列表(所有對(duì)ImageNet數(shù)據(jù)集進(jìn)行過(guò)預(yù)培訓(xùn))。
- Xception
- InceptionV3
- ResNet50
- VGG16
- VGG19
- MobileNet
??我們通過(guò)使用在ImageNet上訓(xùn)練的VGG16網(wǎng)絡(luò)的卷積基,從貓和狗的圖像中提取特征,然后在這些特征的基礎(chǔ)上訓(xùn)練貓和狗的分類器,來(lái)實(shí)踐這一點(diǎn)。步驟:
??1) 實(shí)例化vg16模型
??2) 特征提取的兩種方法:
??方法一:在數(shù)據(jù)集上運(yùn)行卷積基,將其輸出記錄到磁盤上的一個(gè)numpy數(shù)組中,然后使用這個(gè)日期作為一個(gè)獨(dú)立的、緊密連接的分類器的輸入,類似于本書第一章中所看到的。這個(gè)解決方案運(yùn)行起來(lái)非??焖俸捅阋?,因?yàn)樗恍枰獙?duì)每個(gè)輸入圖像運(yùn)行一次卷積基,而卷積基是迄今為止管道中最昂貴的部分。然而這種技術(shù)根本不允許我們利用數(shù)據(jù)擴(kuò)充。
??方法二:擴(kuò)展我們的模型(conv-),在頂部添加密集層,并在輸入數(shù)據(jù)上端到端地運(yùn)行整個(gè)模型。這允許我們使用數(shù)據(jù)增強(qiáng),因?yàn)槊看文P涂吹矫總€(gè)輸入圖像都要經(jīng)過(guò)卷積基。然而這種技術(shù)要比第一種技術(shù)代價(jià)更大。只能在GPU上運(yùn)行。
??這里因?yàn)槟P偷男袨榕c層類似,所以可以向順序模型添加模型(如conv_庫(kù)),就像添加層一樣。在我們編譯和訓(xùn)練模型之前,要做的一件非常重要的事情是凍結(jié)卷積基。”“凍結(jié)”一層或一組層意味著在訓(xùn)練過(guò)程中防止權(quán)重得到更新。如果我們不這樣做,那么之前由卷積基學(xué)習(xí)的表示將在訓(xùn)練期間被修改。由于頂部的密集層是隨機(jī)初始化的,因此會(huì)通過(guò)網(wǎng)絡(luò)傳播非常大的權(quán)重更新,從而有效地破壞先前學(xué)習(xí)的表示。在keras中,通過(guò)將網(wǎng)絡(luò)的可訓(xùn)練屬性設(shè)置為false來(lái)凍結(jié)網(wǎng)絡(luò):conv_base.trainable = False。使用此設(shè)置,將只訓(xùn)練我們添加的兩個(gè)密集層的權(quán)重??偣灿兴膫€(gè)權(quán)重張量:每層兩個(gè)(主權(quán)重矩陣和偏移向量)。注意,為了使這些更改生效,我們必須首先編譯模型。如果在編譯之后修改了權(quán)重可訓(xùn)練性,那么應(yīng)該重新編譯模型,否則這些更改將被忽略。現(xiàn)在,我們可以開始培訓(xùn)我們的模型,使用前面示例中使用的相同的數(shù)據(jù)擴(kuò)充配置。
2、 微調(diào)
??另一種廣泛使用的模型重用技術(shù)(與特征提取互補(bǔ))是微調(diào)。微調(diào)包括解凍用于特征提取的凍結(jié)模型庫(kù)的一些頂層,并聯(lián)合訓(xùn)練模型的新添加部分(在我們的例子中,是完全連接的分類器)和這些頂層。這被稱為“微調(diào)”,因?yàn)樗晕⒄{(diào)整了被重用模型的更抽象的表示,以便使它們與手頭的問(wèn)題更相關(guān)。
??我們之前已經(jīng)說(shuō)過(guò),為了能夠在頂部訓(xùn)練一個(gè)隨機(jī)初始化的分類器,有必要凍結(jié)VGG16的卷積基。出于同樣的原因,只有在對(duì)頂部分類器進(jìn)行了訓(xùn)練之后,才能對(duì)卷積基的頂層進(jìn)行微調(diào)。如果分類沒(méi)有經(jīng)過(guò)訓(xùn)練,那么在訓(xùn)練過(guò)程中通過(guò)網(wǎng)絡(luò)傳播的錯(cuò)誤信號(hào)將太大,并且先前由被微調(diào)的層所學(xué)習(xí)的表示將被破壞。因此,對(duì)網(wǎng)絡(luò)進(jìn)行微調(diào)的步驟如下:
??1)將我們自定義網(wǎng)絡(luò)添加到已訓(xùn)練的基礎(chǔ)網(wǎng)絡(luò)之上。
??2)凍結(jié)基礎(chǔ)網(wǎng)絡(luò)。
??3)訓(xùn)練我們添加的部件。
??4)解凍基礎(chǔ)網(wǎng)絡(luò)中的某些層。
??5)共同訓(xùn)練這些層和添加的零件。
??在進(jìn)行特征提取時(shí),我們已經(jīng)完成了前3個(gè)步驟。讓我們繼續(xù)第四步:我們將解凍conv_基地,然后凍結(jié)里面的各個(gè)層。
??卷積基中的早期層編碼更通用、可重用的特性,而更高層編碼更專業(yè)的特性。對(duì)更專業(yè)的特性進(jìn)行微調(diào)更有用,因?yàn)檫@些特性是需要針對(duì)新問(wèn)題重新調(diào)整用途的特性。在微調(diào)較低層時(shí),會(huì)有快速降低的回報(bào)。
??我們訓(xùn)練的參數(shù)越多,就越有過(guò)度擬合的風(fēng)險(xiǎn)。卷積基有1500萬(wàn)個(gè)參數(shù),因此嘗試在我們的小數(shù)據(jù)集上訓(xùn)練它是有風(fēng)險(xiǎn)的。
??因此,在我們的情況下,只對(duì)卷積基中的前2到3層進(jìn)行微調(diào)是一個(gè)很好的策略。我們將對(duì)最后3個(gè)卷積層進(jìn)行微調(diào),這意味著在Block4_池之前的所有層都應(yīng)凍結(jié),并且可以訓(xùn)練Block5_Conv1、Block5_Conv2和Block5_Conv3層。
微調(diào)過(guò)程如下:
??1)讓我們來(lái)設(shè)置它,從上一個(gè)例子中我們停止的地方開始
??2)微調(diào)我們的網(wǎng)絡(luò)。我們將使用rmsprop優(yōu)化器,使用非常低的學(xué)習(xí)率來(lái)實(shí)現(xiàn)這一點(diǎn)。使用低學(xué)習(xí)率的原因是,我們希望將所做的修改的大小限制為我們正在微調(diào)的3個(gè)層的表示。太大的更新可能會(huì)損害這些表示。
??3)根據(jù)測(cè)試數(shù)據(jù)最終評(píng)估此模型
??這里我們得到了97%的測(cè)試精度。在最初圍繞這個(gè)數(shù)據(jù)集的競(jìng)爭(zhēng)中,這將是最重要的結(jié)果之一。然而,利用現(xiàn)代的深度學(xué)習(xí)技術(shù),我們僅使用了一小部分可用的培訓(xùn)數(shù)據(jù)(約10%)就取得了這一結(jié)果。與2000個(gè)樣本相比,能夠訓(xùn)練20000個(gè)樣本有很大的區(qū)別!
??使曲線更易讀的方法,我們可以用這些量的指數(shù)移動(dòng)平均值來(lái)替換每一個(gè)損失和精度,從而使它們更平滑。下面是一個(gè)簡(jiǎn)單的實(shí)用程序函數(shù):
3、 總結(jié)
- convnets是計(jì)算機(jī)視覺(jué)任務(wù)的最佳機(jī)器學(xué)習(xí)模型。甚至可以在一個(gè)非常小的數(shù)據(jù)集上從頭開始訓(xùn)練一個(gè)數(shù)據(jù)集,結(jié)果也不錯(cuò)。
- 在小數(shù)據(jù)集上,過(guò)度擬合將是主要問(wèn)題。在處理圖像數(shù)據(jù)時(shí),數(shù)據(jù)增強(qiáng)是一種有效的克服過(guò)度擬合的方法。
- 通過(guò)特征提取,很容易在新數(shù)據(jù)集上重用現(xiàn)有的convnet。這對(duì)于處理小圖像數(shù)據(jù)集是一種非常有價(jià)值的技術(shù)。
- 作為對(duì)特征提取的補(bǔ)充,我們可以使用微調(diào),它可以適應(yīng)一個(gè)新的問(wèn)題,一些現(xiàn)有模型以前學(xué)習(xí)的表示。這會(huì)進(jìn)一步提高性能。
- 現(xiàn)在,我們有了一套處理圖像分類問(wèn)題的可靠工具,特別是處理小數(shù)據(jù)集的工具。
四、可視化convnets學(xué)習(xí)的內(nèi)容
??人們常說(shuō),深度學(xué)習(xí)模型是“黑匣子”,學(xué)習(xí)表示很難以人類可讀的形式提取和呈現(xiàn)。雖然對(duì)于某些類型的深度學(xué)習(xí)模型,這是部分正確的,但對(duì)于convnets,這絕對(duì)不是正確的。convnets學(xué)習(xí)的表示非常容易可視化,這在很大程度上是因?yàn)樗鼈兪强梢暬拍畹谋硎?。我們將涵蓋以下三方面:
??1)可視化中間convnet輸出(“中間激活”)。這有助于理解連續(xù)的convnet層如何轉(zhuǎn)換其輸入,并首先了解各個(gè)convnet過(guò)濾器的含義。
??2)可視化convnets篩選器。這有助于準(zhǔn)確理解convnet中每個(gè)過(guò)濾器所能接受的視覺(jué)模式或概念。
??3)在圖像中可視化類激活的熱圖。這有助于理解標(biāo)識(shí)為屬于給定類的圖像的哪個(gè)部分,從而允許在圖像中定位對(duì)象。
??對(duì)于第一種方法——激活可視化——我們將使用兩節(jié)前從零開始訓(xùn)練的小convnet來(lái)解決貓和狗的分類問(wèn)題。對(duì)于接下來(lái)的兩種方法,我們將使用上一節(jié)中介紹的vg16模型。
1、Visualizing intermediate activations
??可視化中間激活包括顯示由網(wǎng)絡(luò)中各種卷積和池層輸出的特征圖,給定一個(gè)特定的輸入(一個(gè)層的輸出通常稱為其“激活”,即激活函數(shù)的輸出)。這就為輸入如何分解為網(wǎng)絡(luò)學(xué)習(xí)的不同過(guò)濾器提供了一個(gè)視圖。我們要可視化的這些功能圖有三個(gè)維度:寬度、高度和深度(通道)。每個(gè)通道編碼相對(duì)獨(dú)立的特征,因此可視化這些特征圖的正確方法是將每個(gè)通道的內(nèi)容作為二維圖像單獨(dú)標(biāo)繪。
??這里需要注意的幾個(gè)重要事項(xiàng):
- 第一層是各種邊緣檢測(cè)器的集合。在那個(gè)階段,激活仍然保留了最初圖片中的幾乎所有信息。
- 隨著我們向上走,激活變得越來(lái)越抽象,視覺(jué)解釋能力也越來(lái)越差。他們開始編碼更高級(jí)的概念,如“貓耳”或“貓眼”。更高級(jí)別的演示文稿包含的關(guān)于圖像視覺(jué)內(nèi)容的信息越來(lái)越少,與圖像類別相關(guān)的信息也越來(lái)越多。
- 激活的稀疏性隨著層的深度而增加:在第一層中,所有的過(guò)濾器都由輸入圖像激活,但在下面的層中,越來(lái)越多的過(guò)濾器是空白的。這意味著在輸入圖像中找不到由過(guò)濾器編碼的模式。
??深層神經(jīng)網(wǎng)絡(luò)所學(xué)習(xí)的表示的一個(gè)非常重要的普遍特征:一個(gè)層所提取的特征隨著層的深度越來(lái)越抽象。更高層的激活會(huì)帶來(lái)越來(lái)越少的關(guān)于所看到的特定輸入的信息,以及越來(lái)越多的關(guān)于目標(biāo)的信息(在我們的例子中,是圖像的類別:貓或狗)。深度神經(jīng)網(wǎng)絡(luò)有效地充當(dāng)信息蒸餾管道,原始數(shù)據(jù)進(jìn)入(在我們的例子中,是RBG圖片),并反復(fù)轉(zhuǎn)換,以便過(guò)濾出不相關(guān)的信息(例如圖像的特定視覺(jué)外觀),而有用的信息被放大和細(xì)化(例如圖像的類別)。
??這類似于人類和動(dòng)物感知世界的方式:觀察一個(gè)場(chǎng)景幾秒鐘后,人類可以記住其中存在的抽象對(duì)象(如自行車、樹),但無(wú)法記住這些對(duì)象的具體外觀。事實(shí)上,如果你現(xiàn)在試圖從腦海中畫出一輛普通的自行車,很有可能你根本就不能把它畫對(duì),即使你一生中見過(guò)成千上萬(wàn)輛自行車。你的大腦已經(jīng)學(xué)會(huì)了完全抽象它的視覺(jué)輸入,把它轉(zhuǎn)換成高層次的視覺(jué)概念,同時(shí)完全過(guò)濾掉不相關(guān)的視覺(jué)細(xì)節(jié),這使得我們很難記住周圍事物的實(shí)際外觀。
2、Visualizing convnet filters
??檢查convnets學(xué)習(xí)的過(guò)濾器的另一個(gè)簡(jiǎn)單方法是顯示每個(gè)過(guò)濾器要響應(yīng)的可視模式。這可以通過(guò)輸入空間中的梯度上升來(lái)實(shí)現(xiàn):將梯度下降應(yīng)用于convnet輸入圖像的值,以便從空白輸入圖像開始最大化特定過(guò)濾器的響應(yīng)。所產(chǎn)生的輸入圖像將是所選濾波器最大響應(yīng)的圖像。這個(gè)過(guò)程很簡(jiǎn)單:我們將建立一個(gè)損失函數(shù),使給定卷積層中給定濾波器的值最大化,然后我們將使用隨機(jī)梯度下降來(lái)調(diào)整輸入圖像的值,從而使這個(gè)激活值最大化。例如,在VGG16網(wǎng)絡(luò)的“block3_conv1”層中激活過(guò)濾器0時(shí)會(huì)丟失,在ImageNet上進(jìn)行了預(yù)訓(xùn)練。
??這些過(guò)濾器可視化告訴我們很多關(guān)于convnet層如何看待世界的信息:convnet中的每一層都只是學(xué)習(xí)一組過(guò)濾器,這樣它們的輸入就可以表示為過(guò)濾器的組合。這類似于傅立葉變換如何將信號(hào)分解成一組余弦函數(shù)。隨著我們?cè)谀P椭械奶嵘?,這些convnet過(guò)濾器組中的過(guò)濾器變得越來(lái)越復(fù)雜和精細(xì):
??1)模型中第一層的過(guò)濾器(block1_conv1)編碼簡(jiǎn)單的方向性邊和顏色(在某些情況下為彩色邊)。
??2)Block2_Conv1的過(guò)濾器對(duì)由邊和顏色組合而成的簡(jiǎn)單紋理進(jìn)行編碼。
??3)更高層的過(guò)濾器開始類似于自然圖像中的紋理:羽毛、眼睛、樹葉等。
3、Visualizing heatmaps of class activation
??我們將介紹另一種可視化技術(shù),這種技術(shù)有助于理解給定圖像的哪些部分引導(dǎo)其進(jìn)行最終的分類決策。這有助于“調(diào)試”回轉(zhuǎn)網(wǎng)的決策過(guò)程,特別是在分類錯(cuò)誤的情況下。它還允許我們?cè)趫D像中查找特定對(duì)象。
??這種一般類別的技術(shù)稱為“類激活圖”(CAM)可視化,并且包括在輸入圖像上產(chǎn)生“類激活”的熱圖。 “類激活”熱圖是與特定輸出類相關(guān)聯(lián)的分?jǐn)?shù)的2D網(wǎng)格,針對(duì)任何輸入圖像中的每個(gè)位置計(jì)算,指示每個(gè)位置相對(duì)于所考慮的類的重要程度。例如,如果將圖像輸入我們的“貓與狗”之一,則類激活圖可視化允許我們?yōu)轭悺柏垺鄙蔁釄D,指示圖像中貓的不同部分是如何的,同樣如此對(duì)于“狗”類,表示圖像的狗狀不同部分。
??我們將使用的具體實(shí)現(xiàn)是Grad-CAM中描述的實(shí)現(xiàn):你為什么這么說(shuō)? 深度網(wǎng)絡(luò)中基于梯度的本地化的可視化解釋。 它非常簡(jiǎn)單:它包括在給定輸入圖像的情況下獲取卷積層的輸出特征圖,并通過(guò)類相對(duì)于通道的梯度對(duì)該特征圖中的每個(gè)通道進(jìn)行加權(quán)。 直覺(jué)上,理解這一技巧的一種方法是,我們通過(guò)“每個(gè)通道對(duì)于類別的重要程度”來(lái)加權(quán)“輸入圖像激活不同通道的強(qiáng)度”的空間圖,從而輸入圖像激活類的強(qiáng)烈程度”的空間圖。
??此可視化技術(shù)回答了兩個(gè)重要問(wèn)題:
??1)為什么網(wǎng)絡(luò)認(rèn)為這個(gè)圖像包含非洲象?
??2)非洲大象在哪里?
??特別值得注意的是,大象幼崽的耳朵被強(qiáng)烈激活:這可能是網(wǎng)絡(luò)如何區(qū)分非洲和印度大象的區(qū)別。
本章總結(jié)
- convnets是解決視覺(jué)分類問(wèn)題的最佳工具。
- convnets通過(guò)學(xué)習(xí)模塊化模式和概念的層次結(jié)構(gòu)來(lái)表示視覺(jué)世界。
- 他們學(xué)習(xí)的表示很容易檢查-convnets與黑盒相反!
- 現(xiàn)在能夠從頭開始培訓(xùn)自己的convnet,以解決圖像分類問(wèn)題。
- 了解如何使用可視化數(shù)據(jù)增強(qiáng)來(lái)克服過(guò)度擬合。
- 知道如何使用預(yù)訓(xùn)練的convnet進(jìn)行特征提取和微調(diào)。
- 可以生成convnets學(xué)習(xí)的過(guò)濾器的可視化,以及類活動(dòng)的heatmap。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

