我认为对于大多数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。您定义的模式只是原始序列。您也可以查看自编码器来解决此问题。
最终编辑:请查看此存储库:
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):
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!")