1. 程式人生 > >深度學習介紹(四)卷積操作

深度學習介紹(四)卷積操作

接下來介紹一下,CNNs是如何利用空間結構減少需要學習的引數數目的
如果我們有一張1000x1000畫素的影象,有1百萬個隱層神經元,那麼他們全連線的話(每個隱層神經元都與影象的每一個畫素點相連),這樣就有1000x1000x1000000=10^12個連線,也就是10^12個權值引數。然而影象的空間聯絡是區域性的,就像人是通過一個區域性的感受野去感受外界影象一樣,每一個神經元都不需要對全域性影象做感受,每個神經元只感受區域性的影象區域,然後在更高層,將這些感受不同區域性的神經元綜合起來就可以得到全域性的資訊了。這樣,我們就可以減少連線的數目,也就是減少神經網路需要訓練的權值引數的個數了。
這裡寫圖片描述
假如區域性感受野是10x10,隱層每個神經元只需要和這10x10的區域性影象相連線,所以1百萬個隱層神經元就只有一億個連線,即10^8個引數。比原來減少了四個數量級,這樣訓練起來就沒那麼費力了,但還是感覺很多,那還有什麼辦法嗎?那就是權值共享了。
由以上分析可知,隱含層的每一個神經元都連線10x10的影象區域,也就是說每一個神經元存在10x10=100個連線權值引數。那如果我們每個神經元對應的這100個引數是相同的呢(也就是說每個神經元用的是同一個卷積核去卷積影象。)?這樣豈不是就只有100個引數了?!不管隱層有多少個神經元,兩層間的連線就只有100個引數。這就是權值共享的作用了。
這樣卷積後得到的就是能夠代表影象一種特徵的一個feature map,而我們需要提取的是影象的多種特徵,那如何提取影象的多種特徵呢。需要注意的一點是,上面的討論都沒有考慮每個神經元的偏置部分,所以權值個數需要加1。這個也是同一種濾波器共享的。
(停下來捋一捋上面的內容,如果有細節不理解也沒關係,下面將進行更加詳細的分析)
每個隱層神經元只與10*10的區域性區域畫素相連,這裡的10*10就是濾波器的kernel size。stride就是濾波器的步長,即從一個隱層神經元到相鄰隱層神經元之間的移動長度。各個神經元之間的權重是相同的,即權重共享。這樣對kernel size中的區域性影象進行卷積操作後,就對映得到了一個表示該影象同一特徵的一個feature map。當又用一種濾波器進行相同的卷積操作後,就又得到能代表該影象另一特徵的一個feature map……
這裡寫圖片描述


用畫圖軟體畫了個圖幫助理解。如圖:黑色的框表示4*4的圖片,當濾波器的kernel size為2,stride為2(即相鄰兩個隱層神經元之間無重疊)時,由之前介紹的公式知生成的feature maps的邊長為(4-2)/2 + 1 = 2。同一種顏色代表一個filter,該圖中有兩個filter,生成了代表兩種特徵的feature maps。
也可以從另一種角度進行理解:
這裡寫圖片描述
一個kernel size為2*2的filter對影象進行掃描,每次移動的步長stride為2,每條連線線上的權重固定,每次掃描後得到的值按照空間順序組成一個feature map。當卷積核和權重更改時,即使用了另一個filter,生成另一個feature map。至於每條線上的權重則是通過訓練得到的。
卷積過程如下圖所示,原始影象的size為5*5,濾波器的kernel size為3*3,stride為1,權重固定。生成的feature map的邊長為:(5-3)/1 +1 = 3。
這裡寫圖片描述

具體卷積過程如下圖所示:
這裡寫圖片描述
為了加深理解,再舉一個例子:
上一層的feature map大小為4*4,卷積核大小為2*2,卷積核每次移動一步,用這個卷積在feature map上滾一遍,得到一個一個(4-2+1)*(4-2+1)=3*3的feature map。如下圖所示:
這裡寫圖片描述