时间分布层的CNN-LSTM时间序列输入 [英] CNN-LSTM Timeseries input for TimeDistributed layer

查看:19
本文介绍了时间分布层的CNN-LSTM时间序列输入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个用于Web会话存活预测的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维,我应该如何转换数据才能使其工作?

非常感谢!

推荐答案

您的数据是3D格式,这就是馈送cv1d或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)

这篇关于时间分布层的CNN-LSTM时间序列输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