【问题标题】:How do I properly package multi-channel time series data and build the network for a Tensorflow CNN-LSTM?如何正确打包多通道时间序列数据并为 Tensorflow CNN-LSTM 构建网络?
【发布时间】:2021-06-04 18:08:55
【问题描述】:

我有来自三个传感器的数据,并将其分解为 21,190 938 个样本序列。我已将其存储在尺寸为 (21190, 938, 3) 的张量 xt 中,并创建了尺寸为 (21190,1) 的标签张量 yt。有了这些数据,我想创建一个 CNN-LSTM 二元分类器。我相信我已经找到了问题的解决方案,但我想在此处发布它以确保我正确理解我遇到的错误,并进行了正确的修复。

我的意图是让卷积层在时间(938 长度)维度上应用过滤器,并将卷积层中这些过滤器的每个步幅的输出作为时间样本馈送到 LSTM 层顺序。我根据我在网上找到的一个示例将网络组合在一起,该示例似乎正在使用类似的数据集(来自多个传感器的时间序列)和目标(使用 CNN 识别/提取特征,并使用 LSTM 在序列中查找模式)特征);但根据我对 TimeDistributed 包装器的 Tensorflow 文档的阅读以及我遇到的错误,我不确定我的网络设置是否正确。

这是我用来创建和训练 CNN-LSTM 的代码:

model = models.Sequential()
    model.add(layers.TimeDistributed(layers.Conv1D(filters=32,kernel_size=64),input_shape=(None,938,3)))
    model.add(layers.TimeDistributed(layers.Conv1D(filters=32,kernel_size=64)))
    model.add(layers.TimeDistributed(layers.Dropout(0.5)))
    model.add(layers.TimeDistributed(layers.MaxPooling1D(pool_size=2)))
    model.add(layers.TimeDistributed(layers.Flatten()))
    model.add(layers.LSTM(100))
    model.add(layers.Dense(2))
    model.add(layers.Softmax())
    model.compile(
        loss = losses.SparseCategoricalCrossentropy(from_logits=True),
        optimizer="adam",
        metrics=["accuracy"],
        )
    model.fit(
        xt,
        yt,
        epochs=10,
        )

当我运行它时,我收到以下错误:

ValueError: 层序的输入 0 与 层:预期 ndim=4,发现 ndim=3。收到的完整形状:(无,938, 3)

如果我删除 TimeDistributed 包装器和 Flatten 层,网络训练不会出错。我是否正确理解使用 TimeDistributed 会导致网络尝试一次从三个通道中的每个通道对单个样本应用一维卷积,这就是我收到错误的原因?我是否纠正了通过移除包装器,我将获得我想要的功能,卷积层中的每一步都为 LSTM 提供一个时间步长的数据?提前感谢您的任何意见。

【问题讨论】:

  • 您是在尝试创建一维Convolutional LSTM network,还是尝试创建一个包含一维卷积堆栈和一个 LSTM 块的网络?这些是不同的东西。也就是说,前者在 LSTM 的单元内部执行卷积,并且需要 4D 输入。
  • 感谢您的回复。我不想实现 ConvLSTM 模型。我只希望在输入 LSTM 之前将卷积应用于时间序列。
  • this 会回答您的问题吗?

标签: python tensorflow machine-learning deep-learning lstm


【解决方案1】:

问题在于输入数据形状。

工作示例代码

import tensorflow as tf
inputs = tf.keras.Input(shape=(None, 938, 3))
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.TimeDistributed(tf.keras.layers.Conv1D(filters=32,kernel_size=64),input_shape=(None,938,3)))
model.add(tf.keras.layers.TimeDistributed(tf.keras.layers.Conv1D(filters=32,kernel_size=64)))
model.add(tf.keras.layers.TimeDistributed(tf.keras.layers.Dropout(0.5)))
model.add(tf.keras.layers.TimeDistributed(tf.keras.layers.MaxPooling1D(pool_size=2)))
model.add(tf.keras.layers.TimeDistributed(tf.keras.layers.Flatten()))
model.add(tf.keras.layers.LSTM(100))
model.add(tf.keras.layers.Dense(2))
model.add(tf.keras.layers.Softmax())
output = model(inputs)

输出

output.shape
TensorShape([None, 2])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多