2017-07-24 175 views
8

(我測試寫短而有效的問題,以便讓我知道我怎麼在這裏做我的能力)3darray訓練/測試TensorFlow RNN LSTM

我努力訓練/測試TensorFlow迴歸神經網絡,特別是一LSTM,在以下ndarray格式的時間序列數據的一些試驗:

[[[time_step_trial_0, feature, feature, ...] 
    [time_step_trial_0, feature, feature, ...]]     
[[time_step_trial_1, feature, feature, ...] 
    [time_step_trial_1, feature, feature, ...]] 
[[time_step_trial_2, feature, feature, ...] 
    [time_step_trial_2, feature, feature, ...]]] 

的這個3darray的1D部保持一個時間步長,並在該時間步驟中觀察到的所有特徵值。該塊包含在一次試驗中觀察到的所有1d陣列(時間步驟)。所述3D塊包含記錄的時間序列數據集中的所有2D塊(試驗)。對於每個試驗,時間步長頻率是恆定的,並且窗口間隔在所有試驗中都是相同的(0到50秒,0到50秒等)。例如,我給出了一級方程式比賽車的數據,例如扭矩,速度,加速度,旋轉速度等。在一定的時間間隔內,記錄時間每0.5秒鐘步進一次,每次時間步長形成一維數組,在那個時間記錄的特徵步驟。然後,我會圍繞與賽道上一輛F1賽車相對應的所有時間步驟形成一個2D陣列。我創建了一個包含所有F1賽車及其時間序列數據的最終3D陣列。我想訓練和測試一個模型,以檢測新車賽道上F1常見軌跡的異常情況。

我目前知道的TensorFlow機型支持培訓和測試二維數組。我想知道爲了能夠訓練和測試此3Darray中包含的所有獨立試驗(2d)的模型,我需要經過哪些程序。另外,我將來會增加更多的試驗。那麼爲了不斷更新我的模型和新數據/試驗以加強我的LSTM,正確的程序是什麼?

這裏是我試圖最初複製比人類活動等不同的目的模型:https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition。另一個更可行的模型是我寧願看時間序列數據中的異常檢測:https://arxiv.org/abs/1607.00148。我想建立一個給定的一組非異常時間序列的訓練數據的異常檢測模型,我們可以在一段時間內的部分數據被定義爲測試數據檢測異常「出來的家庭。」

+0

你能告訴我們你到目前爲止所嘗試過的嗎?考慮編寫一個[MCVE],進一步闡明您目前面臨的具體問題的輸入和預期結果。問題的某些部分不清楚或過於開放,比如詢問「培訓該模型需要採取哪些程序」。 –

+0

@ E_net4我試圖複製Guillaume的LSTM,但我得到了一個維度問題。我會在上面發佈一個我正在尋找的例子。更新了 –

+0

@ E_net4。 –

回答

1

您的輸入形狀和相應的模型取決於您想要檢測的異常類型。你可以考慮:

1.功能只有異常: 在這裏,你考慮個人特點,並決定其中的任何是否異常,沒有它的測量時考慮。在您的示例中,如果一個或多個特徵與其他特徵異常,則特徵[扭矩,速度,加速度...]是異常的。在這種情況下,您的輸入應該是[batch, features]

2.時間特徵異常: 這裏您的輸入取決於您何時測量特徵。您當前的功能可能取決於以前測量的功能。例如,如果它出現在時間0,那麼它的值可能是一個異常值,但如果它出現在時間上,則可能不是異常值。在這種情況下,您可以用重疊的時間窗口劃分每條路徑,並形成一個形式爲[batch, time_window, features]的功能集。

它應該很簡單,從(1)使用autoencoder在你訓練一個自動編碼器,並在輸入和輸出之間的錯誤,你可以選擇一個閾值像2標準偏差的意思是確定它是否屬於異常值。

對於(2),您可以使用seq2seq模型跟蹤您提到的第二篇論文,其中解碼器錯誤將確定哪些功能是異常值。你可以在this上查看這個模型的實現。

4

我想對大多數LSTM的你會想這樣想你的數據(因爲它會很容易因爲輸入要使用的網絡)。

你必須3次維測量:

feature_size =的不同特徵的數目(扭矩,速度等)

number_of_time_steps =收集的單個車

的時間的步數

number_of_cars =汽車的數量

最容易將您的數據作爲一組矩陣讀取,其中每個矩陣對應一個完整樣本(一輛汽車的所有時間步長)。

使每一行是一個觀察和每一列都是一個不同的參數(或相反,你可能要轉置矩陣,看看你的網絡是如何格式化輸入),你可以安排這些矩陣。

