1. 程式人生 > >Convnet介紹(1)

Convnet介紹(1)

最近準備開始進軍deep learning這個深坑了!最開始還是要從卷積神經網路看起。最近剛剛翻到一篇講解convnet非常好的文章,決定在此翻譯下來。供參考學習。

(附原版文章地址連結:http://cs231n.github.io/convolutional-networks/#pool)

卷積神經網路(CNNs/ConvNets)

    卷積神經網路與傳統的神經網路非常類似:他們是由一系列可以被訓練的神經元組成(可訓練的部分為權重(weight)與偏置(bias))。每一個神經元接收一些輸入,然後通過點乘和一些非線性變換(如:reLu,sigmoid函式,tanh等等)。整個網路可以模擬出一個可微分的打分函式:以原始的影象畫素為輸入,以各個類別的分數為輸出。CNN在最後一層通常也有損失函式(loss function)(比如SVM/softmax),這點跟傳統的神經網路非常像。
    那麼CNN跟傳統神經網路有什麼區別?本文的CNN假設輸入為影象,這樣就可以從影象的角度來改進網路,使得整個網路實現起來更加有效,同時減少了訓練引數的數目。

一、整體介紹

    回憶:傳統的神經網路。傳統的神經網路輸入一個向量,通過隱藏層對這個向量做若干次變換,最後輸出結果。每一個隱藏層是由一系列的神經元構成,每一個神經元與上一層的神經元全部連結,同一層的神經元之間不相互連線。最後一層為輸出層,對於分類問題來說,輸出層輸出各個類別的分數。     傳統神經網路對於大型影象來說並不適用。舉個例子來說,在CIFAR-10的資料集中,影象的大小為32*32*3,所以對於第一層隱藏層的一個神經元來說,它有32*32*3=3072個引數。這個數字看起來不大,這是因為影象非常的小。如果影象的大小為200*200*3,那麼一個神經元需要訓練的引數為200*200*3+1=120001個。這僅僅是一個神經元,如果算上其他的神經元,需要訓練的引數數量將是一個天文數字!很明顯,這種全連線的形式非常費時,而且如此大量的引數會導致過擬合的問題。      神經元的3D結構:CNN利用了輸入為影象的這個因素,它沒有把影象拉成一個向量,而是直接拿來用。具體的說,CNN的輸入有三個維度:影象的長寬高,高實際就是影象的顏色通道個數,對於灰度影象,高為1,彩色影象高為3,多光譜影象高為譜段數。比如,輸入影象大小為32*32*3,那麼CNN的輸入也為32*32*3.另外CNN的輸出也是一個3維的向量,比如一個10類的輸出,CNN的輸出就為1*1*10.下邊為一個示意圖:


二:CNN用到的層

    如上邊的示意圖看出,CNN實際上就是層的序列,每一層使用一個可微分的函式將一個多維矩陣變換成另外一個多維矩陣。常用的層有三種:卷積層,池化層(pooling)和全連線層。我們將這些東西有規則的組合到一起,就組成了一個卷積神經網路。     下邊我們舉一個例子:一個具有[輸入-卷積層-relu-池化層-全連線層].更進一步的:     輸入:[32*32*3]的矩陣。     卷積層:卷積層計算與輸入層區域性連線區域的神經元,計算與這些神經元對應的權重的內積。如果我們用12個濾波器的話,輸出就是[32*32*12].     RELU層:是一個逐點計算的啟用函式,形式為 max(0,x)。輸出仍然為[32*32*12]。     池化層:池化層會在空間維度下采樣(長和寬的維度),輸出為[16*16*12]。     全連線層:輸出為各個類別的分數,輸出為[1*1*10]。下圖為一個例子:

下邊將詳細說明每一個具體的層:

一。卷積層

    當處理維度很高的輸入時(比如圖片),將每個神經元全連線是不現實的。作為替代,我們將每個神經元只與輸入層的區域性區域連線。下邊舉幾個例子: 例子1:假設輸入的資料為32*32*3的,如果濾波器是5*5*3的,那麼每個卷積層的每個神經元也有5*5*3個引數和1個偏置引數。注意濾波器的高必須為3,因為這是輸入資料的高。 例子2:假設輸入的資料為16*16*20,濾波器為3*3*20的,那麼濾波器則一共有3*3*20個引數加一個偏置引數。注意濾波器的高必須為20.      以上是討論的卷積層的輸入,下邊討論卷積層的輸出。卷積層的輸出由三個引數決定:深度,每次濾波器移動的步長和輸入資料的邊界補0數。     深度就是濾波器的個數。有多少個濾波器,輸出的高就為多少。比如有12個濾波器,輸出就是x*y*12.     濾波器每次移動的步長也是一個重要引數。如果步長為1,我們每次只將濾波器移動一個畫素。如果是2或者3,我們每次移動2個或3個畫素。    輸入資料邊界補0可以讓我們控制輸出資料的大小。    假設輸入的資料大小為W長,濾波器的大小為F長,每次移動S個步長,添加了P行0.那麼輸出的長度就為(W-F+2P)/S+1。