卷積神經網路工作原理直觀的解釋?

我目前大四,在用CNN做手寫識別畢業設計,已經接觸機器學習4個月了。但CNN是目前最讓我困惑的,其簡直就像黑匣子,只有輸入輸出,然後看看準確率,完全不清楚其內部如何由初始狀態一步步走向結果,還請能指點我幾個問題,萬分感謝!

cnn的論文卻讓我讀得稀里糊塗。在讀過相關的LeCun的論文中,有以下幾點。
1.發現其並沒有詳細的解釋內部變化。
2.對於局部到整體的變化,通過降低空間解析度來進行,其不在乎特徵的精度,而是特徵的相對位置。其由邊,角的組合從而形成特徵的相對位置(其實有N多的組合,但訓練的目的就是選擇合適的),是否是在LeNet-5的第三層和後面的全連接層進行?
3.其採用卷積核共享參數,減少了需要訓練的參數,這是主要的。但其同樣對變形、移動的圖片有很好的識別,而且還能偵查所謂的特徵,我定義6個卷積核就相當於偵查了圖片中的6個特徵,那我12個就是12個特徵了,這些特徵是什麼樣子的?在LeNet的演示頁面,我看到第一層是卷積後完整的圖片,那邊,角,在哪裡?另外,如果有,偵查的特徵和後面特徵的組合有何關係?在讀過的論文中,也只是說,實驗後這樣是可行的,但沒有具體解釋。去掉卷積,直接進行減少空間解析度,然後上全連接,這樣可行嗎?

我也實現了一個和LeNet-5相似的模型,但想來想去還是覺得只是造了個輪子,並不能理解。想把實驗里每個過程的圖片都拿出來看,可後面幾層完全不知道怎麼看。關於神經網路的數學表達能力的文章我沒有讀過,但就LeNet而言,還是上面幾個問題。我題目是自命,論文只讀過

Y. LeCun, L. Bottou, Y. Bengio, and P. Haffner. Gradient-based learning applied to document recognition.Proceedings of the IEEE, november 1998

Y. LeCun, B. Boser, J. S. Denker, D. Henderson, R. E. Howard, W. Hubbard, and L. D. Jackel. Handwritten digit recognition with a back-propagation network. In David Touretzky, editor, Advances in Neural Information Processing Systems 2 (NIPS*89), Denver, CO, 1990. Morgan Kaufman


從最基礎的開始

對二維數字信號(圖像)的操作,可以寫成矩陣形式。

比如對圖像做平滑,一個典型的8領域平滑,其結果中的每個值都來源於原對應位置和其周邊8個元素與一個3X3矩陣的乘積:

也就相當於對原矩陣,按照順序將各區域元素與W矩陣相乘,W 矩陣為

這也被稱作核(Kernel, 3X3)

其處理效果如下:

也就是,這個核對圖像進行操作,相當於對圖像進行了低通濾波。因此這個核也被稱為濾波器,整個操作過程按照概念稱為卷積。

擴展來講,對二維圖像的濾波操作可以寫成卷積,比如常見的高斯濾波、拉普拉斯濾波(運算元)等。

濾波器跟卷積神經網路有什麼關係呢。不如我們預想一個識別問題:我們要識別圖像中的某種特定曲線,也就是說,這個濾波器要對這種曲線有很高的輸出,對其他形狀則輸出很低,這也就像是神經元的激活

我們設計的濾波器和想要識別的曲線如下:

假設上面的核(濾波器)按照卷積順序沿著下圖移動:

那麼當它移動到上面的位置時,按照矩陣操作,將這個區域的圖像像素值與濾波器相乘,我們得到一個很大的值(6600):

而當這個濾波器移動到其他區域時,我們得到一個相對很小的值:

如此,我們對整個原圖進行一次卷積,得到的結果中,在那個特定曲線和周邊區域,值就很高,在其他區域,值相對低。這就是一張激活圖。對應的高值區域就是我們所要檢測曲線的位置。

在訓練卷積審計網路(CNN)的某一個卷積層時,我們實際上是在訓練一系列的濾波器(filter)。比如,對於一個32x32x3(寬32像素x高32像素xRGB三通道)的圖像,如果我們在CNN的第一個卷積層定義訓練12個濾波器,那就這一層的輸出便是32X32X12.按照不同的任務,我們可以對這個輸出做進一步的處理,這包括激活函數,池化,全連接等。

簡單來說,訓練CNN在相當意義上是在訓練每一個卷積層的濾波器。讓這些濾波器組對特定的模式有高的激活,以達到CNN網路的分類/檢測等目的。

&

卷積神經網路的第一個卷積層的濾波器用來檢測低階特徵,比如邊、角、曲線等。隨著卷積層的增加,對應濾波器檢測的特徵就更加複雜(理性情況下,也是我們想要的情況)。比如第二個卷積層的輸入實際上是第一層的輸出(濾波器激活圖),這一層的濾波器便是用來檢測低價特徵的組合等情況(半圓、四邊形等),如此累積,以檢測越來越複雜的特徵。實際上,我們的人類大腦的視覺信息處理也遵循這樣的低階特徵到高階特徵的模式(Owl of Minerva:為什麼無彩色系(黑白灰色)在色彩搭配中可以和諧地與任何彩色搭配?)。最後一層的濾波器按照訓練CNN目的的不同,可能是在檢測到人臉、手寫字體等時候激活[1]。

所以,在相當程度上,構建卷積神經網路的任務就在於構建這些濾波器。也就是,將這些濾波器變成這樣(改變濾波器矩陣的值,也就是Weight)的——能識別特定的特徵。這個過程叫做訓練

在訓練開始之時,卷積層的濾波器是完全隨機的,它們不會對任何特徵激活(不能檢測任何特徵)。這就像剛出生的孩子,TA不知道什麼是人臉、什麼是狗,什麼是上下左右。TA需要學習才知道這些概念,也就是通過接觸人臉、狗、上下左右,並被告知這些東西分別是人臉、狗、上下左右。然後TA才能在頭腦中記住這些概念,並在之後的某一次見到之後能準確的給出結果。

把一個空白的濾波其,修改其權重(weights)以使它能檢測特定的模式,整個過程就如工程裡面的反饋。

想想一下,如果有一隻無意識的猴子,完全隨機的修改一個5X5濾波器矩陣的25個值,那完全可能經過一定的輪次之後,這個濾波器能夠檢測稜角等特徵。這是一種無反饋的訓練情況。對神經網路的訓練當然不能如此,我們不可能靠運氣去做這件事情。

舉個例子,我們要訓練一個用於分類的神經網路,讓它能判定輸入圖像中的物體最可能是十個類別的哪一類。那麼,訓練過程就是這樣的:

第一次訓練,輸入一張圖像,這個圖像通過各層卷積處理輸出量一組向量[1,1,1,1,1,1,1,1,1,1], 也就是,對於完全由隨機濾波器構建的網路,其輸出認為這張圖等概率的是十個類別中的某一種。但是對於訓練,我們有一個Gound Thuth, 也就是這張圖中物體所屬的類別:[0,0,1,0,0,0,0,0,0,0],也就是屬於第三類。這時候我們可以定義一個損失函數,比如常見的MSE(mean squared error).我們假定L是這個損失函數的輸出。這時候我們的目的就是,讓L的值反饋(這種神經網路概念下稱為 back propagation, 反向傳輸)給整個卷積神經網路,以修改各個濾波器的權重,使得損失值L最小。

這是一個典型的最優化問題。當然地,在工程上我們幾乎不可能一次就把濾波器的權重W修改到使L最小的情況,而是需要多次訓練和多次修改。

如果情況理想的話,權重修改的方向是使得L的變化收斂的。這也就是說很可能達到了我們訓練這個神經網路的目的——讓各個卷積層的濾波器能夠組合起來最優化的檢測特定的模式。

--------

[1] Zeiler, M. D., Fergus, R. (2014, September). Visualizing and understanding convolutional networks. In European conference on computer vision (pp. 818-833). Springer, Cham.


這條鏈接改變了我的人生……
http://scs.ryerson.ca/~aharley/vis/conv/
不過需要電腦才能打開,不方便的童鞋吶,可以看下邊的文章預熱一下~
http://m.huxiu.com/article/138857/1.html


開始正式的答題,學歷尚淺,多有偏頗之處,還望指正

來源資料:PRML,cs231n,以及部分論文

其實我們在做線性回歸也好,分類(邏輯斯蒂回歸)也好,本質上來講,就是把數據進行映射,要麼映射到一個多個離散的標籤上,或者是連續的空間裡面,一般簡單的數據而言,我們很好擬合,只要線性變化一下,然後學習出最好的W就可以了,但是對於一些比較複雜的數據怎麼辦呢?比如說,對於一個二分類問題,特別是高緯度複雜化之後,數據不一定是線性可分的,這個時候,我們的basis function隆重登場,我們可以把數據進行一定的映射,轉變,非線性的線性的,轉變之後,就可以進行分類,最明顯的例子在andrew NG在講SVM裡面的例子就很好的說明了,但是這個時候問題來了,對於一個很複雜,高維度的數據,我們如何才能找到最好的basis function呢?這個時候,神經網路隆重登場,我們把我們的basis function打開來,我們把誤差轉遞到basis function的裡面,通過這樣的方式,來得到最好的basis function,同理,我們可以無限打開basis function,一直打開,對應的也就是一層神經網路(具體出自於prml關於神經網路的章節最開始簡介的部分),但是問題來了,對於圖片怎麼辦?我們知道,對於圖片而言,圖片是一個二維度的數據,我們怎樣才能通過學習圖片正確的模式來對於一張圖片有正確的對於圖片分類呢?這個時候,有人就提出了一個觀點,我們可以這樣,對於所有的像素,全部都連接上一個權值,我們也分很多層,然後最後進行分類,這樣也可以,但是對於一張圖片來說,像素點太多,參數太多了。然後就有人提出來,我們只看一部分怎麼樣,就是對於一張圖片來說,我們只看一個小窗口就可以了,對於其他的地方,我們也提供類似的小窗口,我們知道,當我們對圖片進行卷積的時候,我們可以對圖片進行很多操作,比如說圖片整體模糊,或者是邊緣的提取,卷積操作對於圖片來說可以很好的提取到特徵,而且通過BP誤差的傳播,我們可以根據不同任務,得到對於這個任務最好的一個參數,學習出相對於這個任務的最好的卷積核,之所以權值共享的邏輯是:如果說一個卷積核在圖片的一小塊兒區域可以得到很好的特徵,那麼在其他的地方,也可以得到很好的特徵。

這就有了alex net的提出,通過對圖片進行五層(不知道有沒有記憶錯誤)的卷積,然後後面三層的全連接,我們可以得到一個很好的結果,特別的相對於更大的數據集而言,最好參數越多越好,也就是網路最好更加深,更加的寬。

但是神經網路到底是什麼?對於一批數據我們有很多的問題,為什麼設置五層最好,batchsize多少比較好,每一層多少個卷積核(這個到現在我依舊沒有一個更好的解釋,每一個應該多少卷積核),寬度多少?要不要LRN?每一層都代表了什麼?

這些的解釋,就要好好看看今年CVPR的文章Visualizing and Understanding Convolutional Networks 這篇文章寫的很棒,而且2015 CVPR出了很多對於卷積神經網路理解的文章,這篇文章提出了一個反卷積的方法(De-convolution)的方法,這樣我們就可以好好看看每一層卷積神經網路到底做了什麼事情:

首先第一層的返卷積(上面是反卷積的圖片,下面對於第一層來說,激活值最大的圖片):

我們看到,第一個卷積層只是表達了簡單的圖片的邊緣而已,我們來看第二層:

第二層稍稍複雜了一點點,可以包含的不僅僅是一個邊緣,可以是幾個邊緣的組合

第三層:

第四層:

第五層:

我們看到,每一層都是對於一張圖片從最基礎的邊緣,不斷到最複雜的圖片自己本身。

同時在進行反卷積的時候M.D. Zeiler and R. Fergus也發現,對於第一層的alexnet,會得到頻度很高的像素(也就是顏色很深),所以他們也提出了應該要減小窗口,這樣可以得到頻度比較適中的像素:

當圖片卷積完之後,會把一個圖片對於這一類本身最獨特的部分凸顯出來,然後來進行判斷,這一類到底是什麼?有下面的實驗截圖:

最左邊的圖像是原圖像,作者蓋住不同的區域,來分析對於一張圖片,經過五次卷積之後,到底是如何判斷的,我們看到卷積到最後(左三),比較凸顯出來的是狗的頭部,左二和右二的意思是,當我們遮住不同的區域,判斷是狗的幾率,紅色區域代表概率很高,藍色區域代表概率很低,我們發現,當我們遮擋住狗的頭的地方的時候,我們得到這個物體時狗的概率最低,這個側面證明了,所謂卷積神經網路,就是會自動的對於一張圖片學習出最好的卷積核以及這些卷積核的組合方式,也就是對於一張圖片的任務來說,求出最好的圖片對於本任務的特徵的表達,然後來進行判斷

還有一篇文章也助於理解,

UnderstandingDeepImageRepresentationsbyInvertingThem

這篇對於卷積每一層都不斷的還原到最原始的圖片:

