Kaggle Learn | Deep Learning 深度學習 | 學習資源介紹

一起寫作業,用 Keras 來辨識「熱狗」吧!

Photo by Ian Valerio on Unsplash

最近 Kaggle 推出線上課程 Learn,最大特色就是『精簡』,每個主題的影片僅五到十分鐘,合起來約一兩小時,卻把重點都講了。最後的實作也簡化到只讓學員練習精華,每個練習題都只有三大步驟:1. 載入 Kaggle 預先寫好的非核心功能 2. 自己寫 code 練習核心概念 3. 看結果。

課程目的很清楚,就是要讓大家:

先體會寫程式可以做到的事,再去研究背後的理論方法。

本文將分享我在「深度學習(Deep Learning)」這個項目中的學習心得,加入一些概念說明,希望讓大家學起來更順利!


前情提要

深度學習 (Deep Learning)

深度學習是一種複雜的運算方法,可以簡單理解為很多層類神經網絡組合成的數學模型,適合用來分析複雜的 data,例如圖像、語言、音樂、金融交易…等等。

Kaggle 這堂課以「圖像」處理的應用,說明深度學習的基本概念。深度學習的圖像技術可以用在辨識物體是什麼,稱為 Image Classification。更進一步的方法甚至可以分別框出物體在哪裡,稱為 Objective Detection。

本篇進度

目前我寫了兩個練習題,一個是用 Convolution 抓出照片的特徵,藉此瞭解 Convolution 的意義 ; 另一個是用 ResNet-50 模型辨識出熱狗。範圍含括第一課到第三課。


第一課:Convolution

課程影片在此Convolution 是深度學習模型中最重要的一部分。每張圖片,在電腦上都是以矩陣表示。Convolution 的功能是提取輸入圖片矩陣的特徵,加權後產生新的矩陣,讓深度學習模型可以進一步運算,最終推論輸入圖片的類別。

Convolution 的計算方法跟內積蠻像的,如下圖所示,想像灰色是 data,藍綠色是 Fliter,白色是 data 跟 Fliter Convolution 後的結果。計算方式就是把灰色每個點跟藍綠色相乘後相加。當 Fliter 把灰色全掃完,產出的白色矩陣就是 feature,也就是「圖片特徵」。

下圖說明當原圖經過 Convolution 轉換後,產生的 feature 新矩陣的意義。這邊舉例的 5 X 5 矩陣是一個影像,這個影像應該是有一條顏色較淺的水平線從中間畫過 ( 在 RGB 顏色模型中, 0 為黑色, 255 為白色),我們所使用的Fliter 凸顯了原圖中水平直線的結構,這就是 convolution 提取圖像特徵的意義。當我們的模型有很多 Convolution,真實世界中的物體就有機會被模型分類出來。下面的練習,我們就可以體會特徵提取的感覺了!

練習單元

看完影片後,直接跑跑看 Kaggle 準備的範例程式碼吧!按下 Fork Notebook,即可在瀏覽器上面跑 code。(建議使用 Chrome 瀏覽器)

Tips: Kaggle Kernel 的使用方法

點擊 Console ,畫面就會切成一半,上半是範例程式碼教學,下半是程式執行的地方。如果要執行上方的整段 code,按下程式碼旁邊 ▶︎ 即可在 console 執行。也可以選擇直接把 code 打在 console 最下方。

練習一:用 Convolution 抓出照片的特徵

在這個練習中,我們要設計一個濾鏡,把圖片裡的水平特徵、直線特徵抓出來。如下圖的效果。

左:原圖。中:抓出水平特徵。右:抓出垂直特徵。

Step One: import 一些基本功能

Kaggle 貼心地寫好了「把照片讀進來(load_my_image)、對照片做 convolution(apply_conv_to_image)、顯示照片(show)」等功能,所以我們 import 這些功能後,只要專注在設計 convolution 就好。

Step Two: 設計 Convolution

Kaggle 用水平線 convolution 為範例,上面 +1 下面 -1 代表被加權後,圖片上下顏色一樣的地方會變成零,上下顏色不一樣的地方就不是零,於是水平特徵被凸顯出來了。

垂直線 convolution 依此類推,應該設計成左邊 +1 右邊 -1,讓左右不一樣的地方凸顯出來。

Step Three: 把 Convolution 用在圖片上看結果

把 vertical_line_conv 加到 cone_list 中,跑跑看!


第二課:建 Convolution 模型

課程影片在此。第一課告訴我們,不同的 Flitters代表不同的特徵,那我們要如何決定 Fliters?

當我們對第一層 Convolution 的結果矩陣,再做 Convolution 時,因為模型更複雜,可以描述圖像的能力更強。我們該如何架設我們的模型的先後順序呢?

這些問題不是非常大,機器學習就是準備好一個初始化的模型架構,以及為數不少的訓練資料,讓電腦根據一些數學方法,透過運算,找出最好的參數。

這是一個聽起來很簡單,但卻要花非常多運算的方法。還好世界上已經有許多研究機構開發出各種深度學習架構,可以直接給我們使用,下面的練習,就是一個例子。


第三課 / 練習二:使用 Keras 辨別「熱狗」

HBO 影集矽谷群瞎傳(Silicon Valley)裡,主角們開發了一個「熱狗辨識 App」,取名「See Food」。在影集中,這個 App 被社交網站以四百萬美金買走,用來分辨不雅照片。

(還沒看過矽谷群瞎傳嗎?這裡有一篇推坑文)

在這個練習中,我們將用別人已經訓練好的 Model 做出熱狗辨識器。使用的工具是 Python 的深度學習 library:Keras。由於我們可以直接在瀏覽器上面跑,所以省去了安裝 Keras 的力氣。

Step One: 照片前置處理

設定照片路徑。

將照片 resize 成 224*224,並使用符合 Resnet50 這個模型的照片前處理(即 preprocess_input)。

Step Two: 使用 Model “ResNet-50”

在這個練習中,我們使用別人已經用 ImageNet 資料庫訓練好的模型 “ResNet-50”。因為 ImageNet 資料庫已經有熱狗這一項,所以我們可以直接用 my_model.predict 辨認出熱狗。

Step Three: 看結果

用 decode_predictions 把結果 show 出來。

程式碼執行結果:[(‘n07697537’, ‘hotdog’, 0.9774525), (‘n01981276’, ‘king_crab’, 0.011711869), (‘n07697313’, ‘cheeseburger’, 0.003995334)]
程式碼執行結果:[(‘n07697537’, ‘hotdog’, 0.97652984), (‘n07697313’, ‘cheeseburger’, 0.019226013), (‘n02776631’, ‘bakery’, 0.000781722)]
程式碼執行結果:[(‘n07579787’, ‘plate’, 0.61881053), (‘n07880968’, ‘burrito’, 0.105653584), (‘n07697537’, ‘hotdog’, 0.089705266)]
程式碼執行結果:[(‘n07583066’, ‘guacamole’, 0.99939215), (‘n03786901’, ‘mortar’, 0.00016563732), (‘n07579787’, ‘plate’, 8.611741e-05)]

結論:第一、二張照片是熱狗,第三、四張不是。


下一課預告

我們可以直接用別人架好的模型,是因為這個模型有熱狗類別。如果今天我們需要分析的資料是植物分類,也是可以用別人已經訓練好的模型做到的,這個方法是 Transfer Learning,有幾個變化,有些小技巧,讓我們 下一篇 再談吧!


後記

為了方便大家查找文章,我把這陣子寫的文章集結在底下列表,有興趣可以去逛逛~