作者回复: Hello,感谢留言。 我们首先看一下torch.nn.LSTM这个函数的输入与输出,详见文档: https://pytorch.org/docs/stable/generated/torch.nn.LSTM.html?highlight=nn%20lstm#torch.nn.LSTM torch.nn.LSTM的输入参数: input_size: 表示的是输入的矩阵特征数 hidden_size: 表示的是输出矩阵特征数 num_layers 表示堆叠几层的LSTM,默认是1 bidirectional: 默认是false,代表不用双向LSTM,双向LSTM,也就是序列从左往右算一次,从右往左又算一次,这样就可以两倍的输出 batch_first: True 或者 False,因为nn.lstm()接受的数据输入是(序列长度,batch,输入维数),这和我们cnn输入的方式不太一致,所以使用batch_first,我们可以将输入变成(batch,序列长度,输入维数) torch.nn.LSTM的输出格式为:output,(h_n,c_n) 其中: output的shape=(seq_length,batch_size,num_directions*hidden_size),它包含的是LSTM的最后一时间步的输出特征(h_t),t是batch_size中每个句子的长度。 h_n.shape==(num_directions * num_layers,batch,hidden_size) c_n.shape==h_n.shape h_n包含的是句子的最后一个单词(也就是最后一个时间步)的隐藏状态,c_n包含的是句子的最后一个单词的细胞状态,所以它们都与句子的长度seq_length无关。 output[-1]与h_n是相等的,因为output[-1]包含的正是batch_size个句子中每一个句子的最后一个单词的隐藏状态。 if self.lstm.bidirectional: hidden = self.dropout(torch.cat([hidden[-1], hidden[-2]], dim=-1)) 这里面,hidden是torch.nn.LSTM的第二个输出h_n,hidden的shape是(2 * 2, batch, 300)。 因此,双向LSTM时,hidden[-1]表示从最后一个堆叠的从左到右的LSTM的的最后一个时间步向量,hidden[-2]表示最后一个堆叠的从右到左的LSTM最后一个时间步向量。将这两个向量拼接在一起,得到最后的hidden层。 而dim=-1表示torch.cat的拼接方式,拼接300(embedding_dim)那个维度,也就是将两个300维度的向量拼接成一个600维度的向量。
作者回复: 你好,感谢你的留言。 torchtext支持的分词器有:spacy, moses, toktok, revtok, subword。 spacy库是可以支持中文分词的。 可以尝试以下代码: import spacy spacy = spacy.load("zh_core_web_sm") tokenizer = get_tokenizer(spacy)
作者回复: 您好,感谢你的留言。 看看是不是torchtext版本更新了? 我用的是0.10.1
作者回复: 你好,感谢留言。 python的多行注释是用三对单引号。 ''' 输出:['here', 'is', 'the', 'an', 'example', '!'] ''' 这部分内容是代码中的注释,为了告诉你上述代码的运行结果是什么。 有的IDE运行时会输出多行注释,只需把注释删除即可,并不是断行出现问题。
作者回复: hello,Ringcoo,你好。感谢你的留言。 当我们训练LSTM时,因为文本句子长短不一,如果想要进行批次化训练,就需要选择一个合适的长度来进行截断和填充。 torch.nn.utils.rnn.pad_packed_sequence()并不是一个rnn层,这个函数的目的是将LSTM返回的结果进行统一填充,得到长度相同的Tensor对象。 hidden和cell是LSTM的结构中的一部分。 LSTM神经元在时间维度上向后传递了两份信息: (1)cell state; (2)hidden state。 hidden state是cell state经过一个神经元和一道“输出门”后得到的,因此hidden state里包含的记忆,实际上是cell state衰减之后的内容。 另外,cell state在一个衰减较少的通道里沿时间轴传递,对时间跨度较大的信息的保持能力比hidden state要强很多。 因此,实际上hidden state里存储的,主要是“近期记忆”;cell state里存储的,主要是“远期记忆”。 cell state的存在,使得LSTM得以对长依赖进行很好地刻画。
作者回复: 你好,赵心睿,感谢留言。使用的是0.10.1。
作者回复: 你好,快乐小夜曲,感谢你的留言。 在train函数中,已经对length进行了转换:length = length.to(device) length是从外部传入的,所以这里无需显示对length再进行转换了。
作者回复: hello,我用的是torchtext 0.10.1。