【程式學習之路:Day51】人工智慧概述: 卷積神經網路CNN
今日重點: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
- 操作畫面與函式庫前置:
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-