我有一个时间序列数据集,我使用它作为LSTM的输入,用于行动预期。时间序列包括在30 fps时的5秒时间(即150个数据点),该数据代表面部特征的位置/移动。
我从我的数据集中取样更小长度的附加子序列,以增加数据集中的冗余并减少过度拟合。在这种情况下,我知道子序列的开始和结束框架。
为了对模型进行批量训练,所有的时间序列都需要具有相同的长度,并且根据文献中的许多文献,填充不应该影响网络的性能。
示例:
原始序列:
1 2 3 4 5 6 7 8 9 10子序列:
4 5 6 7
8 9 10
2 3 4 5 6考虑到我的网络正试图预测一个动作(这意味着,当P( action ) >阈值从t=0到T= tmax时,它就会预测该动作),那么填充到哪里会有关系吗?
选项1:0替换原始值
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到3s,等等。这些都需要在子序列被取之前进行填充。在这种情况下,填充的最佳实践是什么?
提前谢谢你。
发布于 2017-05-23 14:17:00
LSTMs和RNN最强大的特点是它们的参数沿时间帧共享(参数随时间帧重复),但参数共享依赖于相同的参数可以用于不同的时间步骤,即前一时间步长与下一时间步长的关系,不依赖于解释见第388页第2段的t。
总之,最后填充零点,理论上不应改变模型的精度。我在理论上使用副词,因为在每个时间步骤,LSTM的决定取决于它的细胞状态以及其他因素,而这个单元状态是对过去框架的简短总结。据我所知,过去的框架可能在你的情况下缺失了。我想你在这里做的是一个小小的交换。
我宁愿在最后放置零,因为它与RNN的基本假设并不完全冲突,而且更方便地实现和跟踪。
在实现方面,我知道tensorflow在给出每个样本的序列和实际序列大小后计算损失函数(例如,对于4 5 6 7 0 0 0,您也需要给它实际大小,这里是4),假设您正在实现选项2。不过,我不知道选项1是否有实现。
发布于 2019-04-21 09:54:58
最好在开始时使用填充零,正如本文所建议的填充对LSTM和CNN的影响,
虽然post填充模型在6个周期达到了效率的顶峰,并在此之后开始过度适应,但它的精度远低于预填充。
检查表1,其中预填充(初始填充为零)的准确率约为80%,但对于后填充(最后为填充零),则仅为50%左右。
发布于 2021-11-12 08:47:41
如果您有可变长度的序列,pytorch提供实用函数序列。具有此功能的一般工作流是
from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence
embedding = nn.Embedding(4, 5)
rnn = nn.GRU(5, 5)
sequences = torch.tensor([[1,2,0], [3,0,0], [2,1,3]])
lens = [2, 1, 3] # indicating the actual length of each sequence
embeddings = embedding(sequences)
packed_seq = pack_padded_sequence(embeddings, lens, batch_first=True, enforce_sorted=False)
e, hn = rnn(packed_seq)您可以通过以下方式收集每个令牌的嵌入
e = pad_packed_sequence(e, batch_first=True)使用此函数比自己填充更好,因为torch将限制RNN仅检查实际序列并在填充令牌之前停止。
https://stackoverflow.com/questions/44131718
复制相似问题