通常情况下,CNN主要用于处理图像数据。然而,我发现CNN有时也被用于时间序列数据。因此,我尝试分别使用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'])
CNN:
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。我的标签数据是1
或0
(即二元分类)。更具体地说,我的数据集如下所示。
node, time-series1, time_series2, time_series3, Labeln1, [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] …, 1n2, [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依此类推。
我将这些数据输入到我的LSTM和CNN模型中。
回答:
你有没有尝试过简单地将一层放在另一层之后?这听起来很标准…
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'))
尝试多种方法:
- 卷积层, LSTM层
- LSTM层, 卷积层
- 卷积层, 卷积层, .., 卷积层, LSTM层, …, LSTM层
- LSTM层, LSTM层, …, 卷积层, 卷积层, ….
- 卷积层, LSTM层, 卷积层, LSTM层, 卷积层, LSTM层, ….
- LSTM层, 卷积层, LSTM层, 卷积层, LSTM层, 卷积层, ….
- 卷积层, 卷积层, LSTM层, LSTM层, 卷积层, 卷积层, ….
双向模型如何?
inputs = Input((25,3))side1 = Bidirectional(LSTM(100, return_sequences=True))(inputs) #总共200个单元side2 = Conv1D(200, activation = 'tanh', padding = 'same')(inputs) #相同的激活函数 #相同的长度merged = Add()([side1, side2]) #或者如果单元/通道/特征数不同,使用Concatenate()([side1, side2])outputs = Conv1D(200)(merged)outputs = GlobalMaxPooling1D()(outputs)outputs = Dense(100)(outputs)outputs = Dense(1, activation='sigmoid')(outputs)model = Model(inputs, outputs)