簡體   English   中英

如何正確 package 多通道時間序列數據並為 Tensorflow CNN-LSTM 構建網絡?

[英]How do I properly package multi-channel time series data and build the network for a Tensorflow CNN-LSTM?

我有來自三個傳感器的數據,並將其分解為 21,190 938 個樣本序列。 我已將其存儲在尺寸為 (21190, 938, 3) 的張量 xt 中,並創建了尺寸為 (21190,1) 的標簽張量 yt。 有了這些數據,我想創建一個 CNN-LSTM 二元分類器。 我相信我已經找到了問題的解決方案,但我想在此處發布它以確保我正確理解我遇到的錯誤,並進行了正確的修復。

我的意圖是讓卷積層在時間(938 長度)維度上應用過濾器,並將卷積層中這些過濾器的每個步幅的 output 作為時間序列中的樣本輸入 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 提供一個時間步長的數據? 提前感謝您的任何意見。

問題在於輸入數據形狀。

工作示例代碼

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

output.shape
TensorShape([None, 2])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM