用于时间分布层的CNN-LSTM时间序列输入

时间:2020-07-13 11:40:03

标签: python machine-learning keras lstm cnn

我创建了CNN-LSTM,用于网络会话的生存预测,我的训练数据如下:

print(x_train.shape)
(288, 3, 393) 

具有(示例,时间步长,功能)和我的模型:

model = Sequential()
model.add(TimeDistributed(Conv1D(128, 5, activation='relu'), 
                                 input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(TimeDistributed(MaxPooling1D()))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(64, stateful=True, return_sequences=True))
model.add(LSTM(16, stateful=True))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer=Adam(lr=0.001), loss='binary_crossentropy', metrics=['accuracy'])

但是,TimeDistributed层至少需要3个维度,如何转换数据才能使其正常工作?

非常感谢!

1 个答案:

答案 0 :(得分:2)

您的数据为3d格式,这就是提供conv1d或LSTM的全部。如果目标是2D,请记住在最后一个LSTM单元格中设置return_sequences = False。

在LSTM之前使用展平是一个错误,因为您正在破坏3D尺寸

也要注意池操作,以免减小负的时间维度(为了避免这种情况,我在上面的卷积中使用“相同”填充)

下面是二进制分类任务中的一个示例

n_sample, time_step, n_features = 288, 3, 393
X = np.random.uniform(0,1, (n_sample, time_step, n_features))
y = np.random.randint(0,2, n_sample)

model = Sequential()
model.add(Conv1D(128, 5, padding='same', activation='relu', 
                 input_shape=(time_step, n_features)))
model.add(MaxPooling1D())
model.add(LSTM(64, return_sequences=True))
model.add(LSTM(16, return_sequences=False))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X,y, epochs=3)