2017-07-24 168 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