越是到後面,圖片越模糊,但是它自己獨特的部分,卻凸顯了出來。(也就是這個猩猩還是狒狒的頭的部分)

還望指正,多謝

反正我寫的也沒什麼人看,隨意幹啥都行,標明作者就好了。

最後打一個小廣告,有興趣報考人工智慧/CS碩士的童鞋,可以看看我的live

一百天,從二本到廈大 985


近日,Dishashree Gupta 在 Analyticsvidhya 上發表了一篇題為《Architecture of Convolutional Neural Networks (CNNs) demystified》的文章,對用於圖像識別和分類的卷積神經網路架構作了深度揭秘;作者在文中還作了通盤演示,期望對 CNN 的工作機制有一個深入的剖析。機器之心對本文進行了編譯,原文鏈接在此,希望對你有幫助。

機器視角:長文揭秘圖像處理和卷積神經網路架構

引言

先坦白地說,有一段時間我無法真正理解深度學習。我查看相關研究論文和文章,感覺深度學習異常複雜。我嘗試去理解神經網路及其變體,但依然感到困難。

接著有一天,我決定一步一步,從基礎開始。我把技術操作的步驟分解開來,並手動執行這些步驟(和計算),直到我理解它們如何工作。這相當費時,且令人緊張,但是結果非凡。

現在,我不僅對深度學習有了全面的理解,還在此基礎上有了好想法,因為我的基礎很紮實。隨意地應用神經網路是一回事,理解它是什麼以及背後的發生機制是另外一回事。

今天,我將與你共享我的心得,展示我如何上手卷積神經網路並最終弄明白了它。我將做一個通盤的展示,從而使你對 CNN 的工作機制有一個深入的了解。

在本文中,我將會討論 CNN 背後的架構,其設計初衷在於解決圖像識別和分類問題。同時我也會假設你對神經網路已經有了初步了解。

目錄

1.機器如何看圖?

2.如何幫助神經網路識別圖像?

3.定義卷積神經網路

  • 卷積層
  • 池化層
  • 輸出層

4.小結

5.使用 CNN 分類圖像

1. 機器如何看圖?

人類大腦是一非常強大的機器,每秒內能看(捕捉)多張圖,並在意識不到的情況下就完成了對這些圖的處理。但機器並非如此。機器處理圖像的第一步是理解,理解如何表達一張圖像,進而讀取圖片。

簡單來說,每個圖像都是一系列特定排序的圖點(像素)。如果你改變像素的順序或顏色,圖像也隨之改變。舉個例子,存儲並讀取一張上面寫著數字 4 的圖像。

基本上,機器會把圖像打碎成像素矩陣,存儲每個表示位置像素的顏色碼。在下圖的表示中,數值 1 是白色,256 是最深的綠色(為了簡化,我們示例限制到了一種顏色)。

一旦你以這種格式存儲完圖像信息,下一步就是讓神經網路理解這種排序與模式。

2. 如何幫助神經網路識別圖像?

表徵像素的數值是以特定的方式排序的。

假設我們嘗試使用全連接網路識別圖像,該如何做?

全連接網路可以通過平化它,把圖像當作一個數組,並把像素值當作預測圖像中數值的特徵。明確地說,讓網路理解理解下面圖中發生了什麼,非常的艱難。

即使人類也很難理解上圖中表達的含義是數字 4。我們完全丟失了像素的空間排列。

我們能做什麼呢?可以嘗試從原圖像中提取特徵,從而保留空間排列。

案例 1

這裡我們使用一個權重乘以初始像素值。

現在裸眼識別出這是「4」就變得更簡單了。但把它交給全連接網路之前,還需要平整化(flatten) 它,要讓我們能夠保留圖像的空間排列。

案例 2

現在我們可以看到,把圖像平整化完全破壞了它的排列。我們需要想出一種方式在沒有平整化的情況下把圖片饋送給網路,並且還要保留空間排列特徵,也就是需要饋送像素值的 2D/3D 排列。

我們可以嘗試一次採用圖像的兩個像素值,而非一個。這能給網路很好的洞見,觀察鄰近像素的特徵。既然一次採用兩個像素,那也就需要一次採用兩個權重值了

希望你能注意到圖像從之前的 4 列數值變成了 3 列。因為我們現在一次移用兩個像素(在每次移動中像素被共享),圖像變的更小了。雖然圖像變小了,我們仍能在很大程度上理解這是「4」。而且,要意識到的一個重點是,我們採用的是兩個連貫的水平像素,因此只會考慮水平的排列。

這是我們從圖像中提取特徵的一種方式。我們可以看到左邊和中間部分,但右邊部分看起來不那麼清楚。主要是因為兩個問題:

1. 圖片角落左邊和右邊是權重相乘一次得到的。

2. 左邊仍舊保留,因為權重值高;右邊因為略低的權重,有些丟失。

現在我們有兩個問題,需要兩個解決方案。

案例 3

遇到的問題是圖像左右兩角只被權重通過一次。我們需要做的是讓網路像考慮其他像素一樣考慮角落。我們有一個簡單的方法解決這一問題:把零放在權重運動的兩邊。

你可以看到通過添加零,來自角落的信息被再訓練。圖像也變得更大。這可被用於我們不想要縮小圖像的情況下。

案例 4

這裡我們試圖解決的問題是右側角落更小的權重值正在降低像素值,因此使其難以被我們識別。我們所能做的是採取多個權重值並將其結合起來。

(1,0.3) 的權重值給了我們一個輸出表格

同時表格 (0.1,5) 的權重值也將給我們一個輸出表格。

兩張圖像的結合版本將會給我們一個清晰的圖片。因此,我們所做的是簡單地使用多個權重而不是一個,從而再訓練圖像的更多信息。最終結果將是上述兩張圖像的一個結合版本。

案例 5

我們到現在通過使用權重,試圖把水平像素(horizontal pixel)結合起來。但是大多數情況下我們需要在水平和垂直方向上保持空間布局。我們採取 2D 矩陣權重,把像素在水平和垂直方向上結合起來。同樣,記住已經有了水平和垂直方向的權重運動,輸出會在水平和垂直方向上低一個像素。

特別感謝 Jeremy Howard 啟發我創作了這些圖像。

因此我們做了什麼?

上面我們所做的事是試圖通過使用圖像的空間的安排從圖像中提取特徵。為了理解圖像,理解像素如何安排對於一個網路極其重要。上面我們所做的也恰恰是一個卷積網路所做的。我們可以採用輸入圖像,定義權重矩陣,並且輸入被卷積以從圖像中提取特殊特徵而無需損失其有關空間安排的信息。

這個方法的另一個重大好處是它可以減少圖像的參數數量。正如所見,卷積圖像相比於原始圖像有更少的像素。

3.定義一個卷積神經網路

我們需要三個基本的元素來定義一個基本的卷積網路

1. 卷積層

2. 池化層(可選)

3. 輸出層

卷積層

在這一層中,實際所發生的就像我們在上述案例 5 中見到的一樣。假設我們有一個 6*6 的圖像。我們定義一個權值矩陣,用來從圖像中提取一定的特徵。

我們把權值初始化成一個 3*3 的矩陣。這個權值現在應該與圖像結合,所有的像素都被覆蓋至少一次,從而來產生一個卷積化的輸出。上述的 429,是通過計算權值矩陣和輸入圖像的 3*3 高亮部分以元素方式進行的乘積的值而得到的。

現在 6*6 的圖像轉換成了 4*4 的圖像。想像一下權值矩陣就像用來刷牆的刷子。首先在水平方向上用這個刷子進行刷牆,然後再向下移,對下一行進行水平粉刷。當權值矩陣沿著圖像移動的時候,像素值再一次被使用。實際上,這樣可以使參數在卷積神經網路中被共享。

下面我們以一個真實圖像為例。

權值矩陣在圖像里表現的像一個從原始圖像矩陣中提取特定信息的過濾器。一個權值組合可能用來提取邊緣(edge)信息,另一個可能是用來提取一個特定顏色,下一個就可能就是對不需要的噪點進行模糊化。

先對權值進行學習,然後損失函數可以被最小化,類似於多層感知機(MLP)。因此需要通過對參數進行學習來從原始圖像中提取信息,從而來幫助網路進行正確的預測。當我們有多個卷積層的時候,初始層往往提取較多的一般特徵,隨著網路結構變得更深,權值矩陣提取的特徵越來越複雜,並且越來越適用於眼前的問題。

步長(stride)和邊界(padding)的概念

像我們在上面看到的一樣,過濾器或者說權值矩陣,在整個圖像範圍內一次移動一個像素。我們可以把它定義成一個超參數(hyperparameter),從而來表示我們想讓權值矩陣在圖像內如何移動。如果權值矩陣一次移動一個像素,我們稱其步長為 1。下面我們看一下步長為 2 時的情況。

你可以看見當我們增加步長值的時候,圖像的規格持續變小。在輸入圖像四周填充 0 邊界可以解決這個問題。我們也可以在高步長值的情況下在圖像四周填加不只一層的 0 邊界。

我們可以看見在我們給圖像填加一層 0 邊界後,圖像的原始形狀是如何被保持的。由於輸出圖像和輸入圖像是大小相同的,所以這被稱為 same padding。

這就是 same padding(意味著我們僅考慮輸入圖像的有效像素)。中間的 4*4 像素是相同的。這裡我們已經利用邊界保留了更多信息,並且也已經保留了圖像的原大小。

多過濾與激活圖

需要記住的是權值的縱深維度(depth dimension)和輸入圖像的縱深維度是相同的。權值會延伸到輸入圖像的整個深度。因此,和一個單一權值矩陣進行卷積會產生一個單一縱深維度的卷積化輸出。大多數情況下都不使用單一過濾器(權值矩陣),而是應用維度相同的多個過濾器。

每一個過濾器的輸出被堆疊在一起,形成卷積圖像的縱深維度。假設我們有一個 32*32*3 的輸入。我們使用 5*5*3,帶有 valid padding 的 10 個過濾器。輸出的維度將會是 28*28*10。

如下圖所示:

激活圖是卷積層的輸出。

池化層

有時圖像太大,我們需要減少訓練參數的數量,它被要求在隨後的卷積層之間周期性地引進池化層。池化的唯一目的是減少圖像的空間大小。池化在每一個縱深維度上獨自完成,因此圖像的縱深保持不變。池化層的最常見形式是最大池化。

在這裡,我們把步幅定為 2,池化尺寸也為 2。最大化執行也應用在每個卷機輸出的深度尺寸中。正如你所看到的,最大池化操作後,4*4 卷積的輸出變成了 2*2。

讓我們看看最大池化在真實圖片中的效果如何。

正如你看到的,我們卷積了圖像,並最大池化了它。最大池化圖像仍然保留了汽車在街上的信息。如果你仔細觀察的話,你會發現圖像的尺寸已經減半。這可以很大程度上減少參數。

同樣,其他形式的池化也可以在系統中應用,如平均池化和 L2 規範池化。

輸出維度

理解每個卷積層輸入和輸出的尺寸可能會有點難度。以下三點或許可以讓你了解輸出尺寸的問題。有三個超參數可以控制輸出卷的大小。

1. 過濾器數量-輸出卷的深度與過濾器的數量成正比。請記住該如何堆疊每個過濾器的輸出以形成激活映射。激活圖的深度等於過濾器的數量。

2. 步幅(Stride)-如果步幅是 1,那麼我們處理圖片的精細度就進入單像素級別了。更高的步幅意味著同時處理更多的像素,從而產生較小的輸出量。

3. 零填充(zero padding)-這有助於我們保留輸入圖像的尺寸。如果添加了單零填充,則單步幅過濾器的運動會保持在原圖尺寸。

我們可以應用一個簡單的公式來計算輸出尺寸。輸出圖像的空間尺寸可以計算為([W-F + 2P] / S)+1。在這裡,W 是輸入尺寸,F 是過濾器的尺寸,P 是填充數量,S 是步幅數字。假如我們有一張 32*32*3 的輸入圖像,我們使用 10 個尺寸為 3*3*3 的過濾器,單步幅和零填充。

那麼 W=32,F=3,P=0,S=1。輸出深度等於應用的濾波器的數量,即 10,輸出尺寸大小為 ([32-3+0]/1)+1 = 30。因此輸出尺寸是 30*30*10。

輸出層

在多層卷積和填充後,我們需要以類的形式輸出。卷積和池化層只會提取特徵,並減少原始圖像帶來的參數。然而,為了生成最終的輸出,我們需要應用全連接層來生成一個等於我們需要的類的數量的輸出。僅僅依靠卷積層是難以達到這個要求的。卷積層可以生成 3D 激活圖,而我們只需要圖像是否屬於一個特定的類這樣的內容。輸出層具有類似分類交叉熵的損失函數,用於計算預測誤差。一旦前向傳播完成,反向傳播就會開始更新權重與偏差,以減少誤差和損失。

4. 小結

