2017年5月19日 星期五

[深度學習練習] [Deep Learning Practice] 神經網路入門(十一)- 遞歸神經網路 X TFLearn X 台指分K

這一篇會加上一些基本前處理步驟,

然後用 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

3 則留言: