我想對大多數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!")
你能告訴我們你到目前爲止所嘗試過的嗎?考慮編寫一個[MCVE],進一步闡明您目前面臨的具體問題的輸入和預期結果。問題的某些部分不清楚或過於開放,比如詢問「培訓該模型需要採取哪些程序」。 –
@ E_net4我試圖複製Guillaume的LSTM,但我得到了一個維度問題。我會在上面發佈一個我正在尋找的例子。更新了 –
@ E_net4。 –