具有不同时间步数的 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 或类似类型的层。
你可以这样做:
- 使用 LSTM 对您的输入数据进行编码
- 复制此编码向量所需的次数
- 解码编码向量
在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
来完成。检查这个 .
我是这个领域的新手,目前正在使用 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 或类似类型的层。
你可以这样做:
- 使用 LSTM 对您的输入数据进行编码
- 复制此编码向量所需的次数
- 解码编码向量
在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
来完成。检查这个