英文原文:https://www.analyticsvidhya.com/blog/2017/06/architecture-of-convolutional-neural-networks-simplified-demystified/
對原文的表達(dá)有部分改動
介紹:
今天,我將向您展示如何使用卷積神經(jīng)網(wǎng)絡(luò)并對其進(jìn)行研究。我將引導(dǎo)您完成整個旅程诫欠,以便您可以更深入了解 CNN 的工作原理冕臭。在本文中,我將討論卷積神經(jīng)網(wǎng)絡(luò)背后的架構(gòu)兑徘,該架構(gòu)旨在解決圖像識別和分類問題。我假設(shè)您對神經(jīng)網(wǎng)絡(luò)的工作原理有基本的了解。
計算機(jī)視角下的圖像
人腦是一個非常強(qiáng)大的機(jī)器男杈。我們每秒能夠看到(捕獲)多個圖像并處理它們,但人們常常沒有意識到這些處理是如何完成的调俘。但機(jī)器并非如此伶棒,圖像處理的第一步是要確定如何表示圖像以便機(jī)器可以讀取它
簡單來說,每張圖像都是由特殊順序排列的點(一個像素)組成的彩库。如果您更改像素的順序或顏色肤无,圖像也會隨之更改。假設(shè)您想存儲和讀取上面寫有數(shù)字 4 的圖像骇钦。機(jī)器基本上會將這個圖像分解成一個像素矩陣宛渐,并在每一個像素的位置存儲每個像素的顏色代碼。在下面的表示中眯搭,數(shù)字 1 是白色窥翩,而 256 是最深的綠色陰影(為了簡單起見,我將示例限制為只有一種顏色)鳞仙。
以這種格式存儲圖像后寇蚊,下一步就是讓我們的神經(jīng)網(wǎng)絡(luò)理解它的排列和模式。
如何幫助神經(jīng)網(wǎng)絡(luò)識別圖像
假設(shè)我們嘗試使用全連接(Fully Connected)的網(wǎng)絡(luò)來識別它繁扎。一個全連接的網(wǎng)絡(luò)會將這張圖像作為一個數(shù)組幔荒,將其展平(Flatten)并將像素值視為特征來預(yù)測數(shù)值糊闽。此時的網(wǎng)絡(luò)很難理解底層發(fā)生的事情。
即使是人類也無法識別這是數(shù)字 4 的表示爹梁,此時我們已經(jīng)完全喪失了像素的空間排列右犹。不妨讓我們嘗試從原始圖像中提取特征,以便保留其空間排列姚垃。
Case 1
這里我們使用了一個權(quán)重 3 來乘以初始像素值念链。
Case 2
現(xiàn)在我們可以看到,扁平化圖像完全破壞了它的排列积糯。我們需要設(shè)計一種方法來將圖像發(fā)送到網(wǎng)絡(luò)掂墓,而無需將它們展平,從而保留其空間排列看成。我們需要發(fā)送像素值的 2D/3D 排列君编。
讓我們嘗試一次取圖像的兩個像素值,而不是只取一個川慌。這將使網(wǎng)絡(luò)引入相鄰像素的關(guān)系〕院伲現(xiàn)在我們一次取兩個像素,此時需要設(shè)置兩個權(quán)重值梦重。
圖像現(xiàn)在從最初的 4 列變成了 3 列兑燥。因為我們現(xiàn)在一次移動兩個像素(像素在每次移動中共享)。我們?nèi)匀豢梢哉J(rèn)出它是數(shù)字4琴拧。此外降瞳,要意識到的一個重要事實是我們采用了兩個連續(xù)的水平像素,因此這里只考慮水平排列蚓胸。
這是從圖像中提取特征的一種方法挣饥。我們能夠很好地看到左側(cè)和中間部分,但右側(cè)不太清楚赢织。這是因為以下兩個問題——
- 圖像的最左最右列只乘以一次權(quán)重亮靴。
- 因為權(quán)重值高,左側(cè)部分仍然保留于置,而右側(cè)部分由于權(quán)重過低而略有丟失。
Case 3
讓我們來解決圖像的最左最右列只乘以一次權(quán)重
我們有一個簡單的解決方案來解決這個問題贞岭。在權(quán)重移動的兩側(cè)放置零八毯。
您可以看到,通過添加零瞄桨,角落的信息得以保留话速。圖像也擁有更大的尺寸。這可用于我們不希望圖像尺寸減小的情況芯侥。
Case 4
剩下的問題是右側(cè)的較小權(quán)重值會降低其像素值泊交,從而使我們難以識別乳讥。我們能做的是,我們在一個回合中取多個權(quán)重值并將它們放在一起廓俭。(1, 0.3) 的權(quán)重值給了我們以下形式的輸出:
而 (0.1,5) 的權(quán)重值會給我們一個形式的輸出:
這兩個圖像的組合版本將為我們提供非常清晰的圖片云石。因此,我們所做的只是使用多個權(quán)重而不是一個權(quán)重來保留有關(guān)圖像的更多信息研乒。最終輸出將是上述兩個圖像的組合版本汹忠。
Case 5
到目前為止,我們研究了水平的權(quán)重雹熬。但在大多數(shù)情況下宽菜,我們需要保留水平和垂直方向的空間排列。我們可以將權(quán)重視為一個 2D 矩陣竿报,它將水平和垂直方向的像素組合在一起铅乡。另外,請記住烈菌,由于我們同時進(jìn)行了權(quán)重的水平和垂直移動阵幸,因此輸出在水平和垂直方向上都少了一個像素。
總結(jié)
我們上面所做的是嘗試通過圖像的空間排列來從圖像中提取特征僧界。網(wǎng)絡(luò)能夠理解像素的排列方式對于圖像識別是非常重要的侨嘀。我們上面所做的正是卷積神經(jīng)網(wǎng)絡(luò)所要完成的。我們可以獲取輸入圖像捂襟,定義一個權(quán)重矩陣咬腕,然后對輸入進(jìn)行卷積以從圖像中提取特定特征,而不會丟失有關(guān)其空間排列的信息葬荷。
這種方法的另一個巨大好處是它減少了圖像中的參數(shù)數(shù)量涨共。正如您在上面看到的,與原始圖像相比宠漩,卷積圖像的像素更少举反。這大大減少了我們需要為網(wǎng)絡(luò)訓(xùn)練的參數(shù)數(shù)量。
定義卷積神經(jīng)網(wǎng)絡(luò)
我們需要三個基本組件來定義一個基本的卷積網(wǎng)絡(luò)扒吁。
- 卷積層
- 池化層(可選)
- 輸出層
卷積層
在這一層中火鼻,發(fā)生的事情正是我們在上面的 case 5 中看到的。假設(shè)我們有一個大小為 6*6 的圖像雕崩。我們定義了一個權(quán)重矩陣魁索,它從圖像中提取某些特征我們已將權(quán)重初始化為 3*3 矩陣。這個權(quán)重現(xiàn)在應(yīng)該穿過圖像盼铁,使得所有像素至少被覆蓋一次粗蔚,以提供卷積輸出。上面的值 429 是通過將權(quán)重矩陣的元素乘法與輸入圖像的突出顯示的 3*3 部分相加獲得的值而獲得的饶火。
6*6 圖像現(xiàn)在轉(zhuǎn)換為 4*4 圖像鹏控。當(dāng)權(quán)重矩陣沿圖像移動時再次使用的像素值致扯,這基本上實現(xiàn)了卷積神經(jīng)網(wǎng)絡(luò)中的參數(shù)共享。
讓我們看看它在真實圖像中的樣子当辐。
權(quán)重矩陣的作用類似于圖像中的過濾器抖僵,從原始圖像中提取特定信息。過濾器可能是為了提取邊緣瀑构,或者是提取特定顏色裆针,亦或是模糊化不需要的噪聲。
權(quán)重矩陣從原始圖像中提取有助于網(wǎng)絡(luò)正確預(yù)測圖像的特征寺晌。當(dāng)我們有多個卷積層時世吨,初始層提取更多的通用特征,而隨著網(wǎng)絡(luò)的深入呻征,權(quán)重矩陣提取的特征越來越復(fù)雜耘婚,更適合特定的問題。
stride 和 padding
正如我們在上面看到的陆赋,權(quán)重矩陣在整個圖像上移動沐祷,一次移動一個像素。我們可以像超參數(shù)一樣定義它攒岛,關(guān)于我們希望權(quán)重矩陣如何在圖像上移動赖临。如果權(quán)重矩陣一次移動 1 個像素,stride = 1灾锯。讓我們看看 stride = 2 的樣子兢榨。
如您所見,隨著 stride 的增加顺饮,圖像的大小不斷減小吵聪。用零填充輸入圖像解決了這個問題。如果步幅值更高兼雄,我們還可以在圖像周圍添加一層以上的零:
我們可以看到在用零填充圖像后如何保留圖像的初始形狀吟逝。這被稱為 same padding ,因為輸出圖像與輸入具有相同的大小赦肋。
中間的 4*4 像素是一樣的块攒。這里我們保留了更多來自邊界的信息,也保證了圖像的大小不變佃乘。
多個過濾器
權(quán)重的維度深度將與輸出圖像的維度深度相同局蚀。因此,使用單個權(quán)重矩陣進(jìn)行卷積將導(dǎo)致具有單個深度維度的卷積輸出恕稠。在大多數(shù)情況下,我們將多個相同維度的過濾器一起應(yīng)用扶欣,而不是單個過濾器(權(quán)重矩陣)鹅巍。
每個過濾器的輸出堆疊在一起形成卷積圖像的維度深度千扶。假設(shè)我們有一個大小為 32*32*3 的輸入圖像。我們應(yīng)用了 10 個大小為 5*5*3 的過濾器骆捧,并帶有 valid padding澎羞。輸出的尺寸為 28*28*10。你可以把它想象成:
池化層(The Pooling layer)
有時敛苇,當(dāng)圖像太大時妆绞,我們需要減少需訓(xùn)練參數(shù)的數(shù)量。這時需要在后續(xù)的卷積層之間周期性地引入池化層枫攀。池化的唯一目的是減少圖像的空間大小括饶。池化是在每個深度維度上獨立完成的,因此圖像的深度保持不變来涨。通常應(yīng)用的最常見的池化層形式是最大池化(MaxPooling)图焰。
這里我們將 stride 設(shè)為 2,而池化大小也設(shè)為 2蹦掐。MaxPooling 操作應(yīng)用于卷積輸出的每個深度維度技羔。可以看到卧抗,經(jīng)過 MaxPooling 操作后藤滥,4*4的卷積輸出變成了2*2。
如您所見社裆,對復(fù)雜的圖像應(yīng)用了MaxPooling拙绊。MaxPooling 的圖像仍然保留它是街道上的汽車的信息。如果仔細(xì)觀察浦马,圖像的尺寸已經(jīng)減半时呀。這有助于在很大程度上減少需訓(xùn)練的參數(shù)。
類似地晶默,也可以應(yīng)用其他形式的池化强戴,例如平均池化或 L2 范數(shù)池化。
輸出維度
理解每個卷積層末尾的輸入和輸出維度可能會讓您有點困惑分预。我決定用這幾點來讓你能夠識別輸出的維度敬察。三個超參數(shù)將控制輸出音量的大小。
- The number of filters - 輸出的深度將等于過濾器的數(shù)量币他。
- Stride – 當(dāng) Stride 為 1 時坞靶,我們將橫向和縱向移動一個像素。當(dāng)使用更高的Stride蝴悉,我們一次移動大量像素彰阴,因此產(chǎn)生更小的輸出量。
- Zero padding——這有助于我們保持輸入圖像的大小拍冠。
輸出層
卷積層和池化層只能從原始圖像中提取特征并減少參數(shù)數(shù)量尿这。然而簇抵,為了生成最終輸出,我們需要應(yīng)用一個全連接層來生成一個與我們需要的維度相等的輸出射众。僅使用卷積層就很難達(dá)到這個數(shù)字碟摆。卷積層生成 3D 激活圖,而我們只需要輸出圖像是否屬于特定類別叨橱。輸出層有一個類似于分類交叉熵的損失函數(shù)典蜕,用于計算預(yù)測誤差。一旦前向傳播完成罗洗,反向傳播開始更新權(quán)重和偏差以減少錯誤和損失愉舔。
總覽
- 我們將輸入圖像傳遞給第一個卷積層。卷積輸出作為激活圖獲得栖博。卷積層中應(yīng)用的濾波器從輸入圖像中提取相關(guān)特征以進(jìn)一步傳遞屑宠。
- 每個過濾器應(yīng)提供不同的特征以幫助正確的類別預(yù)測。如果我們需要保留圖像的大小仇让,我們使用 same padding 典奉,否則使用 valid padding,因為它有助于減少特征的數(shù)量丧叽。
- 添加池化層以進(jìn)一步減少參數(shù)數(shù)量
- 在進(jìn)行預(yù)測之前添加了幾個卷積和池化層卫玖。卷積層有助于提取特征。與提取的特征更通用的淺層網(wǎng)絡(luò)相比踊淳,隨著我們在網(wǎng)絡(luò)中深入研究假瞬,會提取出更具體的特征。
- 前面提到的 CNN 中的輸出層是一個全連接層迂尝,其中來自其他層的輸入被 Flatten 并發(fā)送脱茉,以便將輸出轉(zhuǎn)換為網(wǎng)絡(luò)所需的形式。
- 計算損失函數(shù)的值
- 反向傳播誤差以更新過濾器(權(quán)重)和偏差值垄开。
- 一個訓(xùn)練周期在一次向前和向后傳遞中完成琴许。