我有来自三个传感器的数据,并将其分解为 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 提供一个时间步长的数据?提前感谢您的任何意见。