Pytorch中如何理解RNN LSTM GRU的input(重点理解seq_len / time_steps)

在建立时序模型时,若使用keras,我们在Input的时候就会在shape内设置好sequence_length(后面简称seq_len),接着便可以在自定义的data_generator内进行个性化的使用。这个值同时也就是time_steps,它代表了RNN内部的cell的数量,有点懵的朋友可以再去看看RNN的相关内容:个人总结:从RNN(内含BPTT以及梯度消失/爆炸)到 LSTM(内含GRU)Seq2Seq Attention

所以设定好这个值是很重要的事情,它和batch_size,feature_dimensions(在词向量的时候就是embedding_size了)构成了我们Input的三大维度,无论是keras/tensorflow,亦或是Pytorch,本质上都是这样。

牵涉到这个问题是听说Pytorch自由度更高,最近在做实验的时候开始尝试用Pytorch了,写完代码跑通后,过了段时间才意识到,好像没有用到seq_len这个参数,果然是Keras用多了的后遗症?!(果然是博主比较蠢!)检查了一下才发现,DataLoader生成数据的时候,默认生成为(batch_size, 1, feature_dims)。(这里无视了batch_size和seq_len的顺序,在建立模型的时候,比如nn.LSTM有个batch_first的参数,它决定了谁前谁后,但这不是我们这里讨论的重点)。

所以我们的seq_len/time_steps被默认成了1,这是在使用Pytorch的时候容易发生的问题,由于Keras先天的接口设置在Input时就让我们无脑设置seq_len,这反而不会成为我们在使用Keras时发生的问题,而Pytorch没有让我们在哪里设置这个参数,所以一不小心可能就忽视了。

好了,接下来就来找找问题怎么出现的,又怎么解决。果然问题还是出现在了DataLoader,在__getitem__(self, index)这里,决定了我们如何取出数据,这里我发现我自己还是用的最简单的方式一条一条取的。

    
### seq_len 参数的含义 在深度学习中的自然语言处理任务里,`seq_len` 表示输入到模型中的序列长度。这个参数定义了每次传递给神经网络的数据片段有多长。对于文本数据而言,这通常意味着句子或文档中连续字符的数量或是标记化后的词汇数量[^1]。 ### 设置 `seq_len` 的方法及其影响 当构建循环神经网络 (RNN),长短时记忆网络 (LSTM),门控循环单元 (GRU) 或者 Transformer 架构来处理时间序列或者文本数据时,设定合适的 `seq_len` 是至关重要的: - **较短的 `seq_len`**: 可能会丢失上下文信息,因为模型只看到非常局部的内容;然而这样做减少了内存消耗并加快训练过程。 - **较长的 `seq_len`**: 能够捕捉更广泛的依赖关系,但是增加了计算复杂性和潜在梯度消失问题的风险,同时也可能需要更多的GPU/CPU资源以及更大的批量大小(batch size). ### 使用代码实例展示如何配置 `seq_len` 下面是一个简单的例子,在 PyTorch 中创建了一个 LSTM 模型,并设置了特定的 `seq_len`: ```python import torch from torch import nn class LSTMSentiment(nn.Module): def __init__(self, vocab_size, embed_dim=300, hidden_dim=256, output_dim=1, n_layers=2, bidirectional=True, dropout=0.5, pad_idx=1, seq_len=50): super().__init__() self.embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=pad_idx) self.lstm = nn.LSTM(embed_dim, hidden_dim, num_layers=n_layers, bidirectional=bidirectional, batch_first=True, dropout=dropout if n_layers > 1 else 0) self.fc = nn.Linear(hidden_dim * 2 if bidirectional else hidden_dim, output_dim) self.dropout = nn.Dropout(dropout) def forward(self, text): # shape of text: [batch_size, seq_len] embedded = self.dropout(self.embedding(text)) # [batch_size, seq_len, emb_dim] outputs, (hidden, cell) = self.lstm(embedded) # outputs shape: [batch_size, seq_len, hid_dim*num_directions] # hidden and cell shapes are both [num_layers*num_directions,batch_size,hid_dim] hidden = self.dropout(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1)) return self.fc(hidden.squeeze(0)) # 创建模型实例 model = LSTMSentiment(vocab_size=10000, seq_len=50).to('cuda' if torch.cuda.is_available() else 'cpu') ``` 在这个例子中,`seq_len` 设定为 50,这意味着每个批次传入模型的文字序列将由最多 50 个单词组成。如果实际文本超过此长度,则会被截断;反之则填充至该长度。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值