Professional Documents
Culture Documents
AI教案 (CR003) RNN時序性模型與耐能Edge AI開發 ok8
AI教案 (CR003) RNN時序性模型與耐能Edge AI開發 ok8
RNN時序性預測模型
&耐能Edge AI開發
By 高煥堂 團隊
歡迎光臨
Edge AI
開發者
俱樂部
網址: https://linktr.ee/Edge.AI
1 時間序列資料
與RNN模型
時間序列資料
介紹時間序列資料(數據)
以學校宿舍餐廳爲例
• 學校宿舍每天晚上都會供應晚餐。
• 其中,每天的晚餐的安排是有規律的,就是每周從星
期一到星期五不斷地循環。
• 如果昨天吃披薩,今天就是壽司;如果昨天吃壽司,
今天就會是鬆餅,非常有規律。如下圖:
以學校宿舍餐廳爲例
(t-1) (t)
圖片來源 --- https://docs.google.com/presentation/d/1hqYB3LRwg_-
ntptHxH18W1ax9kBwkaZ1Pa_s3L7R-2Y/edit#slide=id.g1e0528c0bb_0_48
時間序列資料
想一想…
• 如果您昨天不在宿舍裏吃晚餐,那麽您是否就無法推
測今天晚上將是什麽餐點?
• 當然可以的。因爲您可以利用前天晚上的餐點資料,
來預測昨天晚上的餐點。然後,也就能預測今晚的餐
點了。
• 所以,我們不只能利用昨天晚上的餐點來預測今晚的
餐點,而且還能利用今晚預測的結果,來進一步的明
天、後天的晚餐,等等。
時間序列資料
想一想…
時間序列資料
昨晚資料欠缺也沒關係的
時間序列資料
昨晚的預測,可以推論出今晚的預測值
於是得出:RNN( Recurrent Neural Network)網路
於是得出:RNN( Recurrent Neural Network)網路
時間序列資料
RNN的圖示
https://www.cs.toronto.edu/~tingwuwang/rnn_tutorial.pdf
時間序列資料
各種不同形式的RNN
https://calvinfeng.gitbook.io/machine-learning-notebook/supervised-learning/
時間序列資料
各種不同形式的RNN
https://calvinfeng.gitbook.io/machine-learning-notebook/supervised-learning/
其中的Output是可有可無的
https://blog.floydhub.com/a-beginners-guide-on-recurrent-neural-
networks-with-pytorch/
其中的Output是可有可無的
輸出
預測值
以二進位加法是爲例
以二進位加法是爲例
( 0 1 1 )2
( 0 1 1 )2
進位1
0
(t) (t-1) (t-2)
RNN基本演算法
以二進位加法是爲例
( 0 1 1 )2
( 0 1 1 )2
進位1 進位1
1 0
(t) (t-1) (t-2)
RNN基本演算法
以二進位加法是爲例
( 0 1 1 )2
( 0 1 1 )2
進位0 進位1
1 1 0
(t) (t-1) (t-2)
RNN基本演算法
以二進位加法是爲例
( 0 1 1 )2
( 0 1 1 )2
進位0 進位1
1 1 0
(t) (t-1) (t-2) [1, 1] t-2
[1, 1] t-1
[0, 0] t
y0
wo
wp
h0 h0
h1 h1
w
x0 x1
[1, 1] t-2
[1, 1] t-1
(011) 2 + (011) 2 = (110) 2 [0, 0] t
y0
wo
wp
h0 h0
h1 h1
w
[0, 0] (Initial) x0 x1
[1, 1] t-2
[1, 1] t-1
[0, 0] t
[ y0 ] (t-2)
y0
wo
wp
h0 h0
h1 h1
w
[0, 0] (Initial) x0 x1
wo
wp
h0 h0
h1 h1
w
[0, 0] x0 x1
wp
h0 h0
h1 h1
w
[0, 0] x0 x1
[h0, h1] (t-2)
[1, 1] t-2
[h0, h1] (t-1) [1, 1] t-1
[0, 0] t
[ y0 ] (t-2)
y0
[ y0 ] (t-1)
wo
wp
h0 h0
h1 h1
w
[0, 0] x0 x1
[h0, h1] (t-2)
[1, 1] t-2
[h0, h1] (t-1) [1, 1] t-1
[0, 0] t
[ y0 ] (t-2)
y0
[ y0 ] (t-1)
wo
[ y0 ] (t )
wp
h0 h0
h1 h1
w
[0, 0] x0 x1
[h0, h1] (t-2)
[1, 1] t-2
[h0, h1] (t-1) [1, 1] t-1
[0, 0] t
RNN基本演算法
以二進位加法是爲例
[1, 1] t-2
輸入值(X) [1, 1] t-1
[0, 0] t
訓練RNN
3 -- 正向推演
正向推演(Feed forward)
以二進位加法是爲例
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
z0 0 z1 1 z2 1
Error0 Error1 Error2
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
歡迎加入<AI設計IC(晶片)>
LINE討論群,請用手機掃描:
台灣AI高通量計算 研發中心
高煥堂 主任 邀請您
訓練RNN
4 -- 反向傳播
0 0 0 1 0 1
y0 y1 y2 Error
=1
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
0 0 0 1 0 1
y0 y1 y2 Error
=1
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
0 0 0 1 0 1
y0 y1 Error y2 Error
=1 =1
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
0 0 0 1 0 1
y0 y1 Error y2 Error
=1 =1
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
0 0 0 .2 1 0.15 1
y0 y1 Error y2 Error
= 0.8 = 0.85
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
0 0 0 .2 1 0.15 1
y0 y1 Error y2 Error
= 0.8 = 0.85
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
0 0 0 .2 1 0.15 1
y0 y1 Error y2 Error
= 0.8 = 0.85
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
0 0 0 .2 1 0.15 1
y0 y1 Error y2 Error
= 0.8 = 0.85
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
0 0 0 .3 1 0.25 1
y0 y1 Error y2 Error
= 0.7 = 0.75
wo wo wo
wp wp
Hidden Hidden Hidden
w w w
x0 x1 x2 x3 x4 x5
1 1 1 1 0 0
訓練RNN模型
[1, 1] t-2
[1, 1] t-1
[0, 0] t
輸入值(X)
訓練RNN模型
輸入值(X) 目標值(T)
訓練RNN模型
以二進位加法是爲例
目標值(T)
輸入值(X)
RNN醫療應用
5 -- 搭配NLP模型
5.1
簡介NLP在醫療上的應用
• NLP
• 自然語言處理(NLP:Natural Language
Processing)是人工智慧的一項分支,它使電腦能够
理解和解釋人類的語音和文句,更善解人意。
• 它的工作流程是:NLP系統首先“整理”文本資料
集,將資料組織爲更具邏輯性的形式,例如將文本
(Text)分解爲較小的語義單元(Token)。幷轉換爲向
量,讓NLP系統更易于探索資料裏潜藏的規律。
1. 將Text分解成Sentences:
# txx01.py
import nltk
from nltk import sent_tokenize
nltk.download('punkt')
# End
此程式輸出:
# txx02.py
import nltk
from nltk import sent_tokenize
nltk.download('punkt')
text1 = "My joints feel so pain. I have heart flutters, and
irregular heartbeats(arrhythmias). "
text2 = "I have a little bit abdominal pain."
text3 = "I usually feel a lack of energy."
ss1 = sent_tokenize(text1)
ss2 = sent_tokenize(text2)
ss3 = sent_tokenize(text3)
……
2. 將分解出來的Sentences,存入檔案裏:
……
with open('c:/oopc/myText.txt', 'w') as the_file:
for i in range(len(ss1)):
the_file.write(ss1[i]+'\n')
for i in range(len(ss2)):
the_file.write(ss2[i]+'\n')
for i in range(len(ss3)):
the_file.write(ss3[i]+'\n')
此程式誕生一個檔案:
檔案的內容:
3. 將Sentence分解出Words:
# txx03.py
import nltk
#from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
# End
此程式輸出:
# txx04.py
import nltk
#from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
# End
此程式輸出:
5. 將Word(中英文)轉換出向量(Word2Vec):
# BERT範例程式
import os
# 設置預訓練模型的路徑
pretrained_path = 'c:\oopc\chinese_L-12_H-768_A-12'
config_path = os.path.join(pretrained_path, 'bert_config.json')
checkpoint_path = os.path.join(pretrained_path, 'bert_model.ckpt')
vocab_path = os.path.join(pretrained_path, 'vocab.txt')
# 構建字典
from keras_bert import load_vocabulary
token_dict = load_vocabulary(vocab_path)
# Tokenization
from keras_bert import Tokenizer
tokenizer = Tokenizer(token_dict)
# 繼續(Continued)
# (接續上頁)
# 載入預訓練模型
from keras_bert import load_trained_model_from_checkpoint
model = load_trained_model_from_checkpoint(config_path,
checkpoint_path)
text = ‘我關節痛'
tokens = tokenizer.tokenize(text)
indices, segments = tokenizer.encode(first=text, max_len=512)
print(indices[:10])
print(segments[:10])
# 提取特徵
import numpy as np
predicts = model.predict([np.array([indices]), np.array([segments])])[0]
for i, token in enumerate(tokens):
print(token, predicts[i].tolist()[:5])
# End
BERT 模型的使用主要有兩種用途:
• 當作文本特徵提取的工具,類似Word2vec模型一樣
• 作爲一個可訓練的層,後面可接入客制化的網路,做遷移學習
• BERT可以很好的解决sentence-level的建模問
題,例如:Next Sentence Prediction的預訓練
任務,像詩詞對句的Fine-tuning應用情境。如
下:
5.2
BERT應用于Medicare
BERT應用于Medicare
• 醫療資料挖掘發展迅速,然而過去許多醫療數據(如
電子病歷資料)仍然以自然語言文本形式存在。
• 由于自然人的學習能力有限,因此通過NLP來輔助
匯集醫療知識和資料挖掘的工作,然後將知識提煉
出來,萃取有用資訊,最終形成AI智慧。
• https://www.researchgate.net/publication/341668475_Med-
BERT_pre-trained_contextualized_embeddings_on_large-
scale_structured_electronic_health_records_for_disease_prediction
• One way to improve the word accuracies is to use
NLP (Natural Language Processing) techniques to
replace incorrect words with correct ones. In this
blog, we will use a spell checker and BERT (pre-
trained NLP model) to improve OCR accuracy.
https://global.hitachi-solutions.com/blog/nlp-in-healthcare
範例:命名實體識別(NER:Name Entity Recognition)
生物NER,是從生物醫學文本中識別出指定類型的名稱,比如
基因、蛋白質、核糖核酸、去氧核糖核酸、疾病、細胞、藥物
的名稱等。
由于生物醫學文獻的規模龐大,各種專有名詞不斷涌現,一個
專有名詞往往有很多同義詞,而且普遍存在大量的縮寫詞,人
工識別費時費力,因此如何對命名實體進行識別就變得尤爲重
要。
命名實體識別是文本挖掘系統中的一個重要的基礎步驟,命名
實體識別的準確程度是其他文本挖掘技術如信息提取或文本分
類等的先决條件。
5.3
以血鐵沉積分類器爲例
6. 將剛才<血鐵沉積症>的Named-Entities(即Words)
出現頻率,以及向量,做爲AI模型的X空間資料。
7. 繼續貼上分類標簽(Class Label),就成爲一個AI分類
模行了:
• 這個AI模型:來學習人類專家的果因性智慧。
Y:
X: 各器官
血鐵沉積 W&B
血鐵沉積
症狀 程度
6項症狀 血鐵沉積
(果) 程度(因)
• 這個果因性AI模型,搭配其他Regression因果性AI
模型,成爲美好的組合:
• 一個做因果性思考,另一個做果因性思考。
• 常常可以幫助人類更多。
5.4
分類器與RNN的完美組合
X W&B
Y
X Y
W&B
器官 輸血量 排鐵劑量 器官
狀態(t-1) (t-1) (t-1) 狀態(t)
X :輸入(層)特徵
Y :輸出(層)特徵
W&B
Y :輸出(層)特徵
X :輸入(層)特徵
Y:輸出特徵(t)
X:輸入特徵(t)
Y:器官狀態(t-1) Y:輸出特徵(t)
器官 器官
狀態(t-2) 狀態(t-1)
輸血量 輸血量
(t-2) 排鐵劑量 (t-1)
(t-2) 排鐵劑量
(t-1)
Y:輸出特徵(t-1)
Y:輸出特徵(t)
H層
(t-2)
X:輸入特徵(t-2) X:輸入特徵(t-1)
Y:輸出特徵(t-1) Y:輸出特徵(t)
H層
H層(t-1)
(t-2)
X:輸入特徵(t-2) X:輸入特徵(t-1)
Y:輸出特徵(t-1) Y:輸出特徵(t)
初期H值
X:輸入特徵(t-2) X:輸入特徵(t-1)
器官
狀態
H值
初期H值
輸血量 排鐵劑量
上述模型背後的Assumption:
• 果:各器官因輸血而受到影響。
• 因:輸血方案。
• 人的期望:從果追溯其因,然後提出來改善因,就
能改變果。
于是,人機共舞模式是:
• AI基于單純回歸模型:找出因果性,就
• 能提出風險預警,來幫助人類。
• 人的任務:基于AI的預警,從果追溯其
• 真正的因,然後改善因,來改變果。
它的主要Limitations是:
• 單純回歸模型:AI找出的只是相關性,
• 不一定是真正的<因果性>。
• 真正的因果性:仍完全依賴于人類專家。
改善的途徑之一是:
• 增添幾個搭配的AI模型:來學習人類專家的果因性智
慧。
• 例如,讓AI像人類專家一樣,從輸血前的ECG心電
圖,可以删除患者心悸是來自心臟機能萎縮之因,就
能更確定患者心悸,主要是源于輸血之因。
PS.
• 樸素的Regression Model只依賴資料相關性,幷無法
像人類一樣進行<果因性>推論。
• 此時,可以建立監督式學習的AI模型,這模型的輸入
值代表AI可以觀察到的果。
• 而人類專家在模型裏貼上標簽(Label)來代表人類專家
心中認定的因。然後讓機器學習,AI就可學會了人類
專家的果因性推理了。
可參閱這本書:
如果縮小上述模的範圍:
※ 新的Assumption:
• 果:因輸血而出現的血鐵沉積症狀,如:心悸、關節
痛、疲倦、體重消失等。
• 因:輸血方案。
• 人的期望:從果追溯其因,然後提出來改善因,就能
改變果。
Y:血鐵沉積症狀(t-1) Y:血鐵沉積症狀(t)
初期H值
H值
初期H值
輸血量 排鐵劑量
練習一下:
• 增添一個搭配的AI模型:來學習人類專家的果因性智
慧。
Y:
X: 各器官
血鐵沉積 W&B
血鐵沉積
症狀 程度
6項症狀 血鐵沉積
(果) 程度(因)
模型-1
模型-2
RNN設計範例
6 -- 以血鐵沉積爲例
以血鐵沉積爲例
• 長期輸血會導致過多的鐵質累積在體內,造成身體嚴重的
傷害,尤其是心臟與肝臟,甚至可能造成生命的危險。
• 例如,一位長期輸血者的時序性數據,如下:
Hidden
初期值
wp
[0,0,0,0]
4 1 2
wp
[0,0,0,0]
4 1 2
wp
[0,0,0,0]
4 1 2
[0.6, 0.5, wp
0.6, 0.4]
2 1 0
[0.6, 0.5, wp
0.6, 0.4]
2 1 0
wp
[0,0,0,0]
4 1 2
[0.5, 0.7, wp
0.3, 0.6]
3 2 0
[0.5, 0.7, wp
0.3, 0.6]
3 2 0
[0.5, 0.7, wp
0.3, 0.6]
3 2 0
RNN模型設計範例
此模型的輸入值與目標值
目標值(T)
輸入值(X)
7 範例實現
-- 血鐵沉積RNN模型
-- 使用Pytorch
使用Pytorch
• 在這個步驟裡,會使用到Pytorch建模框架。
Toolchain
Toolchain 推論引擎
推論引擎
Pytorch
Pytorch (優化器)
(優化器) (Emulator)
(Emulator)
*.onnx 耐能標準
耐能標準
*.onnx
*.onnx *.onnx
*.onnx
使用Pytorch
延續上一小節的血鐵沉積RNN範例
使用Pytorch
延續上一小節的血鐵沉積RNN範例
many to many
many to one
many to one
many to one
• 上圖也相當於:
詳細的權重(W),表示如下圖:
h0
設定 h[ ]
h1 初值爲0
h2
h3
x0 x1 x2 x0 x1 x2 x0 x1 x2
h0
設定 h[ ]
h1 初值爲0
h2
h3
wp
w
x0 x1 x2 x0 x1 x2 x0 x1 x2
wp
h0
h1 y
h2
h3
w
x0 x1 x2 x0 x1 x2
wp
h0
h1 y
h2
h3
w
x0 x1 x2
Delta&
Error
h0 wo
h1 y
h2
h3
Delta& Delta&
Error Error
h0 wo
h1 y
h2
h3
Delta& Delta&
Error Error
wp
h0
h1
h2
h3
wh
x0 x1 x2
Delta& Delta&
Error Error
wp
h0
h1
h2
h3
w
x0 x1 x2
Delta&
Error
w
x0 x1 x2
使用Pytorch
撰寫Python程式
定義
RNN模型
撰寫Python程式
準備
訓練資料
建立
RNN模型
設定
反向傳播參數
撰寫Python代碼
• 訓練1000回合:
撰寫Python代碼
匯出
*.onnx檔案
使用Pytorch
輸出測試結果:
使用Pytorch
匯出*.onnx檔案
也將模型存入*.onnx檔案裡
Toolchain 推論引擎
Pytorch
(優化器) (Emulator)
*.onnx 耐能標準
*.onnx
8 優化模型:
使用耐能Toolchain
使用Toolchain
• 在上一小節,已經使用Pytorch建立一個RNN時序性
• 預測模型了。並且匯出為rnn.onnx模型檔案。
• 接下來,就繼續對這個模型,來進行優化,然後輸出
耐能(Kneron)的標準ONNX檔案。於此,將它取名為:
rnn_opt.onnx。
使用Toolchain
• 將模型優化,然後輸出標準ONNX檔案
8.1
準備2支小程式
使用Toolchain
• 在這個步驟,需要使用到耐能公司提供的Toolchain
工具箱。關於如何安裝及使用耐能Toolchain,請您
閱讀這份文件:
• 若需要,可來信索取
Email:misoo.tw@gmail.com
使用Toolchain
• 在這份文件裡,有詳細的範例指引您快速安裝
Docker Desktop。
• 然後匯入耐能提供的Toolchain鏡像(Docker Image)。
• 就能在Docker容器(Container)裡使用Toolchain,來
將上述的rnn.onnx模型進行優化動作了。
使用Toolchain
• 只要依循這份文件裡的範例:
• 就會看到2支已經寫好的小程式:
1、StartDocker.bat
2、Owl777_convert.py
使用Toolchain
• 就可以把它們複用(Reuse)過來。
• 於是,把它們複製到 c/Users/misoo/ox/目
錄區裡:
使用Toolchain
• 其中的StartDocker.bat是一個Windows的批
次檔(Batch File)。
• 其內容為:
使用Toolchain
• 它是用來快速(便捷)啟動Docker容器。
• 您不需要去更改它,待會兒直接使用即可。
使用Toolchain
• 接下來,需要來修改Owl777_convert.py程式碼。
• 請開啟(可使用Widows記事本或Python Shell)其中
的Owl777_convet.py程式檔。如下:
使用Toolchain
• 然後,只要更改上圖的紅色框框裡的’檔案
名稱’即可。如下:
使用Toolchain
• 最後,把它存檔。也可以更改檔名。
• 例如,取個新檔名(mfcc_convert.py),如下:
8.2
展開優化動作
快捷啟動Docker容器
• 使用檔案總管,瀏覽到上圖裡的c:/Users/misoo/ox/
目錄區,並點選<StartDocker>批次檔,就會執行
它,就啟動 Docker如下:
展開<優化>過程,並輸出結果
• 剛才已經寫完了mfcc_convert.py程式。並且放置於
c:/Users/misoo/ox/目錄區裡,如下:
展開<優化>過程,並輸出結果
• 接下來,將c:/Users/misoo/ox/目錄區裡的
rnn_convert.py程式複製到/workspace/目錄區裡,
使用下述的命令:
cp /docker_mount/rnn_convert.py .
• 請留意:尾巴有一個句點( . ),句點前要有空格。
如下:
展開<優化>過程,並輸出結果
• 於是,就把這支App複製到/data1/目錄區裡了。
展開<優化>過程,並輸出結果
• 最後,就來執行這支App,使用下述的命令:
python /data1/rnn_convert.py
• 於是,展開<優化>過程,如下畫面:
生成了耐能的
標準onnx檔案,
這是input_name
(下一小節會用到)
展開<優化>過程,並輸出結果
• 這樣就便捷地進行<優化>,而生成了mfcc_opt.onnx
檔案,並且放置於c:/Users/misoo/ox/目錄區裡。
• 如下:
使用Toolchain
• 將模型優化,然後輸出標準ONNX檔案
展開<優化>過程,並輸出結果
• 於是,模型優化成功了。
• 現在,請您先關閉(close)這個命令列視窗。也就是
關閉了Docker容器。
9 進行推論
--使用onnxruntime
或ktc.inference
推論引擎
進行推論
• 將模型優化,然後輸出標準ONNX檔案
進行推論
• 例如,可以在Windows空間裡進行推論。也可
以Docker容器裡進行推論。也可以在耐能KL520
硬體設備裡進行推論。
9.1
準備推論(預測)
-- 撰寫一支App
撰寫一支App,來引導推論
• 接下來,基於上一節已經優化的rnn_opt.onnx來進行
推論;並且輸出預測(Predict)結果。
• 於是,就來寫一支Python程式,它將啟動onnxruntime
推論引擎,及載入rnn_opt.onnx模型。
• 本範例,將在Windows空間裡進行推論。這支
程式內容如下:
rnn_app.py程式碼
載入
rnn_opt.onnx
rnn_app.py程式碼 準備
測試資料
展開推論
輸出推論結果,如下:
進行推論
• 於是,完成了很棒的推論。
• 展現了很不錯的時序性預測威力。
9.2
下一步…
下一步:在KL520、KL570實體設備裡推論
THANK YOU
請繼續閱讀
下一集
歡迎
來信索取<本文裡的範例程式碼>
Email:misoo.tw@gmail.com
台灣AI高通量計算 研發中心
高煥堂 團隊
THANK YOU
高煥堂 教授