当前位置: 首页 > 知识库问答 >
问题:

如何结合LSTM和CNN进行时间序列分类

贺君浩
2023-03-14

当有图像作为数据时,最常用的是CNN。然而,我已经看到CNN有时被用于timeseries。因此,为了解决时间序列分类问题,我分别尝试了LSTM和CNN模型。我的两个模型如下。

LSTM:

model = Sequential()
model.add(LSTM(200, input_shape=(25,3)))
model.add(Dense(100))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

美国有线电视新闻网:

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

我认为LSTM和CNN有其独特的特点,在我的预测中结合这两者会产生更好的结果。然而,我正在努力寻找适合我的问题的合适资源。

有可能为我的问题这样做吗?如果是的话,我怎么做?它会产生更好的结果吗?

如果需要,我很乐意提供更多细节。

我的问题设置如下。我有一个大约5000个数据点的数据集。每个数据点有3个时间序列数据,大小正好是25。我的标记数据是10(即:二分类)。更具体地说,我的数据集如下所示。

node, time-series1, time_series2, time_series3, Label
n1, [1.2, 2.5, 3.7, 4.2, ... 5.6, 8.8], [6.2, 5.2, 4.7, 3.2, ... 2.6, 1.8], [1.0, 2.8, 3.9, 4.1, ... 5.2, 8.6] …, 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], …, [1.2, 2.5, 3.7, 4.2, ... 5.2, 8.5] 0
and so on.

我将这些数据输入到我的LSTM和CNN模型中。

共有2个答案

曾新立
2023-03-14

您可能想看看LSTNet,它正是这样做的-https://arxiv.org/abs/1703.07015 和https://github.com/laiguokun/LSTNet

索寒
2023-03-14

你试过一层接一层吗?这听起来很标准。。。

model = Sequential()
model.add(Conv1D(200, kernel_size=3, activation = useSomething, input_shape=(25,3)))
model.add(LSTM(200))
model.add(Dense(100))
model.add(Dense(1, activation='sigmoid'))

你想试试相反的吗?

model = Sequential()
model.add(LSTM(200, return_sequences=True, input_shape=(25,3)))
model.add(Conv1D(200, kernel_size=3, activation = useSomething))
model.add(GlobalMaxPooling1D())
model.add(Dense(100))
model.add(Dense(1, activation='sigmoid'))

你想要一个巨大的模型吗?

model = Sequential()
model.add(Conv1D(15, kernel_size=3, activation = useSomething, input_shape=(25,3)))
model.add(LSTM(30, return_sequences=True))
model.add(Conv1D(70, kernel_size=3, activation = useSomething))
............
model.add(LSTM(100))
model.add(Dense(100))
model.add(Dense(1, activation='sigmoid'))

尝试很多事情:

  • Conv,LSTM

双面模型?

inputs = Input((25,3))

side1 = Bidirectional(LSTM(100, return_sequences=True))(inputs) #200 total units
side2 = Conv1D(200, activation = 'tanh', padding = 'same')(inputs) #same activation 
                                                                   #same length

merged = Add()([side1, side2]) 
     #or Concatenate()([side1, side2]) if different number of units/channels/features

outputs = Conv1D(200)(merged)
outputs = GlobalMaxPooling1D()(outputs)
outputs = Dense(100)(outputs)
outputs = Dense(1, activation='sigmoid')(outputs)

model = Model(inputs, outputs)
 类似资料:
  • 问题内容: 这个问题是我先前提出的问题的继续。 我训练了一个LSTM模型,以预测100个具有3个特征的样本的批次的二进制类(1或0),即:数据的形状为(m,100,3),其中m是批次数。 数据: 目标: 型号代码: 在训练阶段,模型 不是 有状态的。当预测我正在使用 状态 模型时,遍历数据并为每个样本输出概率: 当查看批处理结束时的概率时,它恰好是我对整个批处理进行预测时得到的值(不是一个接一个)

  • 2 个轮次后达到 0.8498 的测试精度。K520 GPU 上为 41 秒/轮次。 from __future__ import print_function from keras.preprocessing import sequence from keras.models import Sequential from keras.layers import Dense, Dropout,

  • 我对时间序列分类比较陌生,正在寻求帮助: 我有一个包含5000个多元时间序列的数据集,每个数据集由21个变量组成,时间周期为3年,类别信息为1或0。我想做的是对一个新的输入进行分类,它在3年的时间内由21个变量组成。 就目前而言,经过几天的研究,我还没有找到(或显然没有理解)将多变量时间序列输入LSTM的方法。有没有可能的解决办法? 我目前的想法是将5000个时间序列“合并”成一个,并向每个序列添

  • 我在UCF-101数据集上训练了SVM、CNN和ANN,SVM和ANN分别使用Hue和LBP特征的CSV文件,而CNN使用LBP图像进行分类训练。现在我想结合{SVM和CNN}和{ANN和CNN}。可以这样做吗?如果可以,怎么做。 我已经为Dataset中的每个视频提取了第1关键帧,然后计算了它的LBP直方图。将其用作图像的特征,将其连同标签一起写入csv(我在101个可用的类中只选择了5个类的数

  • 我是时间序列的新手,需要学科专家的帮助。所以我有一个有11个变量的实验室数据,报告了时间。10个变量是可控的,第11个变量是输出。我用LSTM预测了第11个变量的时间序列。结果比预期好得多。第11个变量预测为0.001 RMSE。训练数据有5000个样本,测试数据有4599个。我对预测很满意。现在我需要分析输入10个变量是如何影响第11个输出变量的。请建议一个好的库,类似问题的教程。

  • 我试图使用Keras对多个变量进行同时预测。在这里使用这个例子,我想预测所有特征的值,包括pm 2.5,DEWP,TEMP等,而不仅仅是污染(pm 2.5)。本质上,这是,给定所有变量,建立一个模型来预测所有变量作为时间序列,而不仅仅是预测一个变量。 我使用重塑后的3D数据修改了原始示例代码,但出现了一个错误。代码如下: 输出为: 数据集在这里可用。 我的问题是: Keras LSTM层不是为此设