繁体   English   中英

TimeDistributed 层的 CNN-LSTM 时间序列输入

[英]CNN-LSTM Timeseries input for TimeDistributed layer

我创建了一个 CNN-LSTM 用于 web 会话的生存预测,我的训练数据如下所示:

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

带有(样本、时间步长、特征)和我的 model:

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 Layer 至少需要 3 个维度,我应该如何转换数据以使其工作?

非常感谢!

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

在 LSTM 之前使用 flatten 是一个错误,因为您正在破坏 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM