1. 程式人生 > >卷積神經網絡參數

卷積神經網絡參數

features out 二維 時也 卷積神經網絡 num str 十分 eat

卷積神經網絡(Convolutional Neural Network, CNN)是深度學習技術中極具代表的網絡結構之一,在圖像處理領域取得了很大的成功,在國際標準的ImageNet數據集上,許多成功的模型都是基於CNN的。CNN相較於傳統的圖像處理算法的優點之一在於,避免了對圖像復雜的前期預處理過程(提取人工特征等),可以直接輸入原始圖像。圖像處理中,往往會將圖像看成是一個或多個的二維向量,如MNIST手寫體圖片就可以看做是一個28 × 28的二維向量(黑白圖片,只有一個顏色通道;如果是RGB表示的彩色圖片則有三個顏色通道,可表示為三張二維向量)。傳統的神經網絡都是采用全連接的方式,即輸入層到隱藏層的神經元都是全部連接的,這樣做將導致參數量巨大,使得網絡訓練耗時甚至難以訓練,而CNN則通過局部連接、權值共享等方法避免這一困難。

在圖像處理中,往往把圖像表示為像素的向量,比如一個1000×1000的圖像,可以表示為一個1000000的向量。在上一節中提到的神經網絡中,如果隱含層數目與輸入層一樣,即也是1000000時,那麽輸入層到隱含層的參數數據為1000000×1000000=10^12,這樣就太多了,基本沒法訓練。所以圖像處理要想練成神經網絡大法,必先減少參數加快速度。卷積神經網絡有兩種神器可以降低參數數目,就是CNN中的局部連接(Sparse Connectivity)和權值共享(Shared Weights)方法,理解它們很重要。

左邊是全連接,右邊是局部連接。對於一個1000 × 1000的輸入圖像而言,如果下一個隱藏層的神經元數目為10^6個,采用全連接則有1000 × 1000 × 10^6 = 10^12個權值參數,如此數目巨大的參數幾乎難以訓練;而采用局部連接,隱藏層的每個神經元僅與圖像中10 × 10的局部圖像相連接,那麽此時的權值參數數量為10 × 10 × 10^6 = 10^8,將直接減少4個數量級。
盡管減少了幾個數量級,但參數數量依然較多。能不能再進一步減少呢?能!方法就是權值共享。具體做法是,在局部連接中隱藏層的每一個神經元連接的是一個10 × 10的局部圖像,因此有10 × 10個權值參數,將這10 × 10個權值參數共享給剩下的神經元,也就是說隱藏層中10^6個神經元的權值參數相同,那麽此時不管隱藏層神經元的數目是多少,需要訓練的參數就是這 10 × 10個權值參數(也就是卷積核(也稱濾波器)的大小)。

在通過卷積獲得了特征 (features) 之後,下一步我們希望利用這些特征去做分類。理論上講,人們可以用所有提取得到的特征去訓練分類器,例如 softmax 分類器,但這樣做面臨計算量的挑戰。例如:對於一個 96X96 像素的圖像,假設我們已經學習得到了400個定義在8X8輸入上的特征,每一個特征和圖像卷積都會得到一個 (96 ? 8 + 1) × (96 ? 8 + 1) = 7921 維的卷積特征,由於有 400 個特征,所以每個樣例 (example) 都會得到一個 7921 × 400 = 3,168,400 維的卷積特征向量。學習一個擁有超過 3 百萬特征輸入的分類器十分不便,並且容易出現過擬合 (over-fitting)。
為了解決這個問題,首先回憶一下,我們之所以決定使用卷積後的特征是因為圖像具有一種“靜態性”的屬性,這也就意味著在一個圖像區域有用的特征極有可能在另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定特征的平均值 (或最大值)。這些概要統計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決於計算池化的方法)。

Convolution層:

就是卷積層,是卷積神經網絡(CNN)的核心層。
層類型:Convolution
   lr_mult: 學習率的系數,最終的學習率是這個數乘以solver.prototxt配置文件中的base_lr。如果有兩個lr_mult, 則第一個表示權值的學習率,第二個表示偏置項的學習率。一般偏置項的學習率是權值學習率的兩倍。
在後面的convolution_param中,我們可以設定卷積層的特有參數。
必須設置的參數:
  num_output: 卷積核(filter)的個數
  kernel_size: 卷積核的大小。如果卷積核的長和寬不等,需要用kernel_h和kernel_w分別設定
其它參數:
  stride: 卷積核的步長,默認為1。也可以用stride_h和stride_w來設置。
  pad: 擴充邊緣,默認為0,不擴充。 擴充的時候是左右、上下對稱的,比如卷積核的大小為5*5,那麽pad設置為2,則四個邊緣都擴充2個像素,即寬度和高度都擴充了4個像素,這樣卷積運算之後的特征圖就不會變小。也可以通過pad_h和pad_w來分別設定。
  weight_filler: 權值初始化。 默認為“constant",值全為0,很多時候我們用"xavier"算法來進行初始化,也可以設置為”gaussian"
  bias_filler: 偏置項的初始化。一般設置為"constant",值全為0。
  bias_term: 是否開啟偏置項,默認為true, 開啟
  group: 分組,默認為1組。如果大於1,我們限制卷積的連接操作在一個子集內。如果我們根據圖像的通道來分組,那麽第i個輸出分組只能與第i個輸入分組進行連接。
輸入:n*c0*w0*h0
輸出:n*c1*w1*h1
其中,c1就是參數中的num_output,生成的特征圖個數
w1=(w0+2*pad-kernel_size)/stride+1;
h1=(h0+2*pad-kernel_size)/stride+1;
如果設置stride為1,前後兩次卷積部分存在重疊。如果設置pad=(kernel_size-1)/2,則運算後,寬度和高度不變。


Pooling層
也叫池化層,為了減少運算量和數據維度而設置的一種層。
層類型:Pooling
必須設置的參數:
kernel_size: 池化的核大小。也可以用kernel_h和kernel_w分別設定。
其它參數:
  pool: 池化方法,默認為MAX。目前可用的方法有MAX, AVE, 或STOCHASTIC
   pad: 和卷積層的pad的一樣,進行邊緣擴充。默認為0
   stride: 池化的步長,默認為1。一般我們設置為2,即不重疊。也可以用stride_h和stride_w來設置。

pooling層的運算方法基本是和卷積層是一樣的。
輸入:n*c*w0*h0
輸出:n*c*w1*h1
和卷積層的區別就是其中的c保持不變
w1=(w0+2*pad-kernel_size)/stride+1;
h1=(h0+2*pad-kernel_size)/stride+1;
如果設置stride為2,前後兩次卷積部分不重疊。100*100的特征圖池化後,變成50*50.
參考:
雨石 http://blog.csdn.net/stdcoutzyx/article/details/41596663

denny402 http://www.cnblogs.com/denny402/p/5071126.html

An Intuitive Explanation of Convolutional Neural Networks
---------------------
作者:Coooooooooooooder
來源:CSDN
原文:https://blog.csdn.net/fabulousli/article/details/52886964
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

卷積神經網絡參數