我有一个时间序列数据集,我用它作为LSTM-RNN的输入,用于行动预期。时间序列包括30 fps(即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到0 2秒,从1到3秒等。这些需要在甚至采取子序列之前进行填充。在这种情况下填充的最佳做法是什么?
提前谢谢。
答案 0 :(得分:8)
LSTM和RNN最强大的属性一般是它们的参数沿着时间帧共享(参数 recur 随着时间的推移),但参数共享依赖于相同参数可以假设用于不同的时间步骤,即上一个时间步骤与下一个时间步骤之间的关系 依赖于here in page 388, 2nd paragraph所解释的。
简而言之,最后填充零,理论上不应该改变模型的准确性。我在理论上使用副词 ,因为在每个时间步骤LSTM的决定取决于其细胞状态以及其他因素,并且该细胞状态是过去帧的简短概述。据我所知,在你的情况下,过去的帧可能会丢失。我认为你在这里有一点权衡。
我宁愿在最后填充零,因为它与RNN的基本假设并不完全冲突,并且实现和跟踪更方便。
在实现方面,我知道一旦你给出序列和每个样本的实际序列大小,tensorflow会计算损失函数(例如,对于4 5 6 7 0 0 0 0 0 0你还需要给它实际的这里的大小是4)假设您正在实现选项2.我不知道是否有选项1的实现。
答案 1 :(得分:3)
如本文建议Effects of padding on LSTMs and CNNs,
尽管后填充模型在6个时期达到了最高效率,然后开始过拟合,但其准确性远低于预填充。
检查表1,填充前(填充零开始)的精度大约为80%,但是填充后(填充零结束)的精度只有50%左右