LSTM/GRU 自动编码器收敛
LSTM/GRU autoencoder convergency
目标
尝试在多变量时间序列数据集上运行 LSTM 自动编码器:
X_train (200, 23, 178)
- X_val (100, 23, 178)
- X_test (100, 23, 178)
现状
普通自动编码器比 LSTM AE 的简单架构获得更好的结果。
我对如何使用 Repeat Vector 包装层有一些疑问,据我所知,它应该简单地重复等于序列长度的次数LSTM/GRU 单元的最后状态,以提供解码器层的输入形状。
模型架构没有出现任何错误,但结果仍然比简单的 AE 差一个数量级,而我希望它们至少相同,因为我使用的架构应该更好适合时间问题。
首先,这些结果是否具有可比性?
尽管如此,LSTM-AE 的重建误差看起来一点也不好。
我的AE模型:
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 178) 31862
_________________________________________________________________
batch_normalization (BatchNo (None, 178) 712
_________________________________________________________________
dense_1 (Dense) (None, 59) 10561
_________________________________________________________________
dense_2 (Dense) (None, 178) 10680
=================================================================
- 优化器:sgd
- 损失:mse
- 密集层的激活函数:relu
我的LSTM/GRUAE:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 23, 178) 0
_________________________________________________________________
gru (GRU) (None, 59) 42126
_________________________________________________________________
repeat_vector (RepeatVector) (None, 23, 59) 0
_________________________________________________________________
gru_1 (GRU) (None, 23, 178) 127092
_________________________________________________________________
time_distributed (TimeDistri (None, 23, 178) 31862
=================================================================
- 优化器:sgd
- 损失:mse
- gru层的激活函数:relu
您上面的 2 个模型似乎没有可比性,就有意义的方式而言。第一个模型试图压缩 178 个值的向量。这些向量很可能包含一些冗余信息,因此可以合理地假设您将能够压缩它们。
第二个模型试图通过单个 GRU 层压缩 23 x 178 向量的序列。这是一项具有大量参数的任务。重复向量简单地获取第一个 GRU 层(编码器)的输出,并将其作为第二个 GRU 层(解码器)的输入。但是随后您采用解码器的单个值。我建议您在第二个 GRU(解码器)中使用 return_sequences=True
而不是 TimeDistributed 层。否则你是说你期望 23x178 序列由所有具有相同值的元素组成;这必须导致非常高的错误/没有解决方案。
我建议您退后一步。您的目标是找到序列之间的相似性吗?或者能够做出预测?自动编码器方法更适用于相似性任务。为了做出预测,我建议您更多地采用一种方法,将 Dense(1) 层应用于序列步骤的输出。
你的数据集开放了吗?可用的 ?如果可能的话,我很想试一试。
目标
尝试在多变量时间序列数据集上运行 LSTM 自动编码器:
X_train (200, 23, 178)
- X_val (100, 23, 178)
- X_test (100, 23, 178)
现状
普通自动编码器比 LSTM AE 的简单架构获得更好的结果。
我对如何使用 Repeat Vector 包装层有一些疑问,据我所知,它应该简单地重复等于序列长度的次数LSTM/GRU 单元的最后状态,以提供解码器层的输入形状。
模型架构没有出现任何错误,但结果仍然比简单的 AE 差一个数量级,而我希望它们至少相同,因为我使用的架构应该更好适合时间问题。
首先,这些结果是否具有可比性?
尽管如此,LSTM-AE 的重建误差看起来一点也不好。
我的AE模型:
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 178) 31862
_________________________________________________________________
batch_normalization (BatchNo (None, 178) 712
_________________________________________________________________
dense_1 (Dense) (None, 59) 10561
_________________________________________________________________
dense_2 (Dense) (None, 178) 10680
=================================================================
- 优化器:sgd
- 损失:mse
- 密集层的激活函数:relu
我的LSTM/GRUAE:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 23, 178) 0
_________________________________________________________________
gru (GRU) (None, 59) 42126
_________________________________________________________________
repeat_vector (RepeatVector) (None, 23, 59) 0
_________________________________________________________________
gru_1 (GRU) (None, 23, 178) 127092
_________________________________________________________________
time_distributed (TimeDistri (None, 23, 178) 31862
=================================================================
- 优化器:sgd
- 损失:mse
- gru层的激活函数:relu
您上面的 2 个模型似乎没有可比性,就有意义的方式而言。第一个模型试图压缩 178 个值的向量。这些向量很可能包含一些冗余信息,因此可以合理地假设您将能够压缩它们。
第二个模型试图通过单个 GRU 层压缩 23 x 178 向量的序列。这是一项具有大量参数的任务。重复向量简单地获取第一个 GRU 层(编码器)的输出,并将其作为第二个 GRU 层(解码器)的输入。但是随后您采用解码器的单个值。我建议您在第二个 GRU(解码器)中使用 return_sequences=True
而不是 TimeDistributed 层。否则你是说你期望 23x178 序列由所有具有相同值的元素组成;这必须导致非常高的错误/没有解决方案。
我建议您退后一步。您的目标是找到序列之间的相似性吗?或者能够做出预测?自动编码器方法更适用于相似性任务。为了做出预测,我建议您更多地采用一种方法,将 Dense(1) 层应用于序列步骤的输出。
你的数据集开放了吗?可用的 ?如果可能的话,我很想试一试。