目标
尝试在一个多变量时间序列数据集上运行LSTM自编码器:
X_train (200, 23, 178)
– X_val (100, 23, 178)
– X_test (100, 23, 178)
当前情况
一个普通的自编码器比一个简单的LSTM AE架构取得了更好的结果。
我对如何使用Repeat Vector包装层有一些疑问,据我所知,它应该只是简单地重复LSTM/GRU单元的最后状态,次数等于序列长度,以便适应解码层输入形状的需求。
模型架构没有引发任何错误,但结果却比一个简单的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/GRU AE:
_________________________________________________________________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
回答:
你上面提到的两个模型似乎在有意义的方式上无法比较。第一个模型试图压缩你的178个值的向量。这些向量可能包含一些冗余信息,因此可以合理地假设你能够压缩它们。
第二个模型试图通过单个GRU层压缩23 x 178的向量序列。这是一个参数数量显著增加的任务。重复向量只是将第一个GRU层(编码器)的输出作为第二个GRU层(解码器)的输入。但随后你只取了解码器的一个值。我建议你不用TimeDistributed层,而是在第二个GRU(解码器)中使用return_sequences=True
。否则,你等于在说你期望23×178序列的所有元素值都相同;这必然会导致非常高的误差/无解的情况。
我建议你退一步思考。你的目标是寻找序列之间的相似性吗?还是要进行预测?对于相似性任务,自编码器方法更可取。为了进行预测,我建议你更倾向于在序列步骤的输出上应用Dense(1)层的做法。
你的数据集是公开的吗?可用的吗?如果可能的话,我对尝试使用它感到好奇。