跳到主要內容區塊

ntuccepaper2019

專題報導

MATLAB與深度學習
  • 卷期:v0042
  • 出版日期:2017-09-20

作者:楊雅筑 劉禹農 洪詩涵 / 鈦思科技股份有限公司應用工程師


深度學習是目前人工智慧的主流,透過MATLAB,我們可以簡單且容易的實現深度學習相關的應用。例如藉由簡單11行的指令,就能夠即時辨識攝影機所拍攝到的物品。本文介紹使用MATLAB訓練深度模型的方法、硬體加速方案與視覺化深度學習結果的功能。

 

前言

“深度學習”(Deep Learning)是機器學習範疇中的分支,其根源為類神經網絡(Artificial Neural Network),利用疊加多層的網絡架構來處理複雜的非線性問題。在這樣的架構中,深度學習的網絡可以從資料當中取出特徵(feature),並得到最後的結果,有時該結果甚至可以超越人類辨識準確度。近期Google以AlphaGo人工智慧圍棋程式擊敗排名頂尖的世界棋手、IBM Watson的益智問答比賽等,都是讓人為之驚豔的應用。除了這些特殊應用外,深度學習也被廣為應用在影像的分類、語音的辨識等,可以說是目前人工智慧的主流,MATLABR也納入了深度學習的相關功能。

 

11行MATLAB Code達成1000種物品辨識

要使用一個比世界頂尖的專家更厲害的演算法是否也需要聰明絕頂?答案是否定的,借用MATLAB的深度學習功能來建構和使用一套深度學習的網絡,其實比想像中容易很多。影片中示範如何使用MATLABR、網路攝影機和深度學習的網絡來偵測身邊的物體,範例中使用AlexNet來辨識,該網絡是ILSVRC-2012(ImageNet Large Scale Visual Recognition Challenge 2012)的冠軍,使用超過一百萬張的圖片訓練,可以辨識一千種物品,雖然深度學習網絡的訓練相當耗時,但只要訓練完成,就能應用在即時的系統中。
該範例程式包含設定攝影機和物件辨識兩部分,藉由簡單11行指令,MATLAB可以即時辨識攝影機所拍攝到的周遭物品,其中的AlexNet使用影像作為輸入並提供辨識結果,該結果也會標記在即時的畫面中。這件事在幾年前還如同科幻小說,但在今日使用MATLABR非常容易就可以完成。

 


Video 1: 使用11行MATLAB Code達成1000種物品辨識

 

深度學習模型的訓練 (Training from Scratch)

從以上的影片示範,我們可以知道要能辨識影像需要事先訓練深度學習模型。深度學習模型的準確性在很大程度上取決於用於訓練模型的數據量。準確的模型需要數千甚至數百萬個樣本,這可能需要很長時間才能訓練完成。一旦模型被訓練完成,它可以用於即時應用,例如先進駕駛輔助系統(Advanced Driver Assistance Systems; ADAS)中的行人偵測。
模型的訓練包含以下四個步驟:
  i. 資料集的準備
  ii. 建立深度學習模型架構
  iii. 訓練模型
  iv. 測試模型
而這四個步驟在MATLAB中的實現方式如下:

 

i. 透過imageDatastore指令以及其中所提供的參數,使用者能輕鬆定義影像資料儲存的位置以及標示類別名稱的方式:
  imageData = imageDatastore(imageDatasetPath, ...
  'IncludeSubfolders',true,'LabelSource','foldernames');

 

ii. MATLAB提供許多Convolution Neural Network (CNN)模型層的指令,例如:   影像輸入層(imageInputLayer)、二微卷積層(convolution2dLayer)等,方便使用者自訂CNN架構。
  layers = [imageInputLayer([28 28 1])
               convolution2dLayer(5,20)
              reluLayer
              maxPooling2dLayer(2,'Stride',2)
              fullyConnectedLayer(10)
              softmaxLayer
              classificationLayer()];

 

iii. 將訓練資料、CNN模型架構以及訓練參數輸入trainNetwork指令即可開始進行模型的訓練。
 options = trainingOptions('sgdm','MaxEpochs',15, ... 'InitialLearnRate',0.0001);
 convnet = trainNetwork(trainImageData,layers,options);

 

iv. 最後使用者能用clssify指令來測試模型的正確性。
 YTest = classify(convnet,testImageData);

 

遷移學習 (Transfer Learning)

從以上的簡單範例,我們可以很輕鬆的在MATLAB自訂出CNN模型架構,並從頭開始訓練。雖然從頭開始訓練一個深度學習模型可以得到很高的正確率,但很少有人會這麼做,原因有三: 第一是很少有人能收集到這麼龐大且有效的資料集,第二是訓練過程非常耗時,第三是自訂出一個原創且準確率高的CNN模型架構也不容易。因此,較方便的方式是拿已經事先訓練好的模型(Pre-trained Models),調整其架構或是權重後,針對較小量的資料集再訓練。以下為兩種方法的比較:

 


