9、pytorch中LSTM和GRU模块使用

发布时间:2026/8/13 16:58:37
9、pytorch中LSTM和GRU模块使用 1 LSTM的API介绍LSTM和GRU都是torch.nn提供观察文档可知LSTM的参数。torch.nn.LSTM(input_size,hidden_size,num_layers,batch_first,dropout,bidirectional)input_size输入数据的形状即embedding_dimhidden_size隐藏层的数量即每一层有多少个LSTM单元num_layer即RNN中LSTM单元的层数batch_first默认值为False输入的数据需要[seq_len,batch_size,feature]输出的out也为(seq_len, batch_size, num_directions * hidden_size)h_n(num_layers * num_directions, batch_size, hidden_size)如果为True则输入的数据为[batch_size,seq_len,feature]输出的out也为(batch_size, seq_len, num_directions * hidden_size)h_n不变dropoutdropout的比例默认值为0。dropout是一种训练过程中让部分参数随机失活的一种方式能够提高训练速度同时解决过拟合的问题这里是在LSTM的最后一层对每个输出进行dropoutbidirectional是否使用双向LSTM默认是False实例化LSTM对象后不仅需要传入数据还需要前一次的h0前一次的隐藏状态和c0前一次的memory即output(h_n, c_n) lstm(input,(h0,c0))input(seq_length,batch_size,input_size)h0(num_layers*num_directions,batch_size,hidden_size)c0(num_layers*num_directions,batch_size,hidden_size)LSTM的默认输出为output(h_n, c_n)output(seq_len, batch_size, num_directions * hidden_size)h_n(num_layers * num_directions, batch_size, hidden_size)单向时num_directions1双向为2c_n(num_layers * num_directions, batch_size, hidden_size)2 LSTM使用示例假设数据输入为input形状是[10,20]假设embedding的形状是[100,30]则LSTM使用示例如下importtorch batch_size10seq_len20embedding_dim30word_vocab100hidden_size18num_layer2# 准备输入数据inputtorch.randint(low0,high100,size(batch_size,seq_len))# 10 * 20# 准备embeddingembeddingtorch.nn.Embedding(word_vocab,embedding_dim)# 100 * 30lstmtorch.nn.LSTM(embedding_dim,hidden_size,num_layer)# 进行embeding操作embedembedding(input)# [10,20,30]# 转化数据为batch_firstFalseembedembed.permute(1,0,2)# [20,10,30]# 初始化状态如果不初始化,torch默认初始值为全0h_0torch.rand(num_layer,batch_size,hidden_size)c_0torch.rand(num_layer,batch_size,hidden_size)output,(h_1,c_1)lstm(embed,(h_0,c_0))print(output.size(),h_1.size(),c_1.size())# output [20,10,1*18]# h_1 [2,10,18]# c_1 [2,10,18]3 GRU的APIGRU模块torch.nn.GRU和LSTM的参数相同含义相同具体可参考文档但是输入只剩下gru(input,h_0)输出为output,h_n。即output,h_n gru(input,h_0)其形状为output(seq_len, batch_size, num_directions * hidden_size)h_n(num_layers * num_directions, batch_size, hidden_size)4 双向LSTM如果选择使用双向LSTM则在实例化的过程中需要把LSTM中bidrecitonal设置为True同时h0和c0使用num_layer*2观察效果输出为batch_size10# 句子数量seq_len20# 每个句子长度embedding_dim30# 每个词语使用多长的向量表示word_vocab100# 词典中词语总数hidden_size18# 隐藏层中LSTM的个数num_layer2# 多少个隐藏层# 准备输入数据inputtorch.randint(low0,high100,size(batch_size,seq_len))# 准备embeddingembeddingtorch.nn.Embedding(word_vocab,embedding_dim)lstmtorch.nn.LSTM(embedding_dim,hidden_size,num_layer,bidirectionalTrue)# 进行embeding操作embedembedding(input)# [10,20,30]# 转化数据为batch_firstFalseembedembed.permute(1,0,2)# [20,10,30]# 初始化状态如果不初始化,torch默认初始值为全0h_0torch.rand(num_layer*2,batch_size,hidden_size)c_0torch.rand(num_layer*2,batch_size,hidden_size)output,(h_1,c_1)lstm(embed,(h_0,c_0))# output [20,10,2*18]# h_1 [2*2,10,18]# c_1 [2*2,10,18]在单向LSTM中output最后一个time step的输出和最后一层隐藏状态h_n的输出相同那么双向LSTM呢双向LSTM中output按照正反计算结果的顺序在最后一个维度进行拼接正向第一个time step输出拼接反向的最后一个time step输出hidden state按照得到的结果在第0个维度进行拼接正向第一层之后接着是反向第一层正向第二层之后接着是反向第二层。。。前向LSTM中output最后一个time step的输出和最后一层 前向传播 隐藏状态h_n的输出相同后向LSTM中output最后一个time step的输出和最后一层 后向传播 隐藏状态h_n的输出相同5 LSTM和GRU的使用注意点第一次调用之前需要初始化隐藏状态往往会使用LSTM或GRU的输出的最后一维最后一个time step的结果来代表LSTM、GRU对文本处理的结果。其形状为[seq_len, batch_size, num_directions * hidden_size]。并不是所有模型都会使用最后一维的结果如果batch_firstFalse则output[-1] or output[-1,:,:]可以获取最后一维如果batch_firstTrue则output[:,-1,:]可以获取最后一维如果结果是(seq_len, batch_size, num_directions * hidden_size)需要把它转化为(batch_size, seq_len, num_directions * hidden_size)的形状不能够使用view等变形的方法需要使用output.permute(1,0,2)即交换0和1轴实现上述效果。使用双向LSTM的时候往往会分别使用每个方向最后一层的h_n作为当前数据经过双向LSTM的结果即torch.cat([h_n[-2,:,:],h_n[-1,:,:]],dim-1)最后的结果的size是[batch_size, hidden_size* 2]上述内容在GRU中同理。