【程式學習之路:Day51】人工智慧概述: 卷積神經網路CNN

莎莉 Sally
為自己的生涯成長
9 min readMar 26, 2019

今日重點:DNN 複習 、CNN觀念建立、使用卷積神經網路辨識手寫數字圖形訓練、

∎ 卷積神經網路CNN ( Convolutional Neural Network)

深度學習網路 DNN 複習:
多層次連接網路,可視為分類的過程,
將物件從空間化成線(空間感消失,距離變遠),逐漸收斂到正解
但如果問題太大,收斂耗費過程久,中間資料遺失,效率差一些 。

傳統的DNN(即Deep neural network,泛指一般的深度學習網路)最大問題在於它會忽略資料的形狀。例如,輸入影像的資料時,該data通常包含了水平、垂直、color channel等三維資訊,但傳統DNN的輸入處理必須是平面的、也就是須一維的資料。

因此,若去除了這些形狀資訊,就代表失去了一些重要的空間資料,像不同影像但類似的空間可能有著相似的像素值,RGB不同的channel之間也可能具有某些關連性、而遠近不同的像素彼此也應具有不同的關聯性,而這些資訊只有在三維形狀中才能保留下來。

因此,Deep learning中的CNN較傳統的DNN多了,
Convolutional(卷積)及池化(Pooling) 兩層layer,
用以維持形狀資訊並且避免參數大幅增加。

CNN觀念建立
卷積特徵卷取,可快速收斂,也可保持特徵值
主要程序:特徵取樣>透過池化進行簡化

Q:如何做出特徵取樣器?

  • 卷積取樣:設定Kernel為特徵值,去比對黑白圖片(亮1 暗0),
    Kernel可視為小視窗,取樣,過濾器,至圖片取樣
    兩者相乘的乘積會變成更大或更小的數(1或0),
    這個過程為過濾 (過濾器),
    過濾這張黑白圖片有多符合特徵值。
  • ReLU函數處理:形成feature map
    傳遞區域特徵值給下一層, 專注在取得圖形的這些局部特徵。
  • 補充:

1. stride:kernel是逐步移動一格,因此我們稱其stride步長為一
(這個值是定義CNN時的hyperparameter之一)
如果把stride加大(例如將照片拉遠看),
那麼涵蓋的特徵會比較少,
但速度較快(在團體照中找到目標)得出的feature map更小,
因為有時我們在辨別人臉時,不用精準到看到毛細孔

stride大,特徵值少
stride小,特徵值多

2. valid padding: 得到的feature map比起原圖要小

3. zero-padding: 希望輸出的是與原圖同等大小的圖形,那麼就需要在原圖周圍補上0 (如下圖所示)

4. Kernel的大小與數量:需不斷實驗測試出可接受的準確度

5. relu 是怎麼做的?

理解卷積神經網絡的初學者指南
A Beginner’s Guide To Understanding Convolutional Neural Networks- Part1
A Beginner’s Guide To Understanding Convolutional Neural Networks -Part 2

▸演練1
圖像訓練:使用卷積神經網路辨識手寫數字
傳統官方作法,參考文件

安裝Yarn,在cmd環境啟用

依照參考文件,執行程式碼

圖像訓練:使用卷積神經網路辨識手寫數字
上機演練,成功範例為 test0326_index_OK.html

  1. 操作畫面與函式庫前置

ASPNET應用程式(空白)
將data.js貼上專案,註解內容的export文字
加入html內容

目前畫面:

<Question> 請問 HTML 文件引用了哪些 JavaScript ?

https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js
https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js

<! — TansorFlow.js →
<script src=”https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"></script>

<! — Mnist class, download images from MINST →
<script src=”data.js”>

2. 建立 model :

<Question> 什麼是 model ?
在此為多層神經網絡
model上節為函式,資料加演算法

<Question>
tf.sequential() 建立的是怎樣的神經網路?
各層之間的關係如何?
為循序,上一層的權重計算(tf)結果

3. 定義卷積網路的各個神經層:準備進行特徵卷取

3.1 在 createModel() 加進下列程式以定義第一層卷積網路神經層:

inputShape::[28, 28, 1]:寬28 高28 單色1
kernelSize::5:5x5 Kernel
strides: 1:一畫素的步幅
filters: 8:8個取樣視窗

3.2 在 createModel() 加進下列程式以定義 maxPooling 池化層:
<Question> pooling 是什麼? 用來壓縮
<Question> poolSize、strides 各參數分別在設定什麼?

3.3–4在 createModel() 加進第二層卷積網路神經層與maxPooling 池化層:
完成畫面:

3.5 在 createModel() 銜接 CNN 網路到全連接層網路:分類器的意思
dense:全神經連結網路,權重值計算

4. 載入 MNIST 圖檔並且訓練模型

4.1 在 </script> 前一行,貼入下列程式:

4.2 在 </script> 前一行,再貼入下列程式:加入訓練

4.3 將 main() 函式的內容改寫成這樣:

5. 驗收訓練成果

找到prediction-div’
建立一個新的canvas
畫出draw(image.flatten(), canvas);

完成畫面

結論技巧:應用時使用已訓練Model

▸演練 2
載入卷積神經網路辨識手寫數字 mode,直接應用已訓練好的模型
a) 將 model 存入 localstorage
b) 從 localstorage 載入 model,不經訓練程序,直接進入預測應用

參考文件

a)儲存 tf.Model [index.cshtml]
儲存Model以免每次都要載入和訓練,效率較低

const saveResult = await model.save('localstorage://my-model-1');

檢查

b) 載入 tf.Mode [index.cshtml]
l從 localstorage 載入 model,不經訓練程序,直接進入預測應用

若model有儲存,就直接從本端讀取,若無即從遠端

管理存在客戶端的模型

用來查詢本地端是否有儲存model
// 列出 Local Storage 裡的模型
console.log(await tf.io.listModels());

▸演練 3
載入卷積神經網路辨識手寫數字 mode,直接應用已訓練好的模型
c) 寫一個 ASP.NET 的伺服器程式,接收 client 上傳過來的一對 model 檔案
d) 類似 b),但改成到 ASP.NET 網站下載 model

前置:
建立Web表單
將model傳入本端

C) 接收 client 上傳過來的一對 model 檔案。 [index.cshtml]

∎ 語音辨識

語音服務文件

語音轉文字
備註:安全性考量,金鑰須從Server取回(ASPNET)

  • Azure建立語音API服務
  • 下載Microsoft 認知服務語音 SDK (下載 1.3.0 版)
  • 建立ASPNET空白
  • 建立 index.html 網頁(依參考文件)
    建立下列 HTML 基本架構
    將下列 UI 程式碼新增至您檔案中的第一個註解下
    新增對語音 SDK 的參考
    連接辨識按鈕的處理常式、辨識結果,以及 UI 程式碼定義的訂用帳戶相關欄位
  • 將Microsoft 認知服務語音 SDK資料夾置入專案,並引用(注意路徑)
  • 修改API資料(將資訊套牢)

<Question> 似乎聽不懂中文,你能修正這個問題嗎?

-The End-

--

--