如同你所看到的,這個頁面展示了一個以 卷積神經網路( C onvoluational N eural N etwork, 後簡稱為 CNN) 實作的貓狗圖片辨識應用。你除了可以不斷出賣愛貓愛狗以外,也可以跟著本文,非常直觀地理解以下內容:

  • 何謂卷積神經網路 CNN
  • 卷積神經網路的運作方式
  • 何謂遷移學習
  • 值得事先說明的是,本文雖然有些許 Python 程式碼,但實際上並不會一步步教你寫出一個 CNN(因為網路上已經太多這樣的文章了)。如果這是你的目的,我推薦查看 fast.ai 的圖像分類課程 。

    本文的目的是讓你在閱讀後對深度學習以及卷積神經網路有個更直觀的理解,並讓你之後的學習之旅更加順遂。

    卷積神經網路( C onvoluational N eural N etwork, 後簡稱為 CNN) 是一種神經網路架構,近年在人臉辨識、圖像分類、自動駕駛等領域大放異彩。本篇供你互動的貓狗辨識應用便是基於此所建立的。

    雖然 CNN 也能處理文字以及影片輸入,在這篇文章裡頭,我們將特別針對輸入為圖片的例子做說明。一個典型的 CNN 會用以下的方式處理輸入進來的圖片:

    鳥瞰整個流程,就算你現在還不知道何謂 卷積 或者 池化運算 ,應該也可以看到輸入的貓咪圖片是如何從左到右經過一連串的數據處理步驟,最後被轉換成我們想要的輸出結果的(貓和狗的機率)。

    如同我在 寫給所有人的自然語言處理與深度學習入門指南 中提到的,不管是該篇介紹的 循環神經網路 RNN 還是本篇的卷積神經網路也好,拉到最抽象的層次,其實它們做的事情都是一樣的:

    怎麼樣?我想你現在應該能比較直觀地感受濾波器與卷積運算在做些什麼了。

    除了視覺上的娛樂效果以外,每個濾波器對輸入圖片做的卷積運算事實上是一種 特徵提取(feature extraction) 步驟。

    不同的濾波器會對圖中所有相同範圍(3 x 3)的像素做不同的轉換,進而從這些像素裡頭提取出:

    等等實用且具代表性的圖片特徵。

    你可能會問:

    如同 我在以前文章說過的 ,我們可以隨機初始化所有濾波器的數值,並利用平常訓練神經網路的反向傳播算法(Backpropagation),讓 CNN 自己學出一組有用的濾波器數值來將輸入圖片(一大堆像素)轉換成我們想要的值(一個貓咪機率)。

    透過這些轉換,CNN 能幫我們萃取出有用的圖片特徵。而這也是深度學習最厲害一個的地方:自動化 特徵工程(feature engineering) 。

    在了解卷積以後,池化(pooling)的運作方式就很容易理解了。進行池化時,我們一樣會有一個濾波器(filter)掃過整張圖片,但這個濾波器跟卷積時的濾波器不同的地方有幾點:

  • 一般來說池化的濾波器大小為 2 x 2(卷積濾波器的大小通常為 1, 3, 5)
  • 濾波器每次往右、往下移動距離(stride)為 2(卷積通常為 1)
  • 濾波器裡頭本身沒有數值,而是將 2 x 2 範圍裡頭的最大值取出來(卷積則是透過自己的數值跟輸入做相乘計算)
  • 上圖 2 x 2 的紅框即為池化時用的濾波器。而將每個範圍內最大數值取出的 max pooling 是最常見的做法,但你也可以選擇取 4 個數字平均的 average pooling。

    以動畫表示池化運算的話就如下方所示:

    這個架構當作圖像分類的 Hello World 練習沒有問題,但這模型的準確度可能不高。主要有兩點原因:

  • 你手邊的貓狗圖片通常不多(幾千張),而當你把這些圖片拿去給這個 CNN 訓練時,它右側的特徵擷取部分(尤其是卷積中的濾波器)可能還沒辦法學到非常有用的數值。
  • 這個模型事實上很「小」,做的數據轉換步驟可能不夠,無法很好地萃取貓狗特徵
  • 你沒辦法簡單寫一個 Python 函式 f(x) 在一個步驟裡頭將輸入圖片轉換成貓咪機率,但你可以將一個已訓練好的 CNN 當作 f(x) ,並透過它將輸入圖片的像素 x 經過一連串的數據轉換(卷積、池化、全連接層) 逐漸 轉換成一個貓咪機率 y 。

    每過一層轉換,萃取出來的資訊就越來越不像原始像素,而越來越靠近分類結果(貓或狗)。

    如果你想自己訓練出一個如本章的圖像辨識模型,可以參考 Github 上的 cat-recognition-train 。裡頭教你如何使用 TensorFlow 訓練一個 CNN。

    如果比起圖像辨識,你對自然語言處理比較有興趣的話,可以查看 進入 NLP 世界的最佳橋樑:寫給所有人的自然語言處理與深度學習入門指南 。

    以下則列出我在撰寫此文時引用或是從中獲得啟發的連結:

  • 台大李鴻毅教授的卷積神經網路教學影片
  • Keras 作者 François Chollet 展示如何做遷移學習
  • Keras 官方文章,解釋並視覺化 CNN 學到什麼
  • Stanford 的 CS231 課程視覺化 CNN 學到什麼
  • 可以讓你上傳圖片並動態嘗試各種濾波器
  • Stanford 的 CS230 課程總結了目前最新相關知識
  • MobileNetV2 使用到的卷積技術的 Youtube 影片
  • ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
  •