这是我上一个问题的跟进,可能看起来有点多余,但是请忍受。
我正在尝试创建一个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应该非常有效。因此,如果有人可以协助使其正常工作,将不胜感激。