簡體   English   中英

我可以將我的長序列分成 3 個較小的序列並使用有狀態 LSTM 處理 3 個樣本嗎?

[英]Can I split my long sequences into 3 smaller ones and use a stateful LSTM for 3 samples?

我正在做一個時間序列序列分類問題。

我有 80 個時間序列,全長 1002。每個序列對應於 4 個類別中的 1 個(銅、鎘、鉛、汞)。 我想使用 Keras LSTM 到 model 這個。 這些模型需要以[batches, timesteps, features]的形式提供數據。 由於每個 seq 都是獨立的,最基本的設置是X_train具有形狀[80, 1002, 1] 這在 LSTM 中工作正常(有stateful=False

但是,1002 是一個相當長的序列長度。 較小的尺寸可以表現更好。

假設我將每個 seq 分成 334 的 3 部分。我可以繼續使用無狀態 LSTM。 但是(我認為?)讓它對 3 個樣本有狀態然后重置 state 是有意義的(因為 3 個塊是相關的)。

如何在 Keras 中實現這一點?

First, I transform the data into shape [240, 334, 1] using a simple X_train.reshape(-1, 334, 1) but how do I maintain the state for 3 samples and then reset the state in model.fit() ?

我知道我需要在某處調用model.reset_states()但找不到任何示例代碼來告訴我如何工作。 我是否必須對 model 進行子類化? 我可以使用for epoch in range(num_epochs)GradientTape來做到這一點嗎? 我有哪些選擇? 我該如何實施?

另外,如果我將序列拆分,我該如何處理標簽? 我是否將它們乘以每個 seq 分成的塊數(在這種情況下為 3)? LSTM 有沒有辦法攝取 3 個樣本然后吐出一個預測? 還是每個樣本都必須對應一個預測?

最后,如果我將我的序列分成 3 個子序列,我是否必須有 3 個批量大小? 或者我可以選擇 3 的任意倍數嗎?

這是我與X_train.shape == [80, 1002, 1]一起使用的超級基本代碼。

model = Sequential([
    LSTM(10, batch_input_shape=(10, 1002, 1)), # 10 samples per batch
    Dense(4, activation='sigmoid')
])
model.compile(loss='categorical_crossentropy',
             optimizer='rmsprop',
             metrics=['accuracy'])
model.fit(X_train, y_train, epochs=3, batch_size=10, shuffle=False)

我知道這里有很多問題,如果這對一個人來說太多了,我很樂意提出單獨的問題。

簡單的解決方案是將數據從具有 1 個特征重塑為具有 3 個特征。

[80, 1002, 1]變成[80, 334, 3]而不是[240, 334, 1] 這使樣本數量保持不變,因此您不必弄亂有狀態。 您也可以將它與普通的fit() API 一起使用。

暫無
暫無

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

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