正如你所看到的,CNN 由不同的卷積層和池化層組成。讓我們看看整個網路是什麼樣子:

  • 我們將輸入圖像傳遞到第一個卷積層中,卷積後以激活圖形式輸出。圖片在卷積層中過濾後的特徵會被輸出,並傳遞下去。
  • 每個過濾器都會給出不同的特徵,以幫助進行正確的類預測。因為我們需要保證圖像大小的一致,所以我們使用同樣的填充(零填充),否則填充會被使用,因為它可以幫助減少特徵的數量。
  • 隨後加入池化層進一步減少參數的數量。
  • 在預測最終提出前,數據會經過多個卷積和池化層的處理。卷積層會幫助提取特徵,越深的卷積神經網路會提取越具體的特徵,越淺的網路提取越淺顯的特徵。
  • 如前所述,CNN 中的輸出層是全連接層,其中來自其他層的輸入在這裡被平化和發送,以便將輸出轉換為網路所需的參數。
  • 隨後輸出層會產生輸出,這些信息會互相比較排除錯誤。損失函數是全連接輸出層計算的均方根損失。隨後我們會計算梯度錯誤。
  • 錯誤會進行反向傳播,以不斷改進過濾器(權重)和偏差值。
  • 一個訓練周期由單次正向和反向傳遞完成。

5. 在 KERAS 中使用 CNN 對圖像進行分類

讓我們嘗試一下,輸入貓和狗的圖片,讓計算機識別它們。這是圖像識別和分類的經典問題,機器在這裡需要做的是看到圖像,並理解貓與狗的不同外形特徵。這些特徵可以是外形輪廓,也可以是貓的鬍鬚之類,卷積層會攫取這些特徵。讓我們把數據集拿來試驗一下吧。

以下這些圖片均來自數據集。

我們首先需要調整這些圖像的大小,讓它們形狀相同。這是處理圖像之前通常需要做的,因為在拍照時,讓照下的圖像都大小相同幾乎不可能。

為了簡化理解,我們在這裡只用一個卷積層和一個池化層。注意:在 CNN 的應用階段,這種簡單的情況是不會發生的。

#import various packagesimport osimport numpy as npimport pandas as pdimport scipyimport sklearnimport kerasfrom keras.models import Sequentialimport cv2from skimage import io
%matplotlib inline

#Defining the File Path

cat=os.listdir("/mnt/hdd/datasets/dogs_cats/train/cat")
dog=os.listdir("/mnt/hdd/datasets/dogs_cats/train/dog")
filepath="/mnt/hdd/datasets/dogs_cats/train/cat/"filepath2="/mnt/hdd/datasets/dogs_cats/train/dog/"#Loading the Images

images=[]
label = []for i in cat:
image = scipy.misc.imread(filepath+i)
images.append(image)
label.append(0) #for cat imagesfor i in dog:
image = scipy.misc.imread(filepath2+i)
images.append(image)
label.append(1) #for dog images

#resizing all the imagesfor i in range(0,23000):
images[i]=cv2.resize(images[i],(300,300))

#converting images to arrays

images=np.array(images)
label=np.array(label)

# Defining the hyperparameters

filters=10filtersize=(5,5)

epochs =5batchsize=128input_shape=(300,300,3)

#Converting the target variable to the required sizefrom keras.utils.np_utils import to_categorical
label = to_categorical(label)

#Defining the model

model = Sequential()

model.add(keras.layers.InputLayer(input_shape=input_shape))

model.add(keras.layers.convolutional.Conv2D(filters, filtersize, strides=(1, 1), padding="valid", data_format="channels_last", activation="relu"))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Flatten())

model.add(keras.layers.Dense(units=2, input_dim=50,activation="softmax"))

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(images, label, epochs=epochs, batch_size=batchsize,validation_split=0.3)

model.summary()

在這一模型中,我只使用了單一卷積和池化層,可訓練參數是 219,801。很好奇如果我在這種情況使用了 MLP 會有多少參數。通過增加更多的卷積和池化層,你可以進一步降低參數的數量。我們添加的卷積層越多,被提取的特徵就會更具體和複雜。

在該模型中,我只使用了一個卷積層和池化層,可訓練參數量為 219,801。如果想知道使用 MLP 在這種情況下會得到多少,你可以通過加入更多卷積和池化層來減少參數的數量。越多的卷積層意味著提取出來的特徵更加具體,更加複雜。

結語

希望本文能夠讓你認識卷積神經網路,這篇文章沒有深入 CNN 的複雜數學原理。如果希望增進了解,你可以嘗試構建自己的卷積神經網路,藉此來了解它運行和預測的原理。

本文首發於微信公眾號:機器之心(almosthuman2014),如需轉載,請私信聯繫,感謝。


談點個人理解,佔個坑。
按照我的理解,CNN的核心其實就是卷積核的作用,只要明白了這個問題,其餘的就都是數學坑了(當然,相比較而言之後的數學坑更難)。

如果學過數字圖像處理,對於卷積核的作用應該不陌生,比如你做一個最簡單的方向濾波器,那就是一個二維卷積核,這個核其實就是一個模板,利用這個模板再通過卷積計算的定義就可以計算出一幅新的圖像,新的圖像會把這個卷積核所體現的特徵突出顯示出來。比如這個卷積核可以偵測水平紋理,那捲積出來的圖就是原圖水平紋理的圖像。

現在假設要做一個圖像的分類問題,比如辨別一個圖像里是否有一隻貓,我們可以先判斷是否有貓的頭,貓的尾巴,貓的身子等等,如果這些特徵都具備,那麼我就判定這應該是一隻貓(如果用心的話你就會發現這就是CNN最後的分類層,這一部分是我們傳統的神經網路的範疇)。關鍵在於這些特徵是高級的語義特徵,這種特徵怎麼用卷積核提取呢?

原來的卷積核都是人工事先定義好的,是經過演算法設計人員精心設計的,他們發現這樣或那樣的設計卷積核通過卷積運算可以突出一個什麼樣的特徵,於是就高高興興的拿去卷積了。但是現在我們所需要的這種特徵太高級了,而且隨任務的不同而不同,人工設計這樣的卷積核非常困難。

於是,利用機器學習的思想,我們可以讓他自己去學習出卷積核來!也就是學習出特徵!

如前所述,判斷是否是一隻貓,只有一個特徵不夠,比如僅僅有貓頭是不足的,因此需要多個高級語義特徵的組合,所以應該需要多個卷積核,這就是為什麼需要學習多個卷積核的原因。

還有一個問題,那就是為什麼CNN要設計這麼多層呢?首先,應該要明白,貓的頭是一個特徵,但是對於充斥著像素點的圖像來說,用幾個卷積核直接判斷存在一個貓頭的還是太困難,怎麼辦?簡單,把貓頭也作為一個識別目標,比如貓頭應該具有更底層的一些語義特徵,比如應該有貓的眼睛、貓的耳朵、貓的鼻子等等。這些特徵有的還是太高級了,沒關係,繼續向下尋找低級特徵,一直到最低級的像素點,這樣就構成了多層的神經網路。

最好,CNN最不好理解的就要放大招了。雖然我們之前一直用一些我們人常見的語義特徵做例子,但是實際上CNN會學習出貓頭、貓尾巴、貓身然後經判定這是貓嗎?顯然我們的CNN完全不知道什麼叫貓頭、貓尾巴,也就是說,CNN不知道什麼是貓頭貓尾巴,它學習到的只是一種抽象特徵,甚至可能有些特徵在現實世界並沒有對應的名詞,但是這些特徵組合在一起計算機就會判定這是一隻貓!關於這一點,確實有些難以理解,比如一個人判斷貓是看看有沒有貓頭、貓身子、貓尾巴,但是另一個選取的特徵就是有沒有貓的毛,貓的爪子,還有的人更加奇怪,他會去通過這張圖像里是不是有老鼠去判斷,而我們的CNN,則是用它自己學習到的特徵去判斷。

———————————分割線——————————————————————

最近又看了一些資料,在此糾正和闡明一些問題。

目前CNN的可視化是一個很火的方向了,有些論文中已經提到了中間的卷積層特徵其實也是具有現實的語義意義的,但是只是不那麼清晰。

CNN稱之為深度學習,要義就在這個深字上,對於CNN而言,這個深其實就是意味著層層的特徵表示。比如淺層的特徵,例如點、線、面之類的簡單幾何形狀,都是在底層訓練出來的,對於這些底層的特徵繼續進行組合表示,就是後面的若干層的任務。最後把從低級特徵組合而來的高級特徵在進一步變成語義特徵,就可以使用全連接層進行分類了。也就是說,最後一次分類並不一定要用神經網路,如果已經拿到了足夠好的特徵信息,使用其餘的分類器也未嘗不可。

這就是為什麼CNN可以fine-tune的原因,例如你要完成一個分類貓和狗的任務,你需要從頭訓練一個CNN網路嗎?假設你的貓狗圖片樣本量並不是很大,這並不是一個好主意。好的辦法是,拿一個經過大型圖像數據集,你如ImageNet,訓練過的大規模CNN(比如VGG NET)直接載入訓練,這個過程稱之為fine-tuning。因為這個CNN底層已經訓練到了豐富的細節信息,你所需要訓練的其實是上層對這些特徵的組合信息,以及最後全連接層的分類信息,所以完全不需要從頭再來。這也證明了CNN確實可以有遷移學習的能力。

———————————分割線——————————————————————

之前有一點沒有說,今天沒啥事補充一下,也算是做個記錄。

CNN的部件其實大致分為三個,卷積層、池化層、全連接層,這也是LeNet-5的經典結構,之後大部分CNN網路其實都是在這三個基本部件上做各種組合和改進。卷積層之前已經介紹過了,全連接層就是連在最後的分類器,是一個普通的bp網路,實際上如果訓練得到的特徵足夠好,這裡也可以選擇其他的分類器,比如SVM等。

那麼池化層是幹什麼的呢?池化,英文是pooling,字面上看挺難懂,但其實這可能是CNN里最簡單的一步了。我們可以不按字面理解,把它理解成下採樣(subsampling)。池化分為最大值池化和平均值池化,和卷積差不多,也是取一小塊區域,比如一個5*5的方塊,如果是最大值池化,那就選這25個像素點最大的那個輸出,如果是平均值池化,就把25個像素點取平均輸出。

這樣做有什麼好處呢?1、應該很明顯可以看出,圖像經過了下採樣尺寸縮小了,按上面的例子,原來5*5的一個區域,現在只要一個值就表示出來了!2、增強了旋轉不變性,池化操作可以看做是一種強制性的模糊策略,舉個不恰當的例子,假設一個貓的圖片,貓的耳朵應該處於左上5*5的一個小區域內(實際上貓的耳朵不可能這麼小),無論這個耳朵如何旋轉,經過池化之後結果都是近似的,因為就是這一塊取平均和取最大對旋轉並不care。

當然和之前的卷積一樣,池化也是層層遞進的,底層的池化是在模糊底層特徵,如線條等,高層的池化模糊了高級語義特徵,如貓耳朵。所以,一般的CNN架構都是三明治一樣,卷積池化交替出現,保證提取特徵的同時也強制模糊增加特徵的旋轉不變性。


更新一下比較advantage的東西。

現代CNN相比於之前的遠古CNN發生了很大變化,雖然這裡的遠古CNN大約在2014年論文中出現,距今也只有不到4年時間。這裡也可以看出深度學習的發展日新月異,一日千里的可怕速度。

理解了本身CNN的基礎含義,再來看看這些先進的CNN,是很有必要的,不要指望只靠卷積層池化層就可以得到好的效果,後來加入CNN的trick不計其數,而且也都是里程碑式的成果。下面主要以圖像分類的CNN來闡述。

暴力加深流派:以AlexNet和VGGNet為首的模型,這一派觀點很直接,就是不斷交替使用卷積層池化層,暴力增加網路層數,最後接一下全連接層分類。這類模型在CNN早期是主流,特點是參數量大,尤其是後面的全連接層,幾乎佔了一般參數量。而且相比於後續的模型,效果也較差。因此這類模型後續慢慢銷聲匿跡了。

Inception流派:谷歌流派,這一派最早起源於NIN,稱之為網路中的網路,後被谷歌發展成Inception模型(這個單詞真的不好翻譯。。。)。這個模型的特點是增加模型的寬度,使得模型不僅僅越長越高,還越長越胖。也就是說每一層不再用單一的卷積核卷積,而是用多個尺度的卷積核試試。顯然,如果你熟悉CNN,就不難發現,這樣做會使每一層的feature map數量猛增,因為一種尺寸的卷積核就能卷出一系列的feature map,何況多個!這裡google使用了1*1的卷積核專門用來降channel。谷歌的特點是一個模型不玩到爛絕不算完,所以又發展出了Inception v2、Inception v3、Inception v4等等。

殘差流派:2015年ResNet橫空出世,開創了殘差網路。使用殘差直連邊跨層連接,居然得到了意想不到的好效果。最重要的是,這一改進幾乎徹底突破了層數的瓶頸,1000層的resnet不是夢!之後,最新的DenseNet喪心病狂地在各個層中間都引入了殘差連接。目前大部分模型都在嘗試引入殘差連接。

注意,到此為止,大部分模型已經丟棄了全連接層,改為全局平均池化。大大降低了參數量。

混合流派:這一派不說了,就是看到哪幾類模型效果好,就把這類技術混雜起來。典型的就是Xception和ResIception,將Inception和殘差網路結合起來了。

BatchNromalization:不得不提這個批量標準化技術,在此技術出現之前,CNN收斂很慢,此技術出現後,大大加快了模型收斂速度,還兼具一定的防過擬合效果。當然,這個技術不僅僅限於CNN。


