Machine learning 用于LSTM-RNN训练的填充时间序列子序列

Machine learning 用于LSTM-RNN训练的填充时间序列子序列,machine-learning,deep-learning,padding,lstm,recurrent-neural-network,Machine Learning,Deep Learning,Padding,Lstm,Recurrent Neural Network,我有一个时间序列数据集,用作LSTM-RNN的输入,用于行动预测。时间序列包括每秒30帧(即150个数据点)的5秒时间,数据表示面部特征的位置/移动 为了在数据集中增加冗余并减少过度拟合,我从我的数据集中取样长度较小的附加子序列。在这种情况下,我知道子序列的开始帧和结束帧 为了批量训练模型,所有时间序列都需要具有相同的长度,并且根据文献中的许多论文,填充不应影响网络的性能 例如: 原始顺序: 1 2 3 4 5 6 7 8 9 10 子序列: 4 5 6 7 8 9 10 2 3 4 5 6

我有一个时间序列数据集,用作LSTM-RNN的输入,用于行动预测。时间序列包括每秒30帧(即150个数据点)的5秒时间,数据表示面部特征的位置/移动

为了在数据集中增加冗余并减少过度拟合,我从我的数据集中取样长度较小的附加子序列。在这种情况下,我知道子序列的开始帧和结束帧

为了批量训练模型,所有时间序列都需要具有相同的长度,并且根据文献中的许多论文,填充不应影响网络的性能

例如:

原始顺序:

 1 2 3 4 5 6 7 8 9 10
子序列:

4 5 6 7
8 9 10
2 3 4 5 6
考虑到我的网络正试图预测一个动作(意味着当p(动作)>阈值从t=0到t=tmax时,它将预测该动作),填充的位置是否重要

选项1:零用于替换原始值

0 0 0 4 5 6 7 0 0 0
0 0 0 0 0 0 0 8 9 10
0 2 3 4 5 6 0 0 0 0
选项2:末尾全部为零

4 5 6 7 0 0 0 0 0 0 
8 9 10 0 0 0 0 0 0 0
2 3 4 5 0 0 0 0 0 0
此外,一些时间序列缺少一些帧,但不知道它们是哪些帧——这意味着,如果我们只有60帧,我们不知道它们是从0到2秒,从1到3秒等等。这些需要在子序列被提取之前进行填充。在这种情况下,填充的最佳实践是什么


提前感谢。

通常,LSTM和RNN最强大的属性是它们的参数在时间范围内共享(参数在时间范围内重复出现)但参数共享依赖于相同参数可用于不同时间步的假设,即前一时间步和下一时间步之间的关系不依赖于所解释的t

简言之,从理论上讲,在末尾填充零不应改变模型的准确性。我从理论上使用了副词,因为在每一个时间步,LSTM的决定取决于它的细胞状态以及其他因素,而这个细胞状态是对过去框架的一种简短总结。据我所知,在你的情况下,过去的画面可能会丢失。我认为你在这里做的是一个小小的权衡

我宁愿在结尾加上零,因为它与RNN的基本假设并不完全冲突,而且实现和跟踪RNN更方便


在实施方面,我知道tensorflow计算损失函数,只要您给出每个样本的序列和实际序列大小(例如,对于4 5 6 7 0 0 0 0 0 0 0 0,您还需要给出实际大小,此处为4),假设您正在实施选项2。不过,我不知道选项1是否有实现。

最好在开始时填充零,正如本文所建议的

虽然后填充模型在6个时代达到了效率的顶峰,并在之后开始过度拟合,但它的准确性远远低于预填充


检查表1,其中预填充(开头填充零)的精度约为80%,但对于后填充(结尾填充零),精度仅为50%

谢谢,这非常有用!