所以每個矩陣的大小: number_of_time_steps x feature_size(#rows x #columns)。你將有number_of_cars不同的矩陣。每個矩陣都是一個樣本。你可以使用這塊代碼(注意,你已經可以用A [n]訪問你的數組中的一個樣本,但是這使得它被訪問的元素的形狀是你期望的):

import numpy as np 

A = [[['car1', 'timefeatures1'],['car1', 'timefeatures2']], 
    [['car2', 'timefeatures1'],['car2', 'timefeatures2']], 
    [['car3', 'timefeatures1'],['car3', 'timefeatures2']] 
    ] 

easy_format = np.array(A) 

現在你可以用easy_format [n]得到一個單獨的樣本,其中n是你想要的樣本。

easy_format[1] prints 

array([['car2', 'timefeatures1'], 
     ['car2', 'timefeatures2']], 
     dtype='|S12') 

easy_format[1].shape = (2,2) 

現在你可以做到這一點,你可以,但是你需要爲你正在使用的網絡(如果需要調換的行和列,在同一時間或全部呈現單個樣品在一次格式化,等等)

你想要做什麼(如果我正在閱讀第二篇論文)很可能需要一個序列來對lstm或rnn進行排序。您的原始序列是給定試驗的時間序列,並且您將生成一組中間權重(嵌入),可重新創建具有較低誤差量的原始序列。你正在爲所有的試驗做這件事。你將通過一系列合理的正常試驗來訓練這個lstm,並使其表現良好(準確地重建序列)。然後,您可以使用同一組嵌入來嘗試重建一個新的序列,並且如果它具有較高的重構誤差,則可以認爲它是異常的。

檢查此回購的樣本,你想要什麼,以及如何使用它的解釋以及代碼在做什麼(它只將一個整數序列映射到另一個整數序列,但可以很容易地擴展到將矢量序列映射到矢量序列):https://github.com/ichuang/tflearn_seq2seq您定義的模式只是您的原始序列。你也可以看看autoencoders的這個問題。

最後編輯:選中該庫:https://github.com/beld/Tensorflow-seq2seq-autoencoder/blob/master/simple_seq2seq_autoencoder.py

我在它修改了代碼非常輕微到tensorflow最新版本的工作,使一些變量名稱更清晰的。您應該可以修改它以在您的數據集上運行。現在我只是讓它自動編碼一個隨機生成的1和0的數組。你會爲你的數據的一個大的子集做這件事,然後看看其他數據是否被準確重建(比平均值更高的錯誤可能意味着異常)。

import numpy as np 
import tensorflow as tf 


learning_rate = 0.001 
training_epochs = 30000 
display_step = 100 

hidden_state_size = 100 
samples = 10 
time_steps = 20 
step_dims = 5 
test_data = np.random.choice([ 0, 1], size=(time_steps, samples, step_dims)) 

initializer = tf.random_uniform_initializer(-1, 1) 

seq_input = tf.placeholder(tf.float32, [time_steps, samples, step_dims]) 

encoder_inputs = [tf.reshape(seq_input, [-1, step_dims])] 


decoder_inputs = ([tf.zeros_like(encoder_inputs[0], name="GO")] 
        + encoder_inputs[:-1]) 
targets = encoder_inputs 
weights = [tf.ones_like(targets_t, dtype=tf.float32) for targets_t in targets] 

cell = tf.contrib.rnn.BasicLSTMCell(hidden_state_size) 
_, enc_state = tf.contrib.rnn.static_rnn(cell, encoder_inputs, dtype=tf.float32) 
cell = tf.contrib.rnn.OutputProjectionWrapper(cell, step_dims) 
dec_outputs, dec_state = tf.contrib.legacy_seq2seq.rnn_decoder(decoder_inputs, enc_state, cell) 

y_true = [tf.reshape(encoder_input, [-1]) for encoder_input in encoder_inputs] 
y_pred = [tf.reshape(dec_output, [-1]) for dec_output in dec_outputs] 

loss = 0 
for i in range(len(y_true)): 
    loss += tf.reduce_sum(tf.square(tf.subtract(y_pred[i], y_true[i]))) 
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss) 

init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    x = test_data 
    for epoch in range(training_epochs): 
     #x = np.arange(time_steps * samples * step_dims) 
     #x = x.reshape((time_steps, samples, step_dims)) 
     feed = {seq_input: x} 
     _, cost_value = sess.run([optimizer, loss], feed_dict=feed) 
     if epoch % display_step == 0: 
      print "logits" 
      a = sess.run(y_pred, feed_dict=feed) 
      print a 
      print "labels" 
      b = sess.run(y_true, feed_dict=feed) 
      print b 

      print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(cost_value)) 

print("Optimization Finished!") 
+0

我明白這個設置。你能舉一個例子說明如何在訓練(任何)模型中使用這個設置?直到我看到一個例子,我現在才真正瞭解它的適用性。我也不太明白'timefeatures'是什麼。 –

+0

您可以使用我發給您的兩個鏈接爲例。 –

+0

'時間功能'只是你所看到的任何參數的一個表現。 例如,您的時間序列可能類似於: ['timestamp','torque','velocity','etc'] 我剛纔稱它爲汽車名稱和時間特徵, 。 – Saedeas