cnn的核心在於卷積核,其實關於卷積核還有另一個名字叫做濾波器,從信號處理的角度而言,濾波器是對信號做頻率篩選,這裡主要是空間-頻率的轉換,cnn的訓練就是找到最好的濾波器使得濾波後的信號更容易分類,還可以從模版匹配的角度看卷積,每個卷積核都可以看成一個特徵模版,訓練就是為了找到最適合分類的特徵模版,一點淺見。


該文是卷積神經網路--介紹,並假設你理解前饋神經網路。

如果不是,強烈建議你讀完如何簡單形象又有趣地講解神經網路是什麼? 後再來讀該篇。

目錄

  • 視覺感知
    • 畫面識別是什麼
    • 識別結果取決於什麼
  • 圖像表達
    • 畫面識別的輸入
    • 畫面不變形
  • 前饋神經網路做畫面識別的不足
  • 卷積神經網路做畫面識別
    • 局部連接
    • 空間共享
    • 輸出空間表達
    • Depth維的處理
    • Zero padding
    • 形狀、概念抓取
    • 多filters
    • 非線性
    • 輸出尺寸控制
    • 矩陣乘法執行卷積
    • Max pooling
    • 全連接層
    • 結構發展
  • 畫面不變性的滿足
    • 平移不變性
    • 旋轉和視角不變性
    • 尺寸不變性
    • Inception的理解
    • 1x1卷積核理解
    • 跳層連接ResNet

視覺感知

一、畫面識別是什麼任務?

學習知識的第一步就是明確任務,清楚該知識的輸入輸出。卷積神經網路最初是服務於畫面識別的,所以我們先來看看畫面識別的實質是什麼。

先觀看幾組動物與人類視覺的差異對比圖。

1. 蒼蠅的視覺和人的視覺的差異

2. 蛇的視覺和人的視覺的差異

(更多對比圖請參考鏈接)

通過上面的兩組對比圖可以知道,即便是相同的圖片經過不同的視覺系統,也會得到不同的感知。

這裡引出一條知識:生物所看到的景象並非世界的原貌,而是長期進化出來的適合自己生存環境的一種感知方式。 蛇的獵物一般是夜間行動,所以它就進化出了一種可以在夜間也能很好觀察的感知系統,感熱。

任何視覺系統都是將圖像反光與腦中所看到的概念進行關聯。

所以畫面識別實際上並非識別這個東西客觀上是什麼,而是尋找人類的視覺關聯方式,並再次應用。 如果我們不是人類,而是蛇類,那麼畫面識別所尋找的 就和現在的不一樣。

畫面識別實際上是尋找(學習)人類的視覺關聯方式 ,並再次應用

二、圖片被識別成什麼取決於哪些因素?

下面用兩張圖片來體會識別結果取決於哪些因素。

1. 老婦與少女

請觀察上面這張圖片,你看到的是老婦還是少女? 以不同的方式去觀察這張圖片會得出不同的答案。 圖片可以觀察成有大鼻子、大眼睛的老婦。也可以被觀察成少女,但這時老婦的嘴會被識別成少女脖子上的項鏈,而老婦的眼睛則被識別為少女的耳朵。

2. 海豚與男女

上面這張圖片如果是成人觀察,多半看到的會是一對親熱的男女。倘若兒童看到這張圖片,看到的則會是一群海豚(男女的輪廓是由海豚構造出的)。所以,識別結果受年齡,文化等因素的影響,換句話說:

圖片被識別成什麼不僅僅取決於圖片本身,還取決於圖片是如何被觀察的。

圖像表達

我們知道了「畫面識別是從大量的(x,y)數據中尋找人類的視覺關聯方式 ,並再次應用。 其x-是輸入,表示所看到的東西y-輸出,表示該東西是什麼。

在自然界中,x是物體的反光,那麼在計算機中,圖像又是如何被表達和存儲的呢?

[from]

圖像在計算機中是一堆按順序排列的數字,數值為0到255。0表示最暗,255表示最亮。 你可以把這堆數字用一個長長的向量來表示,也就是tensorflow的mnist教程中784維向量的表示方式。 然而這樣會失去平面結構的信息,為保留該結構信息,通常選擇矩陣的表示方式:28x28的矩陣。

上圖是只有黑白顏色的灰度圖,而更普遍的圖片表達方式是RGB顏色模型,即紅(Red)、綠(Green)、藍(Blue)三原色的色光以不同的比例相加,以產生多種多樣的色光。

這樣,RGB顏色模型中,單個矩陣就擴展成了有序排列的三個矩陣,也可以用三維張量去理解,其中的每一個矩陣又叫這個圖片的一個channel。

在電腦中,一張圖片是數字構成的「長方體」。可用 寬width, 高height, 深depth 來描述,如圖。

畫面識別的輸入x是shape為(width, height, depth)的三維張量。

接下來要考慮的就是該如何處理這樣的「數字長方體」。

畫面不變性

在決定如何處理「數字長方體」之前,需要清楚所建立的網路擁有什麼樣的特點。 我們知道一個物體不管在畫面左側還是右側,都會被識別為同一物體,這一特點就是不變性(invariance),如下圖所示。

我們希望所建立的網路可以儘可能的滿足這些不變性特點。

為了理解卷積神經網路對這些不變性特點的貢獻,我們將用不具備這些不變性特點的前饋神經網路來進行比較。

圖片識別--前饋神經網路

方便起見,我們用depth只有1的灰度圖來舉例。 想要完成的任務是:在寬長為4x4的圖片中識別是否有下圖所示的「橫折」。 圖中,黃色圓點表示值為0的像素,深色圓點表示值為1的像素。 我們知道不管這個橫折在圖片中的什麼位置,都會被認為是相同的橫折。

若訓練前饋神經網路來完成該任務,那麼表達圖像的三維張量將會被攤平成一個向量,作為網路的輸入,即(width, height, depth)為(4, 4, 1)的圖片會被展成維度為16的向量作為網路的輸入層。再經過幾層不同節點個數的隱藏層,最終輸出兩個節點,分別表示「有橫折的概率」和「沒有橫折的概率」,如下圖所示。

下面我們用數字(16進位)對圖片中的每一個像素點(pixel)進行編號。 當使用右側那種物體位於中間的訓練數據來訓練網路時,網路就只會對編號為5,6,9,a的節點的權重進行調節。 若讓該網路識別位於右下角的「橫折」時,則無法識別。

解決辦法是用大量物體位於不同位置的數據訓練,同時增加網路的隱藏層個數從而擴大網路學習這些變體的能力。

然而這樣做十分不效率,因為我們知道在左側的「橫折」也好,還是在右側的「橫折」也罷,大家都是「橫折」。 為什麼相同的東西在位置變了之後要重新學習?有沒有什麼方法可以將中間所學到的規律也運用在其他的位置? 換句話說,也就是讓不同位置用相同的權重

圖片識別--卷積神經網路

卷積神經網路就是讓權重在不同位置共享的神經網路。

局部連接

在卷積神經網路中,我們先選擇一個局部區域,用這個局部區域去掃描整張圖片。 局部區域所圈起來的所有節點會被連接到下一層的一個節點上。

為了更好的和前饋神經網路做比較,我將這些以矩陣排列的節點展成了向量。 下圖展示了被紅色方框所圈中編號為0,1,4,5的節點是如何通過w_1,w_2,w_3,w_4連接到下一層的節點0上的。

這個帶有連接強弱的紅色方框就叫做 filterkernelfeature detector。 而filter的範圍叫做filter size,這裡所展示的是2x2的filter size。

left[ egin{matrix} w_1w_2\ w_3w_4\ end{matrix} 
ight] (1)

第二層的節點0的數值就是局部區域的線性組合,即被圈中節點的數值乘以對應的權重後相加。 用x表示輸入值,y表示輸出值,用圖中標註數字表示角標,則下面列出了兩種計算編號為0的輸出值y_0的表達式。

註:在局部區域的線性組合後,也會和前饋神經網路一樣,加上一個偏移量b_0

egin{split} y_0 = x_0*w_1 + x_1*w_2+ x_4*w_3+ x_5*w_4+b_0\y_0 = left[ egin{matrix} w_1w_2 w_3w_4 end{matrix} 
ight] cdot left[ egin{matrix} x_0\ x_1\ x_4\ x_5\ end{matrix} 
ight]+b_0 end{split} (2)

空間共享

當filter掃到其他位置計算輸出節點y_i 時,w_1,w_2,w_3,w_4包括b_0是共用的。

下面這張動態圖展示了當filter掃過不同區域時,節點的鏈接方式。 動態圖的最後一幀則顯示了所有連接。 可以注意到,每個輸出節點並非像前饋神經網路中那樣與全部的輸入節點連接,而是部分連接。 這也就是為什麼大家也叫前饋神經網路(feedforward neural network)為fully-connected neural network。 圖中顯示的是一步一步的移動filter來掃描全圖,一次移動多少叫做stride。

空間共享也就是卷積神經網路所引入的先驗知識。

輸出表達

如先前在圖像表達中提到的,圖片不用向量去表示是為了保留圖片平面結構的信息。 同樣的,卷積後的輸出若用上圖的排列方式則丟失了平面結構信息。 所以我們依然用矩陣的方式排列它們,就得到了下圖所展示的連接。

這也就是你們在網上所看到的下面這張圖。在看這張圖的時候請結合上圖的連接一起理解,即輸入(綠色)的每九個節點連接到輸出(粉紅色)的一個節點上的。

經過一個feature detector計算後得到的粉紅色區域也叫做一個「Convolved Feature」 或 「Activation Map」 或 「Feature Map」。

Depth維的處理

現在我們已經知道了depth維度只有1的灰度圖是如何處理的。 但前文提過,圖片的普遍表達方式是下圖這樣有3個channels的RGB顏色模型。 當depth為複數的時候,每個feature detector是如何卷積的?

現象:2x2所表達的filter size中,一個2表示width維上的局部連接數,另一個2表示height維上的局部連接數,並卻沒有depth維上的局部連接數,是因為depth維上並非局部,而是全部連接的。

在2D卷積中,filter在張量的width維, height維上是局部連接,在depth維上是貫串全部channels的。

類比:想像在切蛋糕的時候,不管這個蛋糕有多少層,通常大家都會一刀切到底,但是在長和寬這兩個維上是局部切割。

下面這張圖展示了,在depth為複數時,filter是如何連接輸入節點到輸出節點的。 圖中紅、綠、藍顏色的節點表示3個channels。 黃色節點表示一個feature detector卷積後得到的Feature Map。 其中被透明黑框圈中的12個節點會被連接到黃黑色的節點上。

  • 在輸入depth為1時:被filter size為2x2所圈中的4個輸入節點連接到1個輸出節點上。
  • 在輸入depth為3時:被filter size為2x2,但是貫串3個channels後,所圈中的12個輸入節點連接到1個輸出節點上。
  • 在輸入depth為n時:2x2xn個輸入節點連接到1個輸出節點上。

(可從vectary在3D編輯下查看)

注意:三個channels的權重並不共享。 即當深度變為3後,權重也跟著擴增到了三組,如式子(3)所示,不同channels用的是自己的權重。 式子中增加的角標r,g,b分別表示red channel, green channel, blue channel的權重。

left[ egin{matrix} w_{r1}w_{r2}\ w_{r3}w_{r4}\ end{matrix} 
ight], left[ egin{matrix} w_{g1}w_{g2}\ w_{g3}w_{g4}\ end{matrix} 
ight], left[ egin{matrix} w_{b1}w_{b2}\ w_{b3}w_{b4}\ end{matrix} 
ight] (3)

計算例子:用x_{r0}表示red channel的編號為0的輸入節點,x_{g5}表示green channel編號為5個輸入節點。x_{b1}表示blue channel。如式子(4)所表達,這時的一個輸出節點實際上是12個輸入節點的線性組合。

egin{split} y_0 = x_{r0}*w_{r1} + x_{r1}*w_{r2}+ x_{r4}*w_{r3}+ x_{r5}*w_{r4}+ x_{g0}*w_{g1} + x_{g1}*w_{g2}+ x_{g4}*w_{g3}+ x_{g5}*w_{g4}+ x_{b0}*w_{b1} + x_{b1}*w_{b2}+ x_{b4}*w_{b3}+ x_{b5}*w_{b4}+b_0\y_0 = left[ egin{matrix} w_{r1}w_{r2} w_{r3}w_{r4} end{matrix} 
ight] cdot left[ egin{matrix} x_{r0}\ x_{r1}\ x_{r4}\ x_{r5}\ end{matrix} 
ight] +left[ egin{matrix} w_{g1}w_{g2} w_{g3}w_{g4} end{matrix} 
ight] cdot left[ egin{matrix} x_{g0}\ x_{g1}\ x_{g4}\ x_{g5}\ end{matrix} 
ight]+left[ egin{matrix} w_{b1}w_{b2} w_{b3}w_{b4} end{matrix} 
ight] cdot left[ egin{matrix} x_{b0}\ x_{b1}\ x_{b4}\ x_{b5}\ end{matrix} 
ight]+b_0end{split}(4)

當filter掃到其他位置計算輸出節點y_i時,那12個權重在不同位置是共用的,如下面的動態圖所展示。 透明黑框圈中的12個節點會連接到被白色邊框選中的黃色節點上。

