簡體   English   中英

具有不同時間步數的 LSTM seq2seq 輸入和 output

[英]LSTM seq2seq input and output with different number of time steps

我是這個領域的新手,目前正在使用 keras 進行視頻動作預測項目。 輸入數據占用每個視頻的 10% 幀,並將所有相同的連續動作轉換為 1 個單個動作。 例如 [0,0,0,1,1,1,2] -> [0,1,2]。 應用填充和 one-hot 編碼后,輸入數據的形狀為 (1460, 6, 48) -> (視頻數,動作數,48 個動作的 one-hot 編碼形式)。 我想預測每個視頻的所有未來動作。 output 的形狀應該是 (1460, 23, 48) -> (視頻數,最大時間步長,48 個動作的一鍵編碼形式)。

這是我目前的方法,它不起作用。

def lstm_model(frame_len, max_timesteps):

    model = Sequential()
    model.add(LSTM(100, input_shape=(None,48), return_sequences=True))
    model.add(Dense(48, activation='tanh'))
    model.compile(loss='mae', optimizer='adam', metrics=['accuracy'])
    model.summary()
    return model

圖片1

圖片2

我想知道我是否必須保持輸入和 output 的時間步數相同。 如果沒有,我如何修改 model 以適應此類數據。

任何幫助,將不勝感激。

你可以這樣做:

  1. 使用 LSTM 對輸入數據進行編碼
  2. 復制此編碼向量所需的次數
  3. 解碼編碼向量

在 keras 中,它看起來像:

from tensorflow.keras import layers,models

input_timesteps=10
input_features=2
output_timesteps=3
output_features=1
units=100

#Input
encoder_inputs = layers.Input(shape=(input_timesteps,input_features))

#Encoder
encoder = layers.LSTM(units, return_sequences=False)(encoder_inputs)

#Repeat
decoder = layers.RepeatVector(output_timesteps)(encoder)

#Decoder
decoder = layers.LSTM(units, return_sequences=True)(decoder)

#Output
out = layers.TimeDistributed(Dense(output_features))(decoder)

model = models.Model(encoder_inputs, out)

它給你:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 10, 2)]           0         
_________________________________________________________________
lstm (LSTM)                  (None, 100)               41200     
_________________________________________________________________
repeat_vector (RepeatVector) (None, 3, 100)            0         
_________________________________________________________________
lstm_1 (LSTM)                (None, 3, 100)            80400     
_________________________________________________________________
time_distributed (TimeDistri (None, 3, 1)              101       
=================================================================

如果您想保留編碼器中的單元 state 以在解碼器中重新使用,您可以使用return_state=True來實現。 檢查這個問題

雖然您不必保持它們相同,但您確實需要在 LSTM 之后添加全連接層以更改維度,或者使用 MaxPool2D 或類似類型的層。

暫無
暫無

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

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