【问题标题】:CNN-LSTM Timeseries input for TimeDistributed layerTimeDistributed 层的 CNN-LSTM 时间序列输入
【发布时间】:2020-11-02 14:27:55
【问题描述】:

我创建了一个 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 个维度,我应该如何转换数据才能使其工作?

非常感谢!

【问题讨论】:

  • 你的代码(经过一些修正)在没有 TimeDistributed 层的情况下也可以工作......你为什么需要它?
  • 嗨,Marco,你会如何改变它?提前致谢!
  • 我在下面添加了一个示例,不要忘记投票并接受它作为答案;-)
  • 非常感谢!我做到了:)

标签: python machine-learning keras lstm conv-neural-network


【解决方案1】:

您的数据是 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 2020-08-31
    • 2019-03-12
    • 2021-06-24
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多