每個filter會在width維, height維上,以局部連接和空間共享,並貫串整個depth維的方式得到一個Feature Map。

Zero padding

細心的讀者應該早就注意到了,4x4的圖片被2x2的filter卷積後變成了3x3的圖片,每次卷積後都會小一圈的話,經過若干層後豈不是變的越來越小? Zero padding就可以在這時幫助控制Feature Map的輸出尺寸,同時避免了邊緣信息被一步步捨棄的問題。

例如:下面4x4的圖片在邊緣Zero padding一圈後,再用3x3的filter卷積後,得到的Feature Map尺寸依然是4x4不變。

通常大家都想要在卷積時保持圖片的原始尺寸。 選擇3x3的filter和1的zero padding,或5x5的filter和2的zero padding可以保持圖片的原始尺寸。 這也是為什麼大家多選擇3x3和5x5的filter的原因。 另一個原因是3x3的filter考慮到了像素與其距離為1以內的所有其他像素的關係,而5x5則是考慮像素與其距離為2以內的所有其他像素的關係。

尺寸:Feature Map的尺寸等於(input_size + 2 * padding_size ? filter_size)/stride+1。

注意:上面的式子是計算width或height一維的。padding_size也表示的是單邊補零的個數。例如(4+2-3)/1+1 = 4,保持原尺寸。

不用去背這個式子。其中(input_size + 2 * padding_size)是經過Zero padding擴充後真正要卷積的尺寸。 減去 filter_size後表示可以滑動的範圍。 再除以可以一次滑動(stride)多少後得到滑動了多少次,也就意味著得到了多少個輸出節點。 再加上第一個不需要滑動也存在的輸出節點後就是最後的尺寸。

形狀、概念抓取

知道了每個filter在做什麼之後,我們再來思考這樣的一個filter會抓取到什麼樣的信息。

我們知道不同的形狀都可由細小的「零件」組合而成的。比如下圖中,用2x2的範圍所形成的16種形狀可以組合成格式各樣的「更大」形狀。

卷積的每個filter可以探測特定的形狀。又由於Feature Map保持了抓取後的空間結構。若將探測到細小圖形的Feature Map作為新的輸入再次卷積後,則可以由此探測到「更大」的形狀概念。 比如下圖的第一個「大」形狀可由2,3,4,5基礎形狀拼成。第二個可由2,4,5,6組成。第三個可由6,1組成。

除了基礎形狀之外,顏色、對比度等概念對畫面的識別結果也有影響。卷積層也會根據需要去探測特定的概念。

可以從下面這張圖中感受到不同數值的filters所卷積過後的Feature Map可以探測邊緣,稜角,模糊,突出等概念。

[from]

如我們先前所提,圖片被識別成什麼不僅僅取決於圖片本身,還取決於圖片是如何被觀察的。

而filter內的權重矩陣W是網路根據數據學習得到的,也就是說,我們讓神經網路自己學習以什麼樣的方式去觀察圖片。

拿老婦與少女的那幅圖片舉例,當標籤是少女時,卷積網路就會學習抓取可以成少女的形狀、概念。 當標籤是老婦時,卷積網路就會學習抓取可以成老婦的形狀、概念。

下圖展現了在人臉識別中經過層層的卷積後,所能夠探測的形狀、概念也變得越來越抽象和複雜。

卷積神經網路會儘可能尋找最能解釋訓練數據的抓取方式。

多filters

每個filter可以抓取探測特定的形狀的存在。 假如我們要探測下圖的長方框形狀時,可以用4個filters去探測4個基礎「零件」。

因此我們自然而然的會選擇用多個不同的filters對同一個圖片進行多次抓取。 如下圖(動態圖過大,如果顯示不出,請看到該鏈接觀看),同一個圖片,經過兩個(紅色、綠色)不同的filters掃描過後可得到不同特點的Feature Maps。 每增加一個filter,就意味著你想讓網路多抓取一個特徵。

[from]

這樣卷積層的輸出也不再是depth為1的一個平面,而是和輸入一樣是depth為複數的長方體。

如下圖所示,當我們增加一個filter(紫色表示)後,就又可以得到一個Feature Map。 將不同filters所卷積得到的Feature Maps按順序堆疊後,就得到了一個卷積層的最終輸出。

卷積層的輸入是長方體,輸出也是長方體。

這樣卷積後輸出的長方體可以作為新的輸入送入另一個卷積層中處理。

加入非線性

和前饋神經網路一樣,經過線性組合和偏移後,會加入非線性增強模型的擬合能力。

將卷積所得的Feature Map經過ReLU變換(elementwise)後所得到的output就如下圖所展示。

[from]

輸出長方體

現在我們知道了一個卷積層的輸出也是一個長方體。 那麼這個輸出長方體的(width, height, depth)由哪些因素決定和控制。

這裡直接用CS231n的Summary:

計算例子:請體會CS231n的Convolution Demo部分的演示。

矩陣乘法執行卷積

如果按常規以掃描的方式一步步計算局部節點和filter的權重的點乘,則不能高效的利用GPU的並行能力。 所以更普遍的方法是用兩個大矩陣的乘法來一次性囊括所有計算。

因為卷積層的每個輸出節點都是由若干個輸入節點的線性組合所計算。 因為輸出的節點個數是W_2 	imes H_2	imes D_2,所以就有W_2 	imes H_2	imes D_2個線性組合。

讀過我寫的線性代數教程的讀者請回憶,矩陣乘矩陣的意義可以理解為批量的線性組合按順序排列。 其中一個矩陣所表示的信息是多組權重,另一個矩陣所表示的信息是需要進行組合的向量。 大家習慣性的把組成成分放在矩陣乘法的右邊,而把權重放在矩陣乘法的左邊。 所以這個大型矩陣乘法可以用W_{row}cdot X_{col}表示,其中W_{row}X_{col}都是矩陣。

卷積的每個輸出是由局部的輸入節點和對應的filter權重展成向量後所計算的,如式子(2)。 那麼W_{row}中的每一行則是每個filter的權重,有Fcdot F cdot D_1個; 而X_{col}的每一列是所有需要進行組合的節點(上面的動態圖中被黑色透明框圈中的節點),也有Fcdot F cdot D_1個。 X_{col}的列的個數則表示每個filter要滑動多少次才可以把整個圖片掃描完,有W_2cdot H_2次。 因為我們有多個filters,W_{row}的行的個數則是filter的個數K

最後我們得到:

W_{row} in R^{K 	imes Fcdot F cdot D_1}

X_{col} in R^{Fcdot F cdot D_1 	imes W_2cdot H_2}

W_{row}cdot X_{col} in R^{K 	imes W_2cdot H_2}

當然矩陣乘法後需要將W_{row}cdot X_{col}整理成形狀為W_2 	imes H_2	imes D_2的三維張量以供後續處理(如再送入另一個卷積層)。 X_{col}則也需要逐步的局部滑動圖片,最後堆疊構成用於計算矩陣乘法的形式。

Max pooling

在卷積後還會有一個pooling的操作,儘管有其他的比如average pooling等,這裡只提max pooling。

max pooling的操作如下圖所示:整個圖片被不重疊的分割成若干個同樣大小的小塊(pooling size)。每個小塊內只取最大的數字,再捨棄其他節點後,保持原有的平面結構得出output。

[from]

max pooling在不同的depth上是分開執行的,且不需要參數控制。 那麼問題就max pooling有什麼作用?部分信息被捨棄後難道沒有影響嗎?

[from]

Max pooling的主要功能是downsampling,卻不會損壞識別結果。 這意味著卷積後的Feature Map中有對於識別物體不必要的冗餘信息。 那麼我們就反過來思考,這些「冗餘」信息是如何產生的。

直覺上,我們為了探測到某個特定形狀的存在,用一個filter對整個圖片進行逐步掃描。但只有出現了該特定形狀的區域所卷積獲得的輸出才是真正有用的,用該filter卷積其他區域得出的數值就可能對該形狀是否存在的判定影響較小。 比如下圖中,我們還是考慮探測「橫折」這個形狀。 卷積後得到3x3的Feature Map中,真正有用的就是數字為3的那個節點,其餘數值對於這個任務而言都是無關的。 所以用3x3的Max pooling後,並沒有對「橫折」的探測產生影響。 試想在這裡例子中如果不使用Max pooling,而讓網路自己去學習。 網路也會去學習與Max pooling近似效果的權重。因為是近似效果,增加了更多的parameters的代價,卻還不如直接進行Max pooling。

Max pooling還有類似「選擇句」的功能。假如有兩個節點,其中第一個節點會在某些輸入情況下最大,那麼網路就只在這個節點上流通信息;而另一些輸入又會讓第二個節點的值最大,那麼網路就轉而走這個節點的分支。

但是Max pooling也有不好的地方。因為並非所有的抓取都像上圖的極端例子。有些周邊信息對某個概念是否存在的判定也有影響。 並且Max pooling是對所有的Feature Maps進行等價的操作。就好比用相同網孔的漁網打魚,一定會有漏網之魚。

全連接層

當抓取到足以用來識別圖片的特徵後,接下來的就是如何進行分類。 全連接層(也叫前饋層)就可以用來將最後的輸出映射到線性可分的空間。 通常卷積網路的最後會將末端得到的長方體平攤(flatten)成一個長長的向量,並送入全連接層配合輸出層進行分類。

卷積神經網路大致就是covolutional layer, pooling layer, ReLu layer, fully-connected layer的組合,例如下圖所示的結構。

[from]

這裡也體現了深層神經網路或deep learning之所以稱deep的一個原因:模型將特徵抓取層和分類層合在了一起。 負責特徵抓取的卷積層主要是用來學習「如何觀察」。

下圖簡述了機器學習的發展,從最初的人工定義特徵再放入分類器的方法,到讓機器自己學習特徵,再到如今盡量減少人為干涉的deep learning。

[from]

結構發展

以上介紹了卷積神經網路的基本概念。 以下是幾個比較有名的卷積神經網路結構,詳細的請看CS231n。

  • LeNet:第一個成功的卷積神經網路應用
  • AlexNet:類似LeNet,但更深更大。使用了層疊的卷積層來抓取特徵(通常是一個卷積層馬上一個max pooling層)
  • ZF Net:增加了中間卷積層的尺寸,讓第一層的stride和filter size更小。
  • GoogLeNet:減少parameters數量,最後一層用max pooling層代替了全連接層,更重要的是Inception-v4模塊的使用。
  • VGGNet:只使用3x3 卷積層和2x2 pooling層從頭到尾堆疊。
  • ResNet:引入了跨層連接和batch normalization。
  • DenseNet:將跨層連接從頭進行到尾。

總結一下:這些結構的發展趨勢有:

  • 使用small filter size的卷積層和pooling
  • 去掉parameters過多的全連接層
  • Inception(稍後會對其中的細節進行說明)
  • 跳層連接

不變性的滿足

接下來會談談我個人的,對於畫面不變性是如何被卷積神經網路滿足的想法。 同時結合不變性,對上面提到的結構發展的重要變動進行直覺上的解讀。

需要明白的是為什麼加入不變性可以提高網路表現。 並不是因為我們用了更炫酷的處理方式,而是加入了先驗知識,無需從零開始用數據學習,節省了訓練所需數據量。 思考表現提高的原因一定要從訓練所需要的數據量切入。 提出滿足新的不變性特點的神經網路是計算機視覺的一個主要研究方向。

平移不變性

可以說卷積神經網路最初引入局部連接和空間共享,就是為了滿足平移不變性。

因為空間共享,在不同位置的同一形狀就可以被等價識別,所以不需要對每個位置都進行學習。

旋轉和視角不變性

個人覺得卷積神經網路克服這一不變性的主要手段還是靠大量的數據。 並沒有明確加入「旋轉和視角不變性」的先驗特性。

Deformable Convolutional Networks似乎是對此變性進行了進行增強。

尺寸不變性

與平移不變性不同,最初的卷積網路並沒有明確照顧尺寸不變性這一特點。

我們知道filter的size是事先選擇的,而不同的尺寸所尋找的形狀(概念)範圍不同。

從直觀上思考,如果選擇小範圍,再一步步通過組合,仍然是可以得到大範圍的形狀。 如3x3尺寸的形狀都是可以由2x2形狀的圖形組合而成。所以形狀的尺寸不變性對卷積神經網路而言並不算問題。 這恐怕ZF Net讓第一層的stride和filter size更小,VGGNet將所有filter size都設置成3x3仍可以得到優秀結果的一個原因。

但是,除了形狀之外,很多概念的抓取通常需要考慮一個像素與周邊更多像素之間的關係後得出。 也就是說5x5的filter也是有它的優點。 同時,小尺寸的堆疊需要很多個filters來共同完成,如果需要抓取的形狀恰巧在5x5的範圍,那麼5x5會比3x3來的更有效率。 所以一次性使用多個不同filter size來抓取多個範圍不同的概念是一種順理成章的想法,而這個也就是Inception。 可以說Inception是為了尺寸不變性而引入的一個先驗知識。

Inception

下圖是Inception的結構,儘管也有不同的版本,但是其動機都是一樣的:消除尺寸對於識別結果的影響,一次性使用多個不同filter size來抓取多個範圍不同的概念,並讓網路自己選擇需要的特徵。

