然後用 TFlearn 把 lstm 架構寫出來,
並看到學習的結果。
------------------------------------------------------------------------------------------------------------
四、亂數資料
這邊因為我們處理出來的資料,都是依照時間序列輸出,
為了讓學習與檢驗更加客觀,我們寫一個亂數的方法把資料打亂。
def shuffledata(data,test_size = 0.2):
random.shuffle(data)
n_data = len(data)
size = int(test_size*n_data)
tr_X = data[:,0][:-size]
tr_y = data[:,1][:-size]
te_X = data[:,0][-size:]
te_y = data[:,1][-size:]
return tr_X, tr_y, te_X, te_y
------------------------------------------------------------------------------------------------------------
五、LSTM model 與 Training
def lstm_model(input_size,time_steps,output_size):
# 設定輸入資料維度並經由 128*input size 的矩陣做轉換傳給下一個 time steps
network = input_data(shape=[None,time_steps,input_size], name='input')
network = lstm(network,128, dropout=0.8,forget_bias=0.8)
# 這邊我用兩個 fully connection
network = fully_connected(network, 32, activation='relu')
network = dropout(network, 0.8)
# softmax 輸出成機率
network = fully_connected(network, output_size, activation='softmax')
network = regression(network, optimizer='adam', learning_rate=LR, loss='categorical_crossentropy', name='targets')
model = tflearn.DNN(network, tensorboard_dir='log', tensorboard_verbose=1)
return model
def train_model(tr_X,tr_y,te_X, te_y, model=False):
# 獲得輸入資料維度
input_size = len(tr_X[0][0])
time_steps = len(tr_X[0])
# 轉換資料為訓練和測試組
tr_X = np.array([i for i in tr_X]).reshape(-1,time_steps,input_size)
te_X = np.array([i for i in te_X]).reshape(-1,time_steps,input_size)
tr_y = [np.array(y) for y in tr_y]
te_y = [np.array(y) for y in te_y]
if not model:
model = lstm_model(input_size,time_steps,len(te_y[0]))
# 最佳化 LSTM model
model.fit({'input': tr_X}, {'targets': tr_y},validation_set=(te_X, te_y), n_epoch=5, snapshot_step=1103, show_metric=True, run_id='tx_learning')
return model
到這邊,我們需要的方法,已經都寫完了。
接下來,只要把方法都串起來就可以了,
# load 上一篇整理好的資料
data = np.load("preprocessing_15to15.npy")
# 將資料分為測試組和訓練組
tr_X, tr_y, te_X, te_y = shuffledata(data)
# 最佳化模型
model = train_model(tr_X, tr_y,te_X, te_y)
# 將 weight 儲存下來
model.save('lstm_15to15.tflearn')
執行這個 script,我們可以看到結果如下,
其實結果不算太好,隨著 epoch, loss 沒有下降,acc 沒有上升,
val_acc 更是幾乎沒有改變而且只有 0.467 的準確率,
這代表,model 一直找不到讓熵最低的點,只有辦法在 local minimun 鬼混,
但這僅僅是數字結果,下一章節讓我們打開 tensorboard ,
看一下具體 loss 隨每一個 Training Step 的變化,
並且寫一個圖像化的方法,把我們機器做預測的樣子看一下,
才能比較了解,接下來要怎麼 tune model。
------------------------------------------------------------------------------------------------------------
Reference
[1] Practical Machine Learning Problem
[2] 圖解機器學習
[3] Coursera - Machine Leanring
[4] A tour of machine learning algorithms
[5] Deep Learning Book
[6] Threshold Potential
[7] Activation Function
[8] Receptive fields and functional architecture of monkey striate cortex
[9] TFLearn
期待下一篇 ><
回覆刪除您好,請問可否問你些程式碼上的問題呢?
回覆刪除可以啊!
刪除