我仍在研究LSTM,并尝试提出最佳和适当的培训程序和数据形状。
时间序列代表音符。让我们称之为一首歌。所以我有以下形式的数据。序列由一个热编码的注释组成。所以它们有形状
(timesteps, features)
. 这个系列的复制品是通过变换(向上移动)系列的音符而制作的十二次。一首歌就会成形
(12, timesteps, features)
. 这十二个系列中的每一个都应该接受独立的培训。此外,还有多首长度不同的歌曲。
我想训练一个LSTM,以便在一系列的每一步都进行预测。所以12个系列中的一个的训练数据是
X = series[:-1, :], Y = series[1:, :]
同样地,对于所有12个版本。
# Example data, numbers not one-hot encoded for brevity
series = [1, 3, 2, 4, 7, 7, 10]
X = [1, 3, 2, 4, 7, 7]
Y = [3, 2, 4, 7, 7, 10] # Shifted 1 step back
这12种变体将创建一个自然批次,因为长度没有变化。但我的问题是:
a naïve approach
# X = (12 * timesteps, 1, features), Y = (12 * timesteps, features)
model = Sequential()
model.add(LSTM(256, input_shape=(None, X.shape[-1]), batch_size=1, stateful=True))
model.add(Dense(Y.shape[-1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])
for epoch in range(10):
model.fit(X, Y, epochs=1, batch_size=1, shuffle=False)
model.reset_states()