你也一定注意到了藍色的1x1卷積,撇開它,先看左邊的這個結構。

輸入(可以是被卷積完的長方體輸出作為該層的輸入)進來後,通常我們可以選擇直接使用像素信息(1x1卷積)傳遞到下一層,可以選擇3x3卷積,可以選擇5x5卷積,還可以選擇max pooling的方式downsample剛被卷積後的feature maps。 但在實際的網路設計中,究竟該如何選擇需要大量的實驗和經驗的。 Inception就不用我們來選擇,而是將4個選項給神經網路,讓網路自己去選擇最合適的解決方案。

接下來我們再看右邊的這個結構,多了很多藍色的1x1卷積。 這些1x1卷積的作用是為了讓網路根據需要能夠更靈活的控制數據的depth的。

1x1卷積核

如果卷積的輸出輸入都只是一個平面,那麼1x1卷積核並沒有什麼意義,它是完全不考慮像素與周邊其他像素關係。 但卷積的輸出輸入是長方體,所以1x1卷積實際上是對每個像素點,在不同的channels上進行線性組合(信息整合),且保留了圖片的原有平面結構,調控depth,從而完成升維或降維的功能。

如下圖所示,如果選擇2個filters的1x1卷積層,那麼數據就從原本的depth 3 降到了2。若用4個filters,則起到了升維的作用。

這就是為什麼上面Inception的4個選擇中都混合一個1x1卷積,如右側所展示的那樣。 其中,綠色的1x1卷積本身就1x1卷積,所以不需要再用另一個1x1卷積。 而max pooling用來去掉卷積得到的Feature Map中的冗餘信息,所以出現在1x1卷積之前,緊隨剛被卷積後的feature maps。(由於沒做過實驗,不清楚調換順序會有什麼影響。)

跳層連接

前饋神經網路也好,卷積神經網路也好,都是一層一層逐步變換的,不允許跳層組合。 但現實中是否有跳層組合的現象?

比如說我們在判斷一個人的時候,很多時候我們並不是觀察它的全部,或者給你的圖片本身就是殘缺的。 這時我們會靠單個五官,外加這個人的著裝,再加他的身形來綜合判斷這個人,如下圖所示。 這樣,即便圖片本身是殘缺的也可以很好的判斷它是什麼。 這和前饋神經網路的先驗知識不同,它允許不同層級之間的因素進行信息交互、綜合判斷。

殘差網路就是擁有這種特點的神經網路。大家喜歡用identity mappings去解釋為什麼殘差網路更優秀。 這裡我只是提供了一個以先驗知識的角度去理解的方式。 需要注意的是每一層並不會像我這裡所展示的那樣,會形成明確的五官層。 只是有這樣的組合趨勢,實際無法保證神經網路到底學到了什麼內容。

用下圖舉一個更易思考的例子。 圖形1,2,3,4,5,6是第一層卷積層抓取到的概念。 圖形7,8,9是第二層卷積層抓取到的概念。 圖形7,8,9是由1,2,3,4,5,6的基礎上組合而成的。

但當我們想要探測的圖形10並不是單純的靠圖形7,8,9組成,而是第一個卷積層的圖形6和第二個卷積層的8,9組成的話,不允許跨層連接的卷積網路不得不用更多的filter來保持第一層已經抓取到的圖形信息。並且每次傳遞到下一層都需要學習那個用於保留前一層圖形概念的filter的權重。 當層數變深後,會越來越難以保持,還需要max pooling將冗餘信息去掉。

一個合理的做法就是直接將上一層所抓取的概念也跳層傳遞給下下一層,不用讓其每次都重新學習。 就好比在編程時構建了不同規模的functions。 每個function我們都是保留,而不是重新再寫一遍。提高了重用性。

同時,因為ResNet使用了跳層連接的方式。也不需要max pooling對保留低層信息時所產生的冗餘信息進行去除。

Inception中的第一個1x1的卷積通道也有類似的作用,但是1x1的卷積仍有權重需要學習。 並且Inception所使用的結合方式是concatenate的合併成一個更大的向量的方式,而ResNet的結合方式是sum。 兩個結合方式各有優點。 concatenate當需要用不同的維度去組合成新觀念的時候更有益。 而sum則更適用於並存的判斷。比如既有油頭髮,又有胖身軀,同時穿著常年不洗的牛仔褲,三個不同層面的概念並存時,該人會被判定為程序員的情況。 又比如雙向LSTM中正向和逆向序列抓取的結合常用相加的方式結合。在語音識別中,這表示既可以正向抓取某種特徵,又可以反向抓取另一種特徵。當兩種特徵同時存在時才會被識別成某個特定聲音。

在下圖的ResNet中,前一層的輸入會跳過部分卷積層,將底層信息傳遞到高層。

在下圖的DenseNet中,底層信息會被傳遞到所有的後續高層。

後續

隨著時間推移,各個ResNet,GoogLeNet等框架也都在原有的基礎上進行了發展和改進。 但基本都是上文描述的概念的組合使用加上其他的tricks。

如下圖所展示的,加入跳層連接的Inception-ResNet。

但對我而言,

真正重要的是這些技巧對於各種不變性的滿足。

深度學習通俗易懂教程專欄超智能體 - 知乎專欄

閱讀列表:

  1. 深層神經網路:深層學習為何要「Deep」(上)(由於下篇寫的並不通俗,不推薦閱讀,用公開課代替)
  2. 反向傳播演算法實例:未編寫
  3. 深度學習總覽:公開課:深層神經網路設計理念
  4. 深度學習入門誤區:知乎Live(公開課涵蓋了Live的內容,若覺得作者辛苦也可參加。算了,還是不要參加了!)
  5. Tensorflow :TensorFlow整體把握
  6. 前饋神經網路(1):前饋神經網路--代碼LV1
  7. 前饋神經網路(2):前饋神經網路--代碼LV2
  8. 前饋神經網路(3):前饋神經網路--代碼LV3
  9. 循環神經網路(1):循環神經網路--介紹
  10. 循環神經網路(2):循環神經網路--實現LSTM
  11. 循環神經網路(3):循環神經網路--scan實現LSTM
  12. 循環神經網路(4):循環神經網路--雙向GRU
  13. 卷積神經網路(1):卷積神經網路--介紹

更新2016、4、29
內容大概就這樣了,需要補充什麼歡迎評論。
……………………………………………
…………轉載請註明出處…………
………………………………………………

說一下我的個人理解,
錯誤與不足之處請各位指正。

一 卷積

1 什麼是圖像卷積?

圖像是一個二維的離散信號,對圖像卷積,就是求卷積核作用在圖像後得到的圖像對於該卷積核的累加響應。
比如,Sobel運算元可以得到圖像的邊緣。

2 為什麼進行圖像卷積?

我們人看到一幅圖像,眨眼之間就知道圖像中有什麼,圖像中的主體在幹什麼。但計算機不同,計算機看到的每一副圖像都是一個數字矩陣。那我們怎麼讓計算機從一個個數字矩陣中得到有用的信息呢,比如邊緣,角點?更甚一點,怎麼讓計算機理解圖像呢?

對圖像進行卷積,就是接近目標的第一步。

二 一個簡單的分類處理流程

在計算機真正理解圖像之前,我們先讓計算機知道一幅圖像中是貓 ,另一副是狗 。我們以分類為例進行後續介紹。

分類問題,在機器學習中就是典型的監督學習問題。

這裡,我按照cs231n上舉的例子介紹一個簡單的圖像分類流程。
我們用曼哈頓或者歐氏距離加上最或者K近鄰分類器分類器分類。

訓練階段
用最近鄰分類器做分類時,訓練階段非常簡單。我們只是讀取圖片,並記住每張圖片的類標。
測試階段
我們對每一張測試圖像遍歷整個樣本集,找到和它最或者前K個相似的圖像。

相似怎麼度量?就是簡單的用L1或L2距離。而整個過程中到底使用L1還是L2,是最近鄰還是K近鄰,K到底取多少?這些都是參數,也就是調參需要調的東西。

顯然,用K近鄰分類器的優點是訓練階段毫不費事,但是測試階段隨著樣本集的增大可是要了命了。然而,CNN與之相反,它的訓練過程較為漫長,而測試階段時耗很少。

三 傳統方法

這裡,我介紹一個簡單的貓狗分類任務。
假設,我們拿到了許多張貓和狗的圖像。
訓練階段
1 首先進行一些簡單的圖像預處理,諸如平滑,去噪,光照歸一化等等。
2 提取一些諸如SIFT, HOG, LBP特徵。
2.5 這一步可有可無,就是對特徵進行編碼,比如常用BoW,FisherVector等。
3 將特徵放到一個分類器,比如SVM,進行2分類,訓練出最優分類面。
測試階段
1,2 和訓練階段相同。
3 用剛才訓練好的分類器做出決策。

但是,關鍵問題是:這些手工設計的特徵,是不是真的對分類有利呢?可不可以讓機器自己學習出對分類有利的特徵呢?
我們引入卷積神經網路。

四 基於CNN的圖像分類

我們第三部分介紹了傳統方法下的圖像分類流程:特徵提取+特徵表達+分類。而CNN將這些步驟合併到一個統一整體中(當然你也可以用CNN來提取特徵用其他分類器訓練分類)。
CNN自YannLecun的手寫字元識別及AlexNet在ImageNet奪冠後聲名大噪,廣泛運用到很多圖像分類的場景中。
4.1 卷積層
下面,我簡單卷積層的相關知識。
4.1.1 權值共享和權值共享
CNN的局部連接和權值共享通過卷積核來實現,卷積核也就是「感受野」,感受野使得訓練參數,訓練複雜度大為減少。(具體怎麼算可以參考LeNet5)
4.1.2 降採樣
降採樣主要體現在池化層,或稱為降採樣層中。使得特徵映射的resolution再次減少。而不論是Pooling層還是卷積層,步長stride也是降採樣的有力手段。
4.2 激活函數層
為什麼要激活函數?為什麼要非線性的激活函數?
因為沒有激活函數,或者激活函數是線性的,就算你億萬層的神經網路相當於沒有!!!
4.3 分類層
CNN分類中,常見的分類函數就是多項邏輯斯蒂回歸模型,Softmax回歸模型。它是基於概率的分類模型,利用最小化負對數似然函數來優化。
5 直觀的理解
排名第一的答案裡面的圖片是一個簡單的說明,簡單的概括就是CNN是一個層級遞增的結構,像人理解文章一樣,先逐字逐句,再段落大意,再全文的理解,CNN也是從像素,邊緣,局部形狀一直到整體形狀的感知
還有很多很有意思的工作,比如某些神經元只對某些圖像特徵感興趣啊。。。。。。
有需要的同學可以自己explore more!

就這樣,有幫助請點贊。


通過一個圖像分類問題介紹卷積神經網路是如何工作的。下面是卷積神經網路判斷一個圖片是否包含「兒童」的過程,包括四個步驟:圖像輸入(Input Image)→卷積(Convolution)→最大池化(Max Pooling)→全連接神經網路(Fully-Connected Neural Network)計算。

首先將圖片分割成如圖19的重疊的獨立小塊;圖19中,這張照片被分割成了77張大小相同的小圖片。

接下來將每一個獨立小塊輸入小的神經網路;這個小的神經網路已經被訓練用來判斷一個圖片是否屬於「兒童」類別,它輸出的是一個特徵數組。

標準的數碼相機有紅、綠、藍三個通道(Channels),每一種顏色的像素值在0-255之間,構成三個堆疊的二維矩陣;灰度圖像則只有一個通道,可以用一個二維矩陣來表示。

將所有的獨立小塊輸入小的神經網路後,再將每一個輸出的特徵數組按照第一步時77個獨立小塊的相對位置做排布,得到一個新數組。

第二步中,這個小的神經網路對這77張大小相同的小圖片都進行同樣的計算,也稱權重共享(Shared Weights)。這樣做是因為,第一,對圖像等數組數據來說,局部數組的值經常是高度相關的,可以形成容易被探測到的獨特的局部特徵;第二,圖像和其它信號的局部統計特徵與其位置是不太相關的,如果特徵圖能在圖片的一個部分出現,也能出現在任何地方。所以不同位置的單元共享同樣的權重,並在數組的不同部分探測相同的模式。數學上,這種由一個特徵圖執行的過濾操作是一個離散的卷積,卷積神經網路由此得名。

卷積步驟完成後,再使用Max Pooling演算法來縮減像素採樣數組,按照2×2來分割特徵矩陣,分出的每一個網格中只保留最大值數組,丟棄其它數組,得到最大池化數組(Max-Pooled Array)。

接下來將最大池化數組作為另一個神經網路的輸入,這個全連接神經網路會最終計算出此圖是否符合預期的判斷。

在實際應用時,卷積、最大池化和全連接神經網路計算,這幾步中的每一步都可以多次重複進行,總思路是將大圖片不斷壓縮,直到輸出單一的值。使用更多卷積步驟,神經網路就可以處理和學習更多的特徵。

原文鏈接:人工智慧綜述及技術實現 | 愛就投研究


