我遇到一个奇怪的情况,试图在我的时间序列数据集上创建高效的自动编码器:
X_train (200, 23, 178)
X_val (100, 23, 178)
X_test (100, 23, 178)
在时间序列数据集上,使用简单的自动编码器比使用简单的LSTM AE可获得更好的结果。
我对重复向量包装器层的使用有些担心,据我所知,该层应该重复许多次,例如序列长度是LSTM / GRU单元的最后状态,为了适合解码器层的输入形状。
该模型不会出现任何错误,但结果仍然比简单的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
=================================================================
_________________________________________________________________
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
=================================================================
在使用这些循环图层时,我是否在某些假设下犯了一些大错误?或者您对如何调试它有一些建议?
答案 0 :(得分:1)
您上面拥有的2个模型在某种意义上似乎并不具有可比性。第一个模型正在尝试压缩178个值的向量。这些向量很可能包含一些冗余信息,因此有理由假设您将能够对其进行压缩。
第二个模型正在尝试通过单个GRU层压缩23 x 178个向量的序列。这是一个具有大量参数的任务。重复向量仅获取第一GRU层(编码器)的输出,并将其输入到第二GRU层(解码器)的输入。但是随后您需要使用解码器的单个值。建议您在第二个GRU(解码器)中使用return_sequences=True
而不是TimeDistributed层。否则,您是在说23x178序列是由均具有相同值的元素构成的。必须导致很高的错误/无法解决。
我建议您退后一步。您的目标是寻找序列之间的相似性吗?还是能够做出预测?对于相似性任务,最好使用自动编码器方法。为了做出预测,我建议您更进一步采用将Dense(1)层应用于序列步骤的输出的方法。
您的数据集是否打开?有空吗?如果可以的话,我很想尝试一下。