iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
2

前言

前兩篇我們介紹了CNN的概念及程式撰寫方式,有幾點要再強調:

  1. CNN 主要借助卷積層(Convolution Layer)的方法,將Input從原始的點陣圖,改為經過影像處理技術萃取的特徵,等於是提供更有效的資訊給模型使用,因此,預測的效果就會顯著的向上提升。厲害的是,我們也不用撰寫影像處理的程式碼,Neural Network(也許是框架?) 會幫我們自動找出這些特徵。
  2. 卷積層是作Input的改善,所以,它通常會放在模型的『前』幾層,後面會緊跟著池化層,以簡化計算。
  3. 最後,模型會回歸到全連接層(Dense)進行分類,卷積層是多維的陣列,全連接層的Input通常為一維,中間維度的轉換就靠『扁平層』(Flatten)來處理。
  4. 為避免『過度擬合』(overfit),我們會在特定的地方加上Dropout層,來防止過度擬合。

以上就是各種隱藏層堆疊的原則,之後再觀摩幾個經典的模型,就比較清楚隱藏層的安排順序與原則。

CNN 隱藏層

除了全連接階層(Dense)外,CNN隱藏層分為下列幾類:

  1. 卷積層:請參考這裡
  2. 池化層:請參考這裡
  3. Dropout層:請參考這裡,主要目的為防止過度擬合,首要參數rate為關掉隱藏層節點的比例,利用隨機關掉隱藏層節點與輸入神經元的連結,不更新權重(W),造成多個結果,再作比較去除極端值,即可達到避免過度擬合的現象。
  4. 『扁平層』(Flatten):請參考這裡,把多維的輸入壓扁為一維輸出,常用在從卷積層到全連接層的過渡,無參數。
  5. Masking層:請參考這裡,對於有時序(Temporal)的輸入資料,例如文字及語音,以遮蔽值取代指定的時序資料,例如參數mask=0,timesteps為[3,5],就是以0取代第四、六個輸入值(0為第一個)。

下面我們就詳細說明各層的參數。

卷積層(Convolution Layer)參數

Keras 提供的卷積層又分為幾個小類:

  1. 一般性的:包括一維(Conv1D)、二維(Conv2D)、三維(Conv3D),分別處理時序資料、2D 圖形及每一點含其他資訊的2D 圖形。
  2. 裁切的(Cropping):也包括一維(Conv1D)、二維(Conv2D)、三維(Conv3D),可設定寬與高的上下左右各裁切N個點不使用。
  3. 重複取樣(UpSampling):也包括一維(Conv1D)、二維(Conv2D)、三維(Conv3D),每一個區域重複取樣,與第一項相反,它是要作擴散樣本。

重要的參數說明如下:

  1. Filters:濾波器數目,就是下圖的每一階段的輸出面數或是深度,輸出的圖稱為『特徵圖』(Feature Map),通常是4的倍數。
    https://ithelp.ithome.com.tw/upload/images/20171206/20001976MF6mVp77fl.png
    圖. LeNet 結構圖,Filters就是圖片的面數,圖片來源:Visualizing parts of Convolutional Neural Networks using Keras and Cats
  2. kernel_size:卷積核大小,一般為正方形,邊長為奇數,便於尋找中心點。
  3. strides:滑動步長,計算滑動視窗時移動的格數。
  4. padding:補零方式,卷積層取週邊kernel_size的滑動視窗時,若超越邊界時,是否要放棄這個output點(valid)、一律補零(same)、還是不計算超越邊界的Input值(causal)。
  5. data_format:channels_last (預設值) 或 channels_first,channels_last 是指通道資料放在最後一維,channels_first 是指通道資料放在第二維,因第一維為樣本數。
  6. dilation_rate:膨脹比例,用於膨脹卷積(限於篇幅,有興趣請參見 https://www.zhihu.com/question/54149221),這個值設為非1的值,則strides必須等於1,反之亦然,因為兩個是互斥的,strides是縮小圖像,dilation_rate是膨脹圖像,兩者通常不會同時使用。
  7. activation:要使用何種 activation function。

其他參數用法與一般的 Neural Network 相同,請看 『Day 05:模型參數說明』介紹。

池化層(Pooling Layer)參數

池化層(Pooling Layer) 又分為幾個小類:

  1. 取最大值(Max):包括一維(MaxPooling1D)、二維(MaxPooling2D)、三維(MaxPooling3D),分別處理時序資料、2D 圖形及每一點含其他資訊的2D 圖形。
  2. 取平均值(Average):也包括一維(AveragePooling1D)、二維(AveragePooling2D)、三維(AveragePooling3D)。
  3. 取全局最大值(GlobalMax):包括一維(GlobalMaxPooling1D)、二維(MaxPooling2D),分別處理時序資料、2D 圖形,不設池化尺寸(Pooling Size),取全部 input 的最大值。

重要的參數說明如下:

  1. pool_size:池化視窗的大小,通常設為2,效果就不錯。
  2. strides:滑動步長,計算滑動視窗時移動的格數。
  3. padding:補零方式,卷積層取週邊kernel_size的滑動視窗時,若超越邊界時,是否要放棄這個output點(valid)、還是一律補零(same),沒有causal選項。
  4. data_format:channels_last (預設值) 或 channels_first,channels_last 是指通道(色彩)資料放在最後一維,channels_first 是指通道資料放在第二維,因第一維為樣本數。

結語

經過以上介紹,你應該會有很多疑問,究竟CNN要設幾層? Filters要設多少? 卷積核要設多大? strides要設多大? 根據我目前找到的答案是,『多加實驗,找到最佳值』,如果是真的,難怪連大師都說『Neural Network』的結果是很難對一般人解釋清楚的。我喜歡前百度首席科学家、史丹佛大學副教授吳恩達下面這段評論:

Deep Learning has also been overhyped. Because neural networks are very technical and hard to explain, many of us used to explain it by drawing an analogy to the human brain. But we have pretty much no idea how the biological brain works.
資料來源:What does Andrew Ng think about Deep Learning?

下一次我們就看看一些很成功的CNN模型,觀摩他們的模型設計,並且研究如何使用他們的模型,來實作各種應用。也作一些簡單的實驗,與時事作結合,實驗『太陽花看成香蕉』的機率有多少呢?


上一篇
Day 07:撰寫第一支CNN 程式 -- 比較 『阿拉伯數字』辨識力
下一篇
Day 09:CNN 經典模型應用
系列文
以100張圖理解 Neural Network -- 觀念與實踐31

尚未有邦友留言

立即登入留言