Keras LSTM-时间序列数据输入,二进制数据输出

时间:2019-01-19 20:15:25

标签: python tensorflow keras deep-learning lstm

这是我上一个问题的跟进,可能看起来有点多余,但是请忍受。

previous question

我正在尝试创建一个Keras LSTM模型,该模型使用一系列时间序列数据。数据的格式如下:输入:时间,value1,value2和输出: Y1和Y2

Time    Value1    Value2           Y1   Y2
0       900       10               1    1
1       905       3                1    0
2       999       1                1    0
3       906       7                0    1
.       .         .                .    .
.       .         .                .    .
n       945       2                1    0

我已经计算了输出 Y1 Y2 来训练LSTM,该LSTM是每个时间实例的二进制值。但是,LSTM应该采用一系列数据,例如:行1-3之间的(时间,值1,值2),然后预测与我计算出的行3对应的二进制输出。因此X和Y如下:

输入X:

Time    Value1    Value2
1       905       3
2       999       1                
3       906       7

输出Y:

Y1   Y2
0    1

到目前为止,我已经尝试使用keras.sequence.timeseriesgenerator生成LSTM数据。代码如下(dn是一个numpy数组,前三列与上述输入相对应,第四列(Y1)与输出相对应):

train = TimeseriesGenerator(dn[:, [0, 1, 2]], dn[:, 3], length=1, sampling_rate=1, stride=1,
                        start_index=0, end_index=int(len(df.index) * 0.8),
                        shuffle=False, reverse=False, batch_size=3)

x0, y0 = train[0]
print(x0)
print(y0)

这给出了输出:

x0 :[[[ 0.  900.0]]
[[ 1.  905.0]]
[[ 2.  999.0]]]

y0 :[1. 1. 1.]

我期望y0为[1],但是序列生成器正在为输入中的每一行提供输出。我是否正确地说,如果我将其提供给LSTM,那么它将尝试预测所有输入的输出,而不是考虑所有输入并给出一个输出预测?

我发现另一个线程在这里询问非常相似的内容:similar question。我复制了代码并获得以下输出:

epoch: 0
1   (array([[[[ 0.], 
           [ 900.0]],

          [[ 1.],
           [ 905.0]],

          [[ 2.],
           [ 999.0]]]], dtype=float32), array([[ 1., 1., 1.]], dtype=float32))

在询问的问题中,它被告知只有一个预期的输出,但这显然也为每一行提供了一个输出。我不确定这两种方法的格式是否相等。用所有这些括号很难看到。

我希望我能传达我的问题。输入和输出如何格式化为LSTM神经网络,该LSTM神经网络应考虑时间数据序列并提供二进制输出?我看到了许多时间序列预测,但无法将其方法转换为二进制输出。

---更新-----

因此,我对timeseriesgenerator进行了更多实验,并设法创建了如我所解释的格式化的输出。我将代码更改为此:

train = TimeseriesGenerator(dn[:, [0, 1]], dn[:, 3], length=3, sampling_rate=1, stride=1,
                        start_index=0, end_index=int(len(df.index) * 0.8),
                        shuffle=False, reverse=False, batch_size=1)

输出:

x0 :[[[  0.         900.0]
  [  1.         905.0]
  [  2.         999.0]]]

y0 :[0.]

并且shuffle = True命令将从随机索引中选择三个相应的时间实例。太棒了。但是,我想让其他方法运行起来,以及我对数据有更多的控制,据我所知,tf.data应该非常有效。因此,如果有人可以协助使其正常工作,将不胜感激。

0 个答案:

没有答案