簡體   English   中英

在Keras中實現因果CNN以進行多元時間序列預測

[英]Implement Causal CNN in Keras for multivariate time-series prediction

這個問題是我之前在這里提出的問題的后續: 多特征因果關系CNN-Keras的實現 ,但是,有很多事情我不清楚,我認為這值得一個新問題。 這里討論的模型是根據上面提到的帖子中公認的答案構建的。

我正在嘗試對10個具有5個特征的序列的多元時間序列數據應用因果CNN模型。

lookback, features = 10, 5
  • 過濾器和內核應設置為什么?

    • 過濾器和內核對網絡有什么影響?
    • 這些只是一個任意數量-即ANN層中的神經元數量嗎?
    • 還是會對網絡如何解釋時間步長產生影響?
  • 膨脹應設置為什么?

    • 這是一個任意數字還是代表模型的lookback
filters = 32
kernel = 5
dilations = 5
dilation_rates = [2 ** i for i in range(dilations)]

model = Sequential()
model.add(InputLayer(input_shape=(lookback, features)))
model.add(Reshape(target_shape=(features, lookback, 1), input_shape=(lookback, features)))

根據前面提到的答案,需要根據以下邏輯調整輸入的形狀:

  • Reshape 5輸入特征現在都被視為對於TimeDistributed層的時間層
  • 將Conv1D應用於每個輸入要素時,它認為層的形狀為(10,1)

  • 使用默認的“ channels_last”,因此...

  • 10個時間步驟是時間維度
  • 1是“通道”,要素地圖的新位置
# Add causal layers
for dilation_rate in dilation_rates:
    model.add(TimeDistributed(Conv1D(filters=filters,
                              kernel_size=kernel,
                              padding='causal',
                              dilation_rate=dilation_rate,
                              activation='elu')))

根據提到的答案,需要根據以下邏輯對模型進行重塑:

  • 將要素映射堆疊在一起,以便每個時間步驟都可以查看較早生成的所有功能-(10個時間步驟,5個功能* 32個過濾器)

接下來,因果層現在將依賴地應用於5個輸入要素。

  • 為什么最初要獨立應用它們?
  • 為什么現在要依賴地應用它們?
model.add(Reshape(target_shape=(lookback, features * filters)))

next_dilations = 3
dilation_rates = [2 ** i for i in range(next_dilations)]
for dilation_rate in dilation_rates:
    model.add(Conv1D(filters=filters,
                     kernel_size=kernel,
                     padding='causal',
                     dilation_rate=dilation_rate,
                     activation='elu'))
    model.add(MaxPool1D())

model.add(Flatten())
model.add(Dense(units=1, activation='linear'))

model.summary()

摘要

  • 過濾器和內核應設置為什么?
    • 它們會對網絡如何解釋時間步長產生影響嗎?
  • 應該將哪些膨脹設置為代表回溯10?

  • 為什么起因層最初是獨立應用的?

  • 整形后為什么要獨立應用它們?
    • 為什么不從一開始就獨立地應用它們?

================================================== =========================

完整代碼

lookback, features = 10, 5

filters = 32
kernel = 5
dilations = 5
dilation_rates = [2 ** i for i in range(dilations)]

model = Sequential()
model.add(InputLayer(input_shape=(lookback, features)))
model.add(Reshape(target_shape=(features, lookback, 1), input_shape=(lookback, features)))

# Add causal layers
for dilation_rate in dilation_rates:
    model.add(TimeDistributed(Conv1D(filters=filters,
                              kernel_size=kernel,
                              padding='causal',
                              dilation_rate=dilation_rate,
                              activation='elu')))


model.add(Reshape(target_shape=(lookback, features * filters)))

next_dilations = 3
dilation_rates = [2 ** i for i in range(next_dilations)]
for dilation_rate in dilation_rates:
    model.add(Conv1D(filters=filters,
                     kernel_size=kernel,
                     padding='causal',
                     dilation_rate=dilation_rate,
                     activation='elu'))
    model.add(MaxPool1D())

model.add(Flatten())
model.add(Dense(units=1, activation='linear'))

model.summary()

================================================== =========================

編輯:

丹尼爾,謝謝您的回答。

題:

如果您可以“精確地”解釋數據的結構方式,原始數據是什么以及如何將其轉換為輸入形狀,具有獨立序列,創建滑動窗口等,那么更好。可以了解此過程。

