【问题标题】:How to input several time-series to LSTM in keras如何在keras中向LSTM输入几个时间序列
【发布时间】:2019-11-27 23:43:09
【问题描述】:

我有大约 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 层还是有其他方法可以解决这个问题?

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

【问题讨论】:

    标签: python keras classification lstm


    【解决方案1】:

    您可以通过多种方式来构建它。对于初学者,我可能只是将 4 系列扁平化为 24 个数字的数组并使用密集层

    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 个单独的输入,分别处理带有 LSTM 层的 4 个系列。但是您需要使用功能 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)
    

    【讨论】:

    • 非常感谢您的精彩回答。这正是我一直在寻找的。我真的很喜欢你使用functional api 的建议。顺便说一句,您认为我的数据量很小(即仅考虑 1000 个节点)作为初始启动?我的另一个问题是我们可以在功能 api 模型中有dropout 层吗?如果有怎么办? :)
    • 我在第二个示例中添加了几个 dropout 层。我也意识到它没有输出层。是的,数据可能不够。取决于问题,但我认为第一个和最后一个不使用 LSTM 的示例更有可能以更少的数据成功。
    • 另外请注意,如果您使用的是功能示例,则系列中的每个数字都需要包装在它自己的数组中。例如[[1.2], [2.5], [3.7], [4.2], [5.6], [8.8]] 因为 LSTM 需要一系列一维向量
    • 非常感谢您提供宝贵的细节。我将在周末运行模型,如果遇到任何问题,我会通知您。再次非常感谢:)
    【解决方案2】:

    您可以将每个节点中的每个序列视为一个单独的通道。因此,首先将您的数据重塑为 n_samples(我认为您正在调用此节点)、n_steps 和 n_channel。使用您拥有的数据集,n_steps=6n_channel=4。基本上,您正在为每个样本(节点)堆叠不同的时间序列数据。

    然后,您可以创建 LSTM 模型。像这样的:

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

    请注意,您可以使用 LSTM 进行不同的激活,并且不一定需要 Dense 层。但是密集层是一个额外的非线性层,可能会提高性能。

    您还可以堆叠 LSTM 层以获得更复杂的模型,如下所示:

    model = Sequential()
    model.add(LSTM(64, input_shape=(6, 4), return_sequences=True))
    model.add(LSTM(1, input_shape=(6, 4)))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    print(model.summary())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 2021-06-24
      • 2017-06-16
      • 1970-01-01
      • 2018-09-24
      • 2018-03-19
      相关资源
      最近更新 更多