首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于LSTM训练的填充时间序列子序列

用于LSTM训练的填充时间序列子序列
EN

Stack Overflow用户
提问于 2017-05-23 10:04:19
回答 3查看 14.2K关注 0票数 13

我有一个时间序列数据集,我使用它作为LSTM的输入,用于行动预期。时间序列包括在30 fps时的5秒时间(即150个数据点),该数据代表面部特征的位置/移动。

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

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

示例:

原始序列:

代码语言:javascript
运行
复制
 1 2 3 4 5 6 7 8 9 10

子序列:

代码语言:javascript
运行
复制
4 5 6 7
8 9 10
2 3 4 5 6

考虑到我的网络正试图预测一个动作(这意味着,当P( action ) >阈值从t=0到T= tmax时,它就会预测该动作),那么填充到哪里会有关系吗?

选项1:0替换原始值

代码语言:javascript
运行
复制
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:末尾的所有零

代码语言:javascript
运行
复制
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,等等。这些都需要在子序列被取之前进行填充。在这种情况下,填充的最佳实践是什么?

提前谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-23 14:17:00

LSTMs和RNN最强大的特点是它们的参数沿时间帧共享(参数随时间帧重复),但参数共享依赖于相同的参数可以用于不同的时间步骤,即前一时间步长与下一时间步长的关系,不依赖于解释见第388页第2段的t。

总之,最后填充零点,理论上不应改变模型的精度。我在理论上使用副词,因为在每个时间步骤,LSTM的决定取决于它的细胞状态以及其他因素,而这个单元状态是对过去框架的简短总结。据我所知,过去的框架可能在你的情况下缺失了。我想你在这里做的是一个小小的交换。

我宁愿在最后放置零,因为它与RNN的基本假设并不完全冲突,而且更方便地实现和跟踪。

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

票数 12
EN

Stack Overflow用户

发布于 2019-04-21 09:54:58

最好在开始时使用填充零,正如本文所建议的填充对LSTM和CNN的影响

虽然post填充模型在6个周期达到了效率的顶峰,并在此之后开始过度适应,但它的精度远低于预填充。

检查表1,其中预填充(初始填充为零)的准确率约为80%,但对于后填充(最后为填充零),则仅为50%左右。

票数 6
EN

Stack Overflow用户

发布于 2021-11-12 08:47:41

如果您有可变长度的序列,pytorch提供实用函数序列。具有此功能的一般工作流是

代码语言:javascript
运行
复制
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)

您可以通过以下方式收集每个令牌的嵌入

代码语言:javascript
运行
复制
e = pad_packed_sequence(e, batch_first=True)

使用此函数比自己填充更好,因为torch将限制RNN仅检查实际序列并在填充令牌之前停止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44131718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档