回答:

希望我能正確理解您的問題。

每個功能都是時間序列數據的序列數組。 它們是獨立的,例如它們不是圖像,但是它們彼此之間有些關聯。

這就是為什么我要使用Wavenet的原因,它非常擅長預測單個時間序列數組,但是,我的問題要求我使用多個功能。

有關給定答案的評論

問題:

  • 為什么起因層最初是獨立應用的?
  • 整形后為什么要獨立應用它們?
    • 為什么不從一開始就獨立地應用它們?

這個答案有點奇怪。 我不是專家,但是我看不到需要使用TimeDistributed圖層保留獨立功能。 但是我也不能說它是否能帶來更好的結果。 起初我會說這是不必要的。 但是,它可能帶來更多的智能,因為它可能看到關系涉及兩個要素之間的遙遠步驟,而不是僅僅關注“相同步驟”。 (應該對此進行測試)

但是, 這種方法有一個錯誤

旨在交換回溯和特征尺寸的重塑未達到預期的效果。 答案的作者顯然想交換軸 (保留對特征,回溯的解釋),這與重塑不同(將所有內容混合在一起並且數據失去意義)

正確的方法將需要實際的軸交換,例如model.add(Permute((2,1)))而不是model.add(Permute((2,1)))

因此,我不知道這些答案,但是似乎沒有什么可以創造這種需求。 可以肯定的一件事是:您一定會想要依賴部分。 如果模型不考慮要素之間的關系,則模型將無法獲得原始模型的智能。 (除非您很幸運地擁有完全獨立的數據)

現在,說明LSTM與Conv1D之間的關系

LSTM可以直接與Conv1D進行比較,並且所使用的形狀完全相同,並且實際上意味着相同,只要您使用channels_last

也就是說,形狀(samples, input_length, features_or_channels)對於LSTMConv1D都是正確的形狀。 實際上,在這種情況下,功能和渠道是完全一樣的。 變化的是每層在輸入長度和計算方面的工作方式。

過濾器和內核的概念

內核是conv層內的整個張量,將其與輸入相乘以獲得結果。 內核包括其空間大小( kernel_size )和filters數(輸出特征)。 以及自動輸入過濾器。

沒有很多內核,但是有kernel_size 內核大小是每個輸出步驟將連接多少個長度的步驟。 (本教程非常適合於關於其功能和內核大小的未知2D卷積-想像一下1D圖像-盡管本教程沒有顯示“濾鏡”的數量,就像1-濾鏡動畫)

filters的數量與features的數量直接相關,它們是完全一樣的。

過濾器和內核應設置為什么?

因此,如果您的LSTM圖層正在使用units=256 ,這意味着它將輸出256個要素,則應使用filters=256 ,這意味着卷積將輸出256個通道/要素。

但是這並不是規則,您可能會發現使用更多或更少的過濾器會帶來更好的結果,因為這些圖層畢竟會做不同的事情。 不需要所有層都具有相同數量的過濾器!! 在這里,您應該進行參數調整。 測試以查看最適合您的目標和數據的數字。

現在,內核大小是LSTM無法比擬的。 這是模型中新增的內容。

數字3是很常見的選擇。 這意味着卷積將需要三個時間步才能產生一個時間步。 然后滑動一個步驟,進行三個步驟的另一組操作,以產生下一個步驟,依此類推。

脹縮

膨脹表示卷積濾波器在步驟之間將有多少空間。

  • 卷積dilation_rate=1需要采取kernel_size個連續步驟來產生一個步驟。
  • 例如, dilation_rate = 2卷積需要步驟0、2和4來產生一個步驟。 然后執行步驟1、3、5以產生下一步,依此類推。

應該將哪些膨脹設置為代表回溯10?

range = 1 + (kernel_size - 1) * dilation_rate

因此,內核大小= 3:

  • Dilation = 0(dilation_rate = 1):內核大小范圍為3個步長
  • 膨脹= 1(dilation_rate = 2):內核大小為5步
  • 膨脹= 2(dilation_rate = 4):內核大小范圍為9步
  • 膨脹= 3(dilation_rate = 8):內核大小為17個步長

我對你的問題

如果您可以“精確地”解釋數據的結構方式,原始數據是什么以及如何將其轉換為輸入形狀,具有獨立序列,創建滑動窗口等,那么更好。可以了解此過程。

暫無
暫無

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

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