用于轨迹预测的编码器-解码器
Encoder-Decoder for Trajectory Prediction
我需要使用编码器-解码器结构来预测二维轨迹。由于几乎所有可用的教程都与 NLP 相关——使用稀疏向量——,我不确定如何使解决方案适应连续数据。
除了我对seqence-to-sequence模型的无知外,embedding
单词的处理更让我困惑。我有一个包含 3,000,000 个样本的数据集,每个样本具有 x-y
坐标 (-1, 1) 和 125
个观测值,这意味着每个样本的形状是 (125, 2)
。我想我可以把它想象成 125 个已经嵌入二维单词的单词,但是这个 Keras Tutorial 中的编码器和解码器期望 3D 数组为 (num_pairs, max_english_sentence_length, num_english_characters)
.
我怀疑我是否需要用这个模型单独训练每个样本 (125, 2)
,就像 Google 的搜索栏只写一个词一样。
据我了解,编码器是 many-to-one
类型模型,解码器是 one-to-many
类型模型。我需要获得一个内存状态 c
和一个隐藏状态 h
作为向量(?)。然后我应该使用这些向量作为解码器的输入,并提取我确定的 (x,y) 形状的预测作为编码器输出。
如果有人能给出一个关于我的数据集形状的编码器-解码器 LSTM 架构的示例,特别是在编码器-解码器输入和输出所需的维度方面,特别是在 Keras 模型上,如果可能。
我假设您想用之前的 125 个时间步长预测 50 个时间步长(作为示例)。我给你最基本的时间序列编码器-解码器结构,但它可以改进(例如 Luong Attention)。
from tensorflow.keras import layers,models
input_timesteps=125
input_features=2
output_timesteps=50
output_features=2
units=100
#Input
encoder_inputs = layers.Input(shape=(input_timesteps,input_features))
#Encoder
encoder = layers.LSTM(units, return_state=True, return_sequences=False)
encoder_outputs, state_h, state_c = encoder(encoder_inputs) # because return_sequences=False => encoder_outputs=state_h
#Decoder
decoder = layers.RepeatVector(output_timesteps)(state_h)
decoder_lstm = layers.LSTM(units, return_sequences=True, return_state=False)
decoder = decoder_lstm(decoder, initial_state=[state_h, state_c])
#Output
out = layers.TimeDistributed(Dense(output_features))(decoder)
model = models.Model(encoder_inputs, out)
所以这里的核心思想是:
- 将时间序列编码为两种状态:
state_h
和 state_c
。检查 this 以了解 LSTM 单元的工作。
- 重复
state_h
您要预测的时间步数
- 使用 LSTM 解码,初始状态由编码器计算
- 使用密集层来塑造每个时间步所需特征的数量
我建议您测试我们的结构并使用 model.summary()
和 tf.keras.utils.plot_model(mode,show_shapes=True)
将它们可视化。它为您提供了很好的表示形式,例如摘要:
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_5 (InputLayer) [(None, 125, 2)] 0
__________________________________________________________________________________________________
lstm_8 (LSTM) [(None, 100), (None, 41200 input_5[0][0]
__________________________________________________________________________________________________
repeat_vector_4 (RepeatVector) (None, 50, 100) 0 lstm_8[0][1]
__________________________________________________________________________________________________
lstm_9 (LSTM) (None, 50, 100) 80400 repeat_vector_4[0][0]
lstm_8[0][1]
lstm_8[0][2]
__________________________________________________________________________________________________
time_distributed_4 (TimeDistrib (None, 50, 2) 202 lstm_9[0][0]
==================================================================================================
Total params: 121,802
Trainable params: 121,802
Non-trainable params: 0
__________________________________________________________________________________________________
并绘制模型:
我需要使用编码器-解码器结构来预测二维轨迹。由于几乎所有可用的教程都与 NLP 相关——使用稀疏向量——,我不确定如何使解决方案适应连续数据。
除了我对seqence-to-sequence模型的无知外,embedding
单词的处理更让我困惑。我有一个包含 3,000,000 个样本的数据集,每个样本具有 x-y
坐标 (-1, 1) 和 125
个观测值,这意味着每个样本的形状是 (125, 2)
。我想我可以把它想象成 125 个已经嵌入二维单词的单词,但是这个 Keras Tutorial 中的编码器和解码器期望 3D 数组为 (num_pairs, max_english_sentence_length, num_english_characters)
.
我怀疑我是否需要用这个模型单独训练每个样本 (125, 2)
,就像 Google 的搜索栏只写一个词一样。
据我了解,编码器是 many-to-one
类型模型,解码器是 one-to-many
类型模型。我需要获得一个内存状态 c
和一个隐藏状态 h
作为向量(?)。然后我应该使用这些向量作为解码器的输入,并提取我确定的 (x,y) 形状的预测作为编码器输出。
如果有人能给出一个关于我的数据集形状的编码器-解码器 LSTM 架构的示例,特别是在编码器-解码器输入和输出所需的维度方面,特别是在 Keras 模型上,如果可能。
我假设您想用之前的 125 个时间步长预测 50 个时间步长(作为示例)。我给你最基本的时间序列编码器-解码器结构,但它可以改进(例如 Luong Attention)。
from tensorflow.keras import layers,models
input_timesteps=125
input_features=2
output_timesteps=50
output_features=2
units=100
#Input
encoder_inputs = layers.Input(shape=(input_timesteps,input_features))
#Encoder
encoder = layers.LSTM(units, return_state=True, return_sequences=False)
encoder_outputs, state_h, state_c = encoder(encoder_inputs) # because return_sequences=False => encoder_outputs=state_h
#Decoder
decoder = layers.RepeatVector(output_timesteps)(state_h)
decoder_lstm = layers.LSTM(units, return_sequences=True, return_state=False)
decoder = decoder_lstm(decoder, initial_state=[state_h, state_c])
#Output
out = layers.TimeDistributed(Dense(output_features))(decoder)
model = models.Model(encoder_inputs, out)
所以这里的核心思想是:
- 将时间序列编码为两种状态:
state_h
和state_c
。检查 this 以了解 LSTM 单元的工作。 - 重复
state_h
您要预测的时间步数 - 使用 LSTM 解码,初始状态由编码器计算
- 使用密集层来塑造每个时间步所需特征的数量
我建议您测试我们的结构并使用 model.summary()
和 tf.keras.utils.plot_model(mode,show_shapes=True)
将它们可视化。它为您提供了很好的表示形式,例如摘要:
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_5 (InputLayer) [(None, 125, 2)] 0
__________________________________________________________________________________________________
lstm_8 (LSTM) [(None, 100), (None, 41200 input_5[0][0]
__________________________________________________________________________________________________
repeat_vector_4 (RepeatVector) (None, 50, 100) 0 lstm_8[0][1]
__________________________________________________________________________________________________
lstm_9 (LSTM) (None, 50, 100) 80400 repeat_vector_4[0][0]
lstm_8[0][1]
lstm_8[0][2]
__________________________________________________________________________________________________
time_distributed_4 (TimeDistrib (None, 50, 2) 202 lstm_9[0][0]
==================================================================================================
Total params: 121,802
Trainable params: 121,802
Non-trainable params: 0
__________________________________________________________________________________________________
并绘制模型: