具有不同时间步数的 LSTM seq2seq 输入和输出

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 编码形式)。我想预测每个视频的所有未来动作。输出的形状应该是 (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

我想知道是否必须让输入和输出的时间步数相同。 如果没有,我该如何修改模型以适应这些数据。

如有任何帮助,我们将不胜感激。

虽然不必保持相同,但您确实需要在 LSTM 之后添加全连接层以更改维度,或者使用 MaxPool2D 或类似类型的层。

你可以这样做:

  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       
=================================================================

如果你想保留来自编码器的单元状态以便在解码器中重新使用,你可以使用 return_state=True 来完成。检查这个 .