我想对大多数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。 –