首页 > 解决方案 > 如何在keras中向LSTM输入几个时间序列

问题描述

我有大约 1000 个节点数据集,其中每个节点有 4 个时间序列。每个时间序列的长度正好是 6 个。标签是01(即二进制分类)。

更准确地说,我的数据集如下所示。

node, time-series1, time_series2, time_series_3, time_series4, Label
n1, [1.2, 2.5, 3.7, 4.2, 5.6, 8.8], [6.2, 5.5, 4.7, 3.2, 2.6, 1.8], …, 1
n2, [5.2, 4.5, 3.7, 2.2, 1.6, 0.8], [8.2, 7.5, 6.7, 5.2, 4.6, 1.8], …, 0
and so on.

因为,我有时间序列,我假设它更像是大多数博客文章都使用 LSTM 的序列分类。我以前从未使用过 LSTM,这将是我的第一个 keras 应用程序。sequential LSTM因此,我开始使用如下最基本的模板。

# create the model
model = Sequential()
model.add(Embedding(5000, 32, input_length=24))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())

但是,我很难理解如何使用该embedding层向 LSTM 输入四个时间序列。我可以使用embedding四层还是有其他方法来解决这个问题?

如果需要,我很乐意提供更多详细信息。

标签: pythonkerasclassificationlstm

解决方案


有几种方法可以构建它。对于初学者,我可能只是将 4 系列扁平化为 24 个数字的数组并使用 Dense 层

from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(32, input_shape=24))
model.add(Dense(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

print(data.shape) # (1000, 24)
model.fit(data, target)

您可以有 4 个单独的输入,分别处理 4 个带有LSTM层的系列。但是您需要使用功能 API。例如

input1 = Input(shape=(6,1))
x1 = LSTM(10)(input1)
input2 = Input(shape=(6,1))
x2 = LSTM(10)(input2)
input3 = Input(shape=(6,1))
x3 = LSTM(10)(input3)
input4 = Input(shape=(6,1))
x4 = LSTM(10)(input4)

x = concatenate([x1,x2,x3,x4])
x = Drouput(0.2)(x)
x = Dense(40)(x)
x = Drouput(0.2)(x)
output = Dense(1, activation='sigmoid')(x)

model = Model(inputs=[input1,input2,input3,input4], outputs=output)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

print(data1.shape) #(1000,6,1)
model.fit([data1,data2,data3,data4], target)

或者,如果您的数据是这样的形状(1000, 6, 4),您可以使用一个 LSTM 并将每个系列视为一个单独的特征

model = Sequential()
model.add(LSTM(10, input_shape=(6,4)))
model.add(Dense(32))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

print(data.shape) # (1000, 6, 4)
model.fit(data, target)

或者你可以使用 CNN 而不是 RNN。

model = Sequential()
model.add(Conv1D(10, kernel_size=3, input_shape=(6,4)))
model.add(Conv1D(10, kernel_size=2))
model.add(GlobalMaxPooling1D())
model.add(Dense(10))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

print(data.shape) # (1000, 6, 4)
model.fit(data, target)

推荐阅读