知識(shí)普及:卷積神經(jīng)網(wǎng)絡(luò)模型是怎樣工作的?可以做些什么?
在走進(jìn)深度學(xué)習(xí)的過程中,最吸引作者的是一些用于給對(duì)象分類的模型。最新的科研結(jié)果表示,這類模型已經(jīng)可以在實(shí)時(shí)視頻中對(duì)多個(gè)對(duì)象進(jìn)行檢測(cè)。而這就要?dú)w功于計(jì)算機(jī)視覺領(lǐng)域最新的技術(shù)革新。
眾所周知,在過去的幾年里,卷積神經(jīng)網(wǎng)絡(luò)(CNN或ConvNet)在深度學(xué)習(xí)領(lǐng)域取得了許多重大突破,但對(duì)于大多數(shù)人而言,這個(gè)描述是相當(dāng)不直觀的。因此,要了解模型取得了怎樣大的突破,我們應(yīng)該先了解卷積神經(jīng)網(wǎng)絡(luò)是怎樣工作的。
卷積神經(jīng)網(wǎng)絡(luò)可以做些什么?
卷積神經(jīng)網(wǎng)絡(luò)用于在圖像中尋找特征。在CNN的前幾層中,神經(jīng)網(wǎng)絡(luò)可以進(jìn)行簡(jiǎn)單的“線條”和“角”的識(shí)別。我們也可以通過神經(jīng)網(wǎng)絡(luò)向下傳遞進(jìn)而識(shí)別更復(fù)雜的特征。這個(gè)屬性使得CNN能夠很好地識(shí)別圖像中的對(duì)象。
卷積神經(jīng)網(wǎng)絡(luò)
CNN是一個(gè)包含各種層的神經(jīng)網(wǎng)絡(luò),其中一些層是卷積層、池化層、激活函數(shù)。
卷積層是如何工作的?
要了解CNN如何工作,你需要了解卷積。卷積涉及瀏覽圖像和應(yīng)用濾波器等具體內(nèi)容。
上圖是一個(gè)5x5的矩陣?,F(xiàn)在,你另外選取一個(gè)3x3矩陣,然后移動(dòng)到圖像上,將3x3矩陣與被覆蓋的圖像部分相乘以生成單個(gè)值。緊接著,3x3矩陣向右和向下移動(dòng)以“覆蓋”整個(gè)圖像。最后,我們將獲得如上所示的內(nèi)容。
卷積層的目標(biāo)是過濾。濾波器是由矢量的權(quán)重堆疊乘以卷積輸出的值來表示的。當(dāng)訓(xùn)練圖像時(shí),這些權(quán)重會(huì)發(fā)生變化,也就是說當(dāng)進(jìn)行圖像評(píng)估時(shí),它會(huì)通過它捕捉到的一些特征來預(yù)測(cè)出圖像的內(nèi)容。
池化層
卷積層之后的層主要是CNN架構(gòu)中的池化層。它將輸入的圖像分割為一組不重疊的矩形,并且對(duì)于每個(gè)子區(qū)域都輸出一個(gè)值。
兩個(gè)主要的池化層是最大池和平均池。
最大池 - 輸出子區(qū)域的最大值。
平均池 - 輸出子區(qū)域的平均值。
池化層用于減少空間維度而不是深度。
減少空間維度的主要優(yōu)點(diǎn)是:
? 通過減少空間信息,可以優(yōu)化計(jì)算性能。
? 通過減少空間信息意味著你可以使用較少的參數(shù)來訓(xùn)練模型,從而減少過度擬合的可能性。
? 獲得一些固定的值。
激活函數(shù)
激活函數(shù)的工作方式與其他神經(jīng)網(wǎng)絡(luò)完全相同,該函數(shù)的主要左右是將值壓縮到一個(gè)特定的范圍內(nèi)。一些常用的激活函數(shù)是:
最常用的激活函數(shù)是ReLu激活函數(shù)。它需要輸入‘x’并判斷‘x’是否為正,如果不為正則返回0。使用ReLu函數(shù)的原因是因?yàn)樗膱?zhí)行成本很低。
上圖是卷積層的一般表示。我們通過池化層進(jìn)行了卷積和ReLu函數(shù)。這些層彼此堆疊。
雖然定義和訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)(DNN)比以往任何時(shí)候都容易,但大多數(shù)人還是會(huì)陷入誤區(qū)。
為此目的,我們使用可視化來理解CNN模型中的各種層。
使用Keras實(shí)現(xiàn)可視化
在這部分我們將嘗試使用Keras實(shí)現(xiàn)可視化。我們將使用Keras可視化輸入,最大限度地激活VGG16體系結(jié)構(gòu)的不同層中的濾波器,并對(duì)ImageNet進(jìn)行訓(xùn)練。
首先,讓我們從在Keras中定義VGG16模型開始:
請(qǐng)注意,我們只進(jìn)入最后一個(gè)卷積層。原因是添加完全連接的層會(huì)強(qiáng)制你使用模型的固定輸入大?。?24x224,原始ImageNet格式)。 通過保留卷積模塊,我們的模型可以適應(yīng)任意輸入大小。
該模型加載了一組預(yù)先在ImageNet上訓(xùn)練過的權(quán)重。
現(xiàn)在讓我們定義一個(gè)損失函數(shù),它將促進(jìn)特定層(layer_name)中的特定濾波器(filter_index)的激活。我們通過Keras后端函數(shù)執(zhí)行此操作,該函數(shù)支持我們的代碼在TensorFlow和Theano之上運(yùn)行。
一切都很簡(jiǎn)單。這里唯一的技巧是規(guī)范輸入圖像的像素梯度,以確保梯度上升足夠平滑。
現(xiàn)在我們可以使用我們定義的Keras函數(shù)在輸入空間中進(jìn)行梯度上升:
使用TensorFlow在CPU上執(zhí)行此操作需要幾秒鐘。
然后我們可以提取并顯示生成的輸入:
結(jié)果:
第一層基本上只是編碼方向和顏色。然后將這些方向和濾波器組合成基本網(wǎng)格和斑點(diǎn)紋理。這些紋理逐漸組合成越來越復(fù)雜的圖案。
你可以將每層中的濾波器視為矢量的基礎(chǔ),它通常是完整的,可用于以緊湊的方式將輸入層進(jìn)行編碼。當(dāng)濾波器開始整合來自越來越大的空間范圍的信息時(shí),濾波器會(huì)變得更加復(fù)雜。
以下是從不同層生成的要素圖的圖片:
第1層主要生成水平、垂直和對(duì)角線。主要用于檢測(cè)圖像中的邊緣。 第2層將嘗試提供更多的信息。它主要檢測(cè)角落。第3層我們開始可以檢測(cè)到一些復(fù)雜的圖案,如眼睛、臉等。我們可以假設(shè)這個(gè)特征圖是從訓(xùn)練過的人臉檢測(cè)模型中獲得的。在第4層,它可以在面部的更復(fù)雜部分(例如眼睛)。
在第5層中,你可以使用要素圖生成人的具體面孔、汽車輪胎、動(dòng)物的面孔等。此要素圖包含有關(guān)圖像中的大多數(shù)信息。