我感覺 CNN 的卷積層就是一個基於濾波器的圖像處理器。圖像處理領域使用一些人們預先定義好的濾波器起到模糊圖像、識別邊緣等操作。CNN 就是把濾波器也納入學習過程,把它們當作可訓練的參數。這樣在 CNN 的靠近輸入圖像的那部分(卷積層)就可以認為訓練出來了一些濾波器,這些濾波器濾出來的圖像再送往網路後端——一個類似傳統神經網路的分類器。


至於那些訓練出來的濾波器是起什麼作用的,那就有點黑盒的意思了。常見的濾波器:高通、低通、高斯模糊、SOBEL 查找邊緣 ... 這些,是白盒。是人有目的設計出來的。CNN 卷積層的那些濾波器則是根據訓練樣本擬合出來的。用這些訓練得到的濾波器去濾一濾圖像看看,也許能看出其中一些濾波器的「目的」。


你們這些回答很容易被研究者july抄到博客裡面去的 (`_′)ゞ


以下我從The Data Science Blog轉載一篇解釋卷積神經網路的好文章,圖文並茂,通俗易懂。作者:Ujjwal Karn ,簡介:the data science blog 。文章原鏈接:An Intuitive Explanation of Convolutional Neural Networks


An Intuitive Explanation of Convolutional Neural Networks


Posted on August 11, 2016 by ujjwalkarn


What are Convolutional Neural Networks and why are they important?

Convolutional Neural Networks (ConvNets or CNNs) are a category of Neural Networks that have proven very effective in areas such as image recognition and classification. ConvNets have been successful in identifying faces, objects and traffic signs apart from powering vision in robots and self driving cars.

Figure 1: Source [1]


In Figure 1 above, a ConvNet is able to recognize scenes and the system is able to suggest relevant tags such as 『bridge』, 『railway』 and 『tennis』 while Figure 2 shows an example of ConvNets being used for recognizing everyday objects, humans and animals. Lately, ConvNets have been effective in several Natural Language Processing tasks (such as sentence classification) as well.

Figure 2: Source [2]


ConvNets, therefore, are an important tool for most machine learning practitioners today. However, understanding ConvNets and learning to use them for the first time can sometimes be an intimidating experience. The primary purpose of this blog post is to develop an understanding of how Convolutional Neural Networks work on images.

If you are new to neural networks in general, I would recommend reading this short tutorial on Multi Layer Perceptrons to get an idea about how they work, before proceeding. Multi Layer Perceptrons are referred to as 「Fully Connected Layers」 in this post.


The LeNet Architecture (1990s)

LeNet was one of the very first convolutional neural networks which helped propel the field of Deep Learning. This pioneering work by Yann LeCun was named LeNet5 after many previous successful iterations since the year 1988 [3]. At that time the LeNet architecture was used mainly for character recognition tasks such as reading zip codes, digits, etc.

Below, we will develop an intuition of how the LeNet architecture learns to recognize images. There have been several new architectures proposed in the recent years which are improvements over the LeNet, but they all use the main concepts from the LeNet and are relatively easier to understand if you have a clear understanding of the former.

Figure 3: A simple ConvNet. Source [5]


The Convolutional Neural Network in Figure 3 is similar in architecture to the original LeNet and classifies an input image into four categories: dog, cat, boat or bird (the original LeNet was used mainly for character recognition tasks). As evident from the figure above, on receiving a boat image as input, the network correctly assigns the highest probability for boat (0.94) among all four categories. The sum of all probabilities in the output layer should be one (explained later in this post).

There are four main operations in the ConvNet shown in Figure 3 above:

  1. Convolution
  2. Non Linearity (ReLU)
  3. Pooling or Sub Sampling
  4. Classification (Fully Connected Layer)

These operations are the basic building blocks of every Convolutional Neural Network, so understanding how these work is an important step to developing a sound understanding of ConvNets. We will try to understand the intuition behind each of these operations below.

Images are a matrix of pixel values

Essentially, every image can be represented as a matrix of pixel values.

Figure 4: Every image is a matrix of pixel values. Source [6]


Channel is a conventional term used to refer to a certain component of an image. An image from a standard digital camera will have three channels – red, green and blue – you can imagine those as three 2d-matrices stacked over each other (one for each color), each having pixel values in the range 0 to 255.

A grayscale image, on the other hand, has just one channel. For the purpose of this post, we will only consider grayscale images, so we will have a single 2d matrix representing an image. The value of each pixel in the matrix will range from 0 to 255 – zero indicating black and 255 indicating white.


The Convolution Step

ConvNets derive their name from the 「convolution」 operator. The primary purpose of Convolution in case of a ConvNet is to extract features from the input image. Convolution preserves the spatial relationship between pixels by learning image features using small squares of input data. We will not go into the mathematical details of Convolution here, but will try to understand how it works over images.

As we discussed above, every image can be considered as a matrix of pixel values. Consider a 5 x 5 image whose pixel values are only 0 and 1 (note that for a grayscale image, pixel values range from 0 to 255, the green matrix below is a special case where pixel values are only 0 and 1):

Also, consider another 3 x 3 matrix as shown below:

Then, the Convolution of the 5 x 5 image and the 3 x 3 matrix can be computed as shown in the animation in Figure 5 below:

Figure 5: The Convolution operation. The output matrix is called Convolved Feature or Feature Map. Source [7]


Take a moment to understand how the computation above is being done. We slide the orange matrix over our original image (green) by 1 pixel (also called 『stride』) and for every position, we compute element wise multiplication (between the two matrices) and add the multiplication outputs to get the final integer which forms a single element of the output matrix (pink). Note that the 3×3 matrix 「sees」 only a part of the input image in each stride.

In CNN terminology, the 3×3 matrix is called a 『filter『 or 『kernel』 or 『feature detector』 and the matrix formed by sliding the filter over the image and computing the dot product is called the 『Convolved Feature』 or 『Activation Map』 or the 『Feature Map『. It is important to note that filters acts as feature detectors from the original input image.

It is evident from the animation above that different values of the filter matrix will produce different Feature Maps for the same input image. As an example, consider the following input image:

In the table below, we can see the effects of convolution of the above image with different filters. As shown, we can perform operations such as Edge Detection, Sharpen and Blur just by changing the numeric values of our filter matrix before the convolution operation [8] – this means that different filters can detect different features from an image, for example edges, curves etc. More such examples are available in Section 8.2.4 here.

Another good way to understand the Convolution operation is by looking at the animation in Figure 6 below:

Figure 6: The Convolution Operation. Source [9]


A filter (with red outline) slides over the input image (convolution operation) to produce a feature map. The convolution of another filter (with the green outline), over the same image gives a different feature map as shown. It is important to note that the Convolution operation captures the local dependencies in the original image. Also notice how these two different filters generate different feature maps from the same original image. Remember that the image and the two filters above are just numeric matrices as we have discussed above.

In practice, a CNN learns the values of these filters on its own during the training process (although we still need to specify parameters such as number of filters, filter size, architecture of the network etc. before the training process). The more number of filters we have, the more image features get extracted and the better our network becomes at recognizing patterns in unseen images.

The size of the Feature Map (Convolved Feature) is controlled by three parameters [4] that we need to decide before the convolution step is performed:

  • Depth: Depth corresponds to the number of filters we use for the convolution operation. In the network shown in Figure 7, we are performing convolution of the original boat image using three distinct filters, thus producing three different feature maps as shown. You can think of these three feature maps as stacked 2d matrices, so, the 『depth』 of the feature map would be three.

Figure 7

  • Stride: Stride is the number of pixels by which we slide our filter matrix over the input matrix. When the stride is 1 then we move the filters one pixel at a time. When the stride is 2, then the filters jump 2 pixels at a time as we slide them around. Having a larger stride will produce smaller feature maps.
  • Zero-padding: Sometimes, it is convenient to pad the input matrix with zeros around the border, so that we can apply the filter to bordering elements of our input image matrix. A nice feature of zero padding is that it allows us to control the size of the feature maps. Adding zero-padding is also called wide convolution, and not using zero-padding would be a narrow convolution. This has been explained clearly in [14].

Introducing Non Linearity (ReLU)

An additional operation called ReLU has been used after every Convolution operation in Figure 3 above. ReLU stands for Rectified Linear Unit and is a non-linear operation. Its output is given by:

Figure 8: the ReLU operation


ReLU is an element wise operation (applied per pixel) and replaces all negative pixel values in the feature map by zero. The purpose of ReLU is to introduce non-linearity in our ConvNet, since most of the real-world data we would want our ConvNet to learn would be non-linear (Convolution is a linear operation – element wise matrix multiplication and addition, so we account for non-linearity by introducing a non-linear function like ReLU).

The ReLU operation can be understood clearly from Figure 9 below. It shows the ReLU operation applied to one of the feature maps obtained in Figure 6 above. The output feature map here is also referred to as the 『Rectified』 feature map.

Figure 9: ReLU operation. Source [10]


Other non linear functions such as tanh or sigmoid can also be used instead of ReLU, but ReLU has been found to perform better in most situations.


The Pooling Step

Spatial Pooling (also called subsampling or downsampling) reduces the dimensionality of each feature map but retains the most important information. Spatial Pooling can be of different types: Max, Average, Sum etc.

In case of Max Pooling, we define a spatial neighborhood (for example, a 2×2 window) and take the largest element from the rectified feature map within that window. Instead of taking the largest element we could also take the average (Average Pooling) or sum of all elements in that window. In practice, Max Pooling has been shown to work better.

Figure 10 shows an example of Max Pooling operation on a Rectified Feature map (obtained after convolution + ReLU operation) by using a 2×2 window.

Figure 10: Max Pooling. Source [4]


We slide our 2 x 2 window by 2 cells (also called 『stride』) and take the maximum value in each region. As shown in Figure 10, this reduces the dimensionality of our feature map.

In the network shown in Figure 11, pooling operation is applied separately to each feature map (notice that, due to this, we get three output maps from three input maps).

Figure 11: Pooling applied to Rectified Feature Maps


Figure 12 shows the effect of Pooling on the Rectified Feature Map we received after the ReLU operation in Figure 9 above.

Figure 12: Pooling. Source [10]


The function of Pooling is to progressively reduce the spatial size of the input representation [4]. In particular, pooling

  • makes the input representations (feature dimension) smaller and more manageable
  • reduces the number of parameters and computations in the network, therefore, controlling overfitting [4]
  • makes the network invariant to small transformations, distortions and translations in the input image (a small distortion in input will not change the output of Pooling – since we take the maximum / average value in a local neighborhood).
  • helps us arrive at an almost scale invariant representation of our image (the exact term is 「equivariant」). This is very powerful since we can detect objects in an image no matter where they are located (read [18] and [19] for details).

Story so far

Figure 13


So far we have seen how Convolution, ReLU and Pooling work. It is important to understand that these layers are the basic building blocks of any CNN. As shown in Figure 13, we have two sets of Convolution, ReLU Pooling layers – the 2nd Convolution layer performs convolution on the output of the first Pooling Layer using six filters to produce a total of six feature maps. ReLU is then applied individually on all of these six feature maps. We then perform Max Pooling operation separately on each of the six rectified feature maps.

Together these layers extract the useful features from the images, introduce non-linearity in our network and reduce feature dimension while aiming to make the features somewhat equivariant to scale and translation [18].

The output of the 2nd Pooling Layer acts as an input to the Fully Connected Layer, which we will discuss in the next section.


Fully Connected Layer

The Fully Connected layer is a traditional Multi Layer Perceptron that uses a softmax activation function in the output layer (other classifiers like SVM can also be used, but will stick to softmax in this post). The term 「Fully Connected」 implies that every neuron in the previous layer is connected to every neuron on the next layer. I recommend reading this post if you are unfamiliar with Multi Layer Perceptrons.

The output from the convolutional and pooling layers represent high-level features of the input image. The purpose of the Fully Connected layer is to use these features for classifying the input image into various classes based on the training dataset. For example, the image classification task we set out to perform has four possible outputs as shown in Figure 14 below (note that Figure 14 does not show connections between the nodes in the fully connected layer)

Figure 14: Fully Connected Layer -each node is connected to every other node in the adjacent layer


Apart from classification, adding a fully-connected layer is also a (usually) cheap way of learning non-linear combinations of these features. Most of the features from convolutional and pooling layers may be good for the classification task, but combinations of those features might be even better [11].

The sum of output probabilities from the Fully Connected Layer is 1. This is ensured by using the Softmax as the activation function in the output layer of the Fully Connected Layer. The Softmax function takes a vector of arbitrary real-valued scores and squashes it to a vector of values between zero and one that sum to one.

Putting it all together – Training using Backpropagation

As discussed above, the Convolution + Pooling layers act as Feature Extractors from the input image while Fully Connected layer acts as a classifier.

Note that in Figure 15 below, since the input image is a boat, the target probability is 1 for Boat class and 0 for other three classes, i.e.

  • Input Image = Boat
  • Target Vector = [0, 0, 1, 0]

Figure 15: Training the ConvNet


The overall training process of the Convolution Network may be summarized as below:

  • Step1: We initialize all filters and parameters / weights with random values
  • Step2: The network takes a training image as input, goes through the forward propagation step (convolution, ReLU and pooling operations along with forward propagation in the Fully Connected layer) and finds the output probabilities for each class.
    • Lets say the output probabilities for the boat image above are [0.2, 0.4, 0.1, 0.3]
    • Since weights are randomly assigned for the first training example, output probabilities are also random.
  • Step3: Calculate the total error at the output layer (summation over all 4 classes)
    • Total Error = ∑ ? (target probability – output probability) 2
  • Step4: Use Backpropagation to calculate the gradients of the error with respect to all weights in the network and use gradient descent to update all filter values / weights and parameter values to minimize the output error.
    • The weights are adjusted in proportion to their contribution to the total error.
    • When the same image is input again, output probabilities might now be [0.1, 0.1, 0.7, 0.1], which is closer to the target vector [0, 0, 1, 0].
    • This means that the network has learnt to classify this particular image correctly by adjusting its weights / filters such that the output error is reduced.
    • Parameters like number of filters, filter sizes, architecture of the network etc. have all been fixed before Step 1 and do not change during training process – only the values of the filter matrix and connection weights get updated.
  • Step5: Repeat steps 2-4 with all images in the training set.

The above steps train the ConvNet – this essentially means that all the weights and parameters of the ConvNet have now been optimized to correctly classify images from the training set.

When a new (unseen) image is input into the ConvNet, the network would go through the forward propagation step and output a probability for each class (for a new image, the output probabilities are calculated using the weights which have been optimized to correctly classify all the previous training examples). If our training set is large enough, the network will (hopefully) generalize well to new images and classify them into correct categories.

Note 1: The steps above have been oversimplified and mathematical details have been avoided to provide intuition into the training process. See [4] and [12] for a mathematical formulation and thorough understanding.

Note 2: In the example above we used two sets of alternating Convolution and Pooling layers. Please note however, that these operations can be repeated any number of times in a single ConvNet. In fact, some of the best performing ConvNets today have tens of Convolution and Pooling layers! Also, it is not necessary to have a Pooling layer after every Convolutional Layer. As can be seen in the Figure 16 below, we can have multiple Convolution + ReLU operations in succession before having a Pooling operation. Also notice how each layer of the ConvNet is visualized in the Figure 16 below.

Figure 16: Source [4]


Visualizing Convolutional Neural Networks

In general, the more convolution steps we have, the more complicated features our network will be able to learn to recognize. For example, in Image Classification a ConvNet may learn to detect edges from raw pixels in the first layer, then use the edges to detect simple shapes in the second layer, and then use these shapes to deter higher-level features, such as facial shapes in higher layers [14]. This is demonstrated in Figure 17 below – these features were learnt using a Convolutional Deep Belief Network and the figure is included here just for demonstrating the idea (this is only an example: real life convolution filters may detect objects that have no meaning to humans).

Figure 17: Learned features from a Convolutional Deep Belief Network


Adam Harley created amazing visualizations of a Convolutional Neural Network trained on the MNIST Database of handwritten digits [13]. I highly recommend playing around with it to understand details of how a CNN works.

We will see below how the network works for an input 『8』. Note that the visualization in Figure 18 does not show the ReLU operation separately.

Figure 18: Visualizing a ConvNet trained on handwritten digits


The input image contains 1024 pixels (32 x 32 image) and the first Convolution layer (Convolution Layer 1) is formed by convolution of six unique 5 × 5 (stride 1) filters with the input image. As seen, using six different filters produces a feature map of depth six.

Convolutional Layer 1 is followed by Pooling Layer 1 that does 2 × 2 max pooling (with stride 2) separately over the six feature maps in Convolution Layer 1. You can move your mouse pointer over any pixel in the Pooling Layer and observe the 4 x 4 grid it forms in the previous Convolution Layer (demonstrated in Figure 19). You』ll notice that the pixel having the maximum value (the brightest one) in the 4 x 4 grid makes it to the Pooling layer.

Figure 19: Visualizing the Pooling Operation


Pooling Layer 1 is followed by sixteen 5 × 5 (stride 1) convolutional filters that perform the convolution operation. This is followed by Pooling Layer 2 that does 2 × 2 max pooling (with stride 2). These two layers use the same concepts as described above.

We then have three fully-connected (FC) layers. There are:

  • 120 neurons in the first FC layer
  • 100 neurons in the second FC layer
  • 10 neurons in the third FC layer corresponding to the 10 digits – also called the Output layer

Notice how in Figure 20, each of the 10 nodes in the output layer are connected to all 100 nodes in the 2nd Fully Connected layer (hence the name Fully Connected).

Also, note how the only bright node in the Output Layer corresponds to 『8』 – this means that the network correctly classifies our handwritten digit (brighter node denotes that the output from it is higher, i.e. 8 has the highest probability among all other digits).

Figure 20: Visualizing the Filly Connected Layers


The 3d version of the same visualization is available here.


Other ConvNet Architectures

Convolutional Neural Networks have been around since early 1990s. We discussed the LeNet above which was one of the very first convolutional neural networks. Some other influential architectures are listed below [3] [4].

  • LeNet (1990s): Already covered in this article.
  • 1990s to 2012: In the years from late 1990s to early 2010s convolutional neural network were in incubation. As more and more data and computing power became available, tasks that convolutional neural networks could tackle became more and more interesting.
  • AlexNet (2012) – In 2012, Alex Krizhevsky (and others) released AlexNet which was a deeper and much wider version of the LeNet and won by a large margin the difficult ImageNet Large Scale Visual Recognition Challenge (ILSVRC) in 2012. It was a significant breakthrough with respect to the previous approaches and the current widespread application of CNNs can be attributed to this work.
  • ZF Net (2013) – The ILSVRC 2013 winner was a Convolutional Network from Matthew Zeiler and Rob Fergus. It became known as the ZFNet (short for Zeiler Fergus Net). It was an improvement on AlexNet by tweaking the architecture hyperparameters.
  • GoogLeNet (2014) – The ILSVRC 2014 winner was a Convolutional Network from Szegedy et al. from Google. Its main contribution was the development of an Inception Module that dramatically reduced the number of parameters in the network (4M, compared to AlexNet with 60M).
  • VGGNet (2014) – The runner-up in ILSVRC 2014 was the network that became known as the VGGNet. Its main contribution was in showing that the depth of the network (number of layers) is a critical component for good performance.
  • ResNets (2015) – Residual Network developed by Kaiming He (and others) was the winner of ILSVRC 2015. ResNets are currently by far state of the art Convolutional Neural Network models and are the default choice for using ConvNets in practice (as of May 2016).
  • DenseNet (August 2016) – Recently published by Gao Huang (and others), the Densely Connected Convolutional Network has each layer directly connected to every other layer in a feed-forward fashion. The DenseNet has been shown to obtain significant improvements over previous state-of-the-art architectures on five highly competitive object recognition benchmark tasks. Check out the Torch implementation here.

Conclusion

In this post, I have tried to explain the main concepts behind Convolutional Neural Networks in simple terms. There are several details I have oversimplified / skipped, but hopefully this post gave you some intuition around how they work.

This post was originally inspired from Understanding Convolutional Neural Networks for NLP by Denny Britz (which I would recommend reading) and a number of explanations here are based on that post. For a more thorough understanding of some of these concepts, I would encourage you to go through the notes from Stanford』s course on ConvNets as well as other excellent resources mentioned under References below. If you face any issues understanding any of the above concepts or have questions / suggestions, feel free to leave a comment below.

All images and animations used in this post belong to their respective authors as listed in References section below.


References

  1. Clarifai Home Page
  2. Shaoqing Ren, et al, 「Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks」, 2015, arXiv:1506.01497
  3. Neural Network Architectures, Eugenio Culurciello』s blog
  4. CS231n Convolutional Neural Networks for Visual Recognition, Stanford
  5. Clarifai / Technology
  6. Machine Learning is Fun! Part 3: Deep Learning and Convolutional Neural Networks
  7. Feature extraction using convolution, Stanford
  8. Wikipedia article on Kernel (image processing)
  9. Deep Learning Methods for Vision, CVPR 2012 Tutorial
  10. Neural Networks by Rob Fergus, Machine Learning Summer School 2015
  11. What do the fully connected layers do in CNNs?
  12. Convolutional Neural Networks, Andrew Gibiansky
  13. A. W. Harley, 「An Interactive Node-Link Visualization of Convolutional Neural Networks,」 in ISVC, pages 867-877, 2015 (link)
  14. Understanding Convolutional Neural Networks for NLP
  15. Backpropagation in Convolutional Neural Networks
  16. A Beginner』s Guide To Understanding Convolutional Neural Networks
  17. Vincent Dumoulin, et al, 「A guide to convolution arithmetic for deep learning」, 2015, arXiv:1603.07285
  18. What is the difference between deep learning and usual machine learning?
  19. How is a convolutional neural network able to learn invariant features?
  20. A Taxonomy of Deep Convolutional Neural Nets for Computer Vision

沒什麼特別的,就是多層神經網路而已。後面的層你就想成用前面層訓練的特徵作為下一層的輸入,所以越到後面層數的特徵越具體

卷積看做特徵稀疏化後壓縮,不丟失信息的情況下減少複雜度


前面很多答主都說了,卷積核就是濾波器,然而很不幸的,這對於我們這些沒有學過信號處理的人來說,這種說法把問題變得更複雜更難理解了。

從卷積運算上來說一下我的理解吧。一般的,卷積神經網路的卷積運算是使用一個k*k的矩陣,對圖像對應的像素做乘法,然後加和。例如對於一張圖片(下面圖像來自樓上的回答,懶得在找了)

使用卷積核

做卷積的話,可以得到

這可以看出來,如果把卷積核和圖像中對應區域都拉成一個向量的話,卷積運算其實就是向量的內積運算。內積是衡量兩個向量之間的相似性的,所以卷積核在圖像某一區域的卷積實際上就是這個卷積核與圖像該區域的相似性。因此,

  1. 一個卷積核探索一種相似性,多個卷積核探索多個相似性。
  2. 卷積核作用在不同的樣本上,探索輸入數據的局部相關性,即不同樣本數據都有這樣的局部特徵。這是因為,如果一個kernel與A相似又與B相似,那麼自然A與B相似,如果A和B是不同的樣本,那麼kernel 探索的是樣本數據共有的局部特徵。
  3. 卷積核作用在同一樣本的不同位置上(即卷積核在整張圖上共享(權值共享)),如果A和B是同一張圖上的不同位置,那麼kernel探索的就是不同位置共有的局部特徵,或者說,局部特徵的平移不變性。

用神經網路就別談什麼理解原理,神經網路理論上是n維空間函數。


我答過很多這方面的問題,你搜吧


@司徒功源解答的非常正確,補充一點,每個卷積核其實都是在傅里葉變換後的頻域上做乘積,也就是我們常說的慮波。在傳統的cv裡面,他們管這個叫garbor filter。只不過,cnn使用learning的方法學到這些filter,傳統的cv是人工design filter罷了。


還不太懂原理,但是已經發現這個演算法存在挺多坑的,給圖吧,都是根據http://scs.ryerson.ca/~aharley/vis/conv/上面生成的。算不上回答題主,但也是給一個視角。
1. 當字很小的時候

2. 當字是斜著/倒著的時候:

3. 被遮擋的時候

4. 有遮擋物的時候:

6. 與其他數字高度重疊的時候

個人感覺好像CNN不能捕捉線條與線條之間的關係。


試著回答。
卷積神經網路最關鍵的是卷積核,這是卷積神經網路可以從低到高組合得到抽象特徵的根本。通過移動卷積核來提取上層輸入的局部特徵然後非線性組合這些特徵得到下層的輸入。這樣堆疊多層就形成了對特徵的高度抽象。所以卷積神經網路的關鍵是raw data足夠多、卷積核提取局部特徵、非線性特徵組合。它不是真正的理解了要識別的對象,而是從大量數據的統計特徵中找到了它。算是暴力學習吧。


放眼望去,大多數回答都在說

CNN的核心是『卷積核』;卷積核能得到不同level的特徵;卷積核可以是各種濾波器... 等等

然而,沒有一個回答說清楚(對,我不是指你,我是說在座的各位都是),為何卷積核能『提取不同特徵』?為何能『濾波』?

其實道理很簡單,因為

卷積運算,從頻域角度看,是頻譜相乘

所以圖像跟卷積核做卷積時,兩者頻譜不重疊的部分相乘,自然是0,那圖像這部分頻率的信息就被卷積核過濾了。

而圖像,本質上就是二維離散的信號,像素點值的大小代表該位置的振幅,所以圖像包含了一系列頻率的特徵。比如圖像邊緣部分,像素值差別大,屬於高頻信號,背景部分,像素值差別小,是低頻信號。所以如果卷積核具有『高通』性質,就能起到提取圖像邊緣的作用,低通則有模糊的效果。

所以,卷積神經網路的牛逼之處在於

通過卷積層的不同卷積核,提取圖像不同頻段的特徵;以及通過池化層,提取不同粒度的特徵(池化層好理解,就不多說了)

具體請移步 [CV] 通俗理解『卷積』——從傅里葉變換到濾波器


推薦閱讀:

在與 AlphaGo(包括 Master) 的對局中是否出現了一些人類歷史上從未想到過的著法、技巧?
如何理解感知機學習演算法的對偶形式?
計算機圖形學與機器學習(深度學習)怎麼結合起來?
SVM和logistic回歸分別在什麼情況下使用?
有沒有傻瓜化的機器學習界面?

TAG:機器學習 | 神經網路 | 卷積神經網路(CNN) |