Figure1: CNN模型與遷移學習模型比較

 

以下影片展示如何在MATLAB中以簡短10行程式碼重新訓練AlexNet(一個已經事先訓練好的CNN)來辨別五種食物: 漢堡、熱狗、冰淇淋、杯子蛋糕及蘋果派。

 


Video2: 利用MATLAB 進行遷移學習 (Transfer Learning)

 

特徵抽取 (Feature Extraction)

除了以上提供的兩種方法訓練深度學習模型以識別影像外,我們也結合深度學習模型的優點,先將影像的特徵取出,再使用傳統機器學習模型進行訓練。

 


Figure2: 特徵抽取說明

 

在MATLAB使用知名的深度學習模型

相較於Training from Scratch,Transfer Learning能夠容易且快速的實現深度學習。而進行Transfer Learning的第一步,就是需要擁有Pre-trained Models。MATLAB提供了多種Pre-trained Models,像是AlexNet、VGG-16與VGG-19,這些模型在幾個不同年度的影像分類比賽(ILSVRC),都得到相當高的準確率。此外,MATLAB也支援匯入Caffe Model Zoo所提供的Pre-trained Models。若要使用這些pre-trained models,使用者必須安裝對應的MATLAB Support Package,安裝流程如下:
i. 打開MATLAB,並且連上網路
ii. 選擇HOME頁籤,點擊Add-Ons icon

 


Figure: 3

 

iii. 搜尋neural network models,點選並安裝所需的Model,就可以在MATLAB使用他們了

 


Figure: 4

 

使用GPU加速深度學習的訓練

深度學習的模型訓練需要相當長的時間,可能數天至數周不等,端看訓練模型的資料量與架構的複雜度。為了加快訓練速度,可以使用高效能的圖形處理器(GPU)來進行加速。在MATLAB進行硬體加速是非常容易的,使用者完全不需要撰寫CUDA code,就可以輕鬆的將運算分配至單個或是多個MATLAB支援的GPUs (CUDAR-enabled NVIDIAR GPU with compute capability 3.0 or higher)。如果使用者沒有GPU的設備,也可以選擇使用中央處理器(CPU)來進行運算。若電腦具備多核心處理器,MATLAB也支援將運算分配至多核心,以縮短訓練所需的時間。此外,MATLAB也支援計算機叢群(Cluster)的平行化運算,Cluster具備的CPUs與GPUs都可以用來進行訓練。MATLAB提供完整的硬體加速方案,使用者可以針對自己現有的設備來選擇加速的解決方案。
指定不同的訓練設備相當的簡單,只要在trainingOptions指定所需的ExecutionEnvironment:
% Use the CPU.
options = trainingOptions('sgdm', 'ExecutionEnvironment', 'cpu');
% Use the GPU.
options = trainingOptions('sgdm', 'ExecutionEnvironment', 'gpu');
% Use the multi-GPU.
options = trainingOptions('sgdm', 'ExecutionEnvironment', 'multi-gpu');

 

視覺化CNN的學習過程與結果

在深度學習訓練的過程中,每次的Iteration所對應到的Accuracy與Loss,MATLAB都可以容易的取得並且作圖。如此可以視覺化的了解整個CNN的訓練狀況,使用者甚至可以撰寫一些決策的程式碼,去介入訓練結束的時機點。例如說當Accuracy達到99%的時候,即使Epoch還沒跑完,就請他終止訓練,如此能夠減少時間的浪費。

 


Figure: 5

 

在進行深度學習的時候, CNN會自行對訓練影像取特徵並且分類,但CNN在訓練過程中學到了什麼,其實我們是不清楚的。MATLAB提供一個名為DeepDream的演算法,它原先是由Google開發的,功能是去視覺化任一個Channel學習到的特徵。下方兩張圖是將AlexNet裡面的Fully Connected Layer, Convolution Layer所蘊含的特徵視覺化過後的結果。

 


Figure: 6

 

我們也可以將測試影像對於某一層Layer活化(Activation)過後的結果繪製出來,接著與原始影像比對後,就可以了解學習到的特徵是什麼而且分佈在影像的何處。下方左圖是我們準備的測試影像,右圖則是在AlexNet的Relu5活化的結果圖,可以看到經由學習他得到了眼睛這個臉部特徵。

 


Figure: 7

 

進一步了解MATLAB與深度學習

深度學習文件:
Deep Learning in MATLAB
Specify Layers of Convolutional Neural Network
Set Up Parameters and Train Convolutional Neural Network
 

深度學習影片:
Introduction to Deep Learning: What Is Deep Learning?
Introduction to Deep Learning: Machine Learning vs. Deep Learning
Object Recognition: Deep Learning and Machine Learning for Computer Vision