最近有個專案需要用AI執行訊號預測,經大神指點可以使用LSTM來執行,主要原因是LSTM很適合用來處理有序列關係的數據。由於dataset是來自於感測器所擷取的訊號,和線上已經前置處理過的資料集完全不同,因此在處理輸入輸出格式的時候多花了不少心力處理,在這邊紀錄處理過程,LSTM原理就不詳述了,只著重於操作面。
起手式:
載入所需要的套件
接著,講解一下輸入格式,LSTM是用來處理有序列關係的數據,因此輸入的資料格式和一般的神經網路不太一樣。
舉個例子:
假設要分析的訊號有九個元素,每個元素是相隔時間t取出來的:
input=[0.02,0.13,0.27,0.35,0.44,0.59,0.61,0.72,0.87]=[e1,e2,…,e9]
如果輸入的長度(seq_length)為5,則把這個訊號切分:
inputs1是初始狀態,inputs2是下個時刻的狀態,切到最後一個元素
input1=[e1,e2,e3,e4,e5]
input2=[e2,e3,e4,e5,e6]
….
input5=[e5,e6,e7,e8,e9]
最後,這個範例要餵進去的資料就有5個。輸入的參數維度是1。
如果是多維度的(像是自然語言處理,每個字都會被拆成向量來處理),比如說:
"大",”家”,”好”,”我”,”是”,”某”,”某”,”某",共八個字
會被先轉換成向量,實際上中間轉換步驟很多,不過這邊就省略,也把它簡單化表示。
input_vec=[E1,E2,…,E8]
E1=[0.1,0.0,-1.5]=[E11,E12,E13],
E2=[1.5,-1.4,0.236]=[E21,E22,E23],
…
E8=[0.0,-3.51,2.3]=[E81,E82,E83]
假設輸入長度也是5,那這個時候輸入的維度就會是3
input_vec1=[E1,E2,…,E5]=[[E11,E12,E13],[E21,E22,E23],…,[E51,E52,E53]]
input_vec2=[E2,E3,…,E6]
…
input_vec4=[E4,E6,…E8]
以上就是輸入的格式範例說明。
LSTM模組撰寫
LSTM參數說明
初始函式,input_feature_dim代表輸入訊號的維度,
hidden_feature_dim代表隱藏層的維度,設定越多代表能記住的特徵越多,不過同時也代表訓練更耗時,而且設定過多也不保證記住的都是有用的
hidden_layer_num,隱藏層的數目,層數和hidden_feature_dim相乘就是總共的特徵數
batch_size,單次輸入的批量,在pytorch裏頭,即使每次都只餵1個數據,但是在tensor的設定上還是得設定batch_size=1
參數設定詳細可參考pytorch DOC:
https://pytorch.org/docs/stable/nn.html?highlight=lstm#torch.nn.LSTM
定義t=0的時候的Hidden_cell_state
在LSTM裏頭,hidden state和cell state,hidden state儲存當前LSTM CELL的運算結果,並且pass到現在這一個CELL,而cell state則是儲存當前memory的值,這個值會傳遞到下一個CELL,上一個cell state會根據forget gate的值決定會不會被保留起來,如果 forget gate是0,則當前cell state就不會存有上個cell state的值。
定義h0 c0 也就是hidden state,cell state在 t=0的狀態,由於LSTM的輸入必須有前一個LSTM計算出來的 hidden state和cell state,因此在頭一個CELL的時候,必須自己弄一個隨機生成的初始狀態。在pytorch裏頭,如果這步沒做,hidden state 和 cell state就會全部元素為0當作初始值
上面的程式碼就可以建構一個LSTM的模型,接下來就是應用這個模型了.
建構lstm物件、反向傳播機制和loss function
進行訓練
以上就是LSTM的簡易操作面說明