前言
- 本文用于快速回忆相关知识,个人笔记。
预处理
- 数据每个样本是一个句子,首先定一个最大句子长度max_len,然后将所有数据样本整理成[batch_size,max_len]的形式,每个元素是id,不是char。
- 创建好迭代器
建立模型
- 参考下面:
# 建立模型
class BiRNN(nn.Module):
def __init__(self,vocab,embed_size,num_hiddens,num_layers):
super(BiRNN,self).__init__()
self.embedding=nn.Embedding(len(vocab),embed_size)
self.encoder=nn.LSTM(input_size=embed_size,hidden_size=num_hiddens,
num_layers=num_layers,bidirectional=True)
self.decoder=nn.Linear(4*num_hiddens,2)
def forward(self,inputs):
# inputs的形状是(批量大小, 词数),因为LSTM需要将序列长度(seq_len)作为第一维,所以将输入转置后
# 再提取词特征,输出形状为(词数, 批量大小, 词向量维度)
embeddings=self.embedding(inputs.permute(1,0))
# rnn.LSTM只传入输入embeddings,因此只返回最后一层的隐藏层在各时间步的隐藏状态。
# outputs形状是(词数, 批量大小, 2 * 隐藏单元个数)
outputs,_=self.encoder(embeddings)# output,(h,c)
# 连结初始时间步和最终时间步的隐藏状态作为全连接层输入。它的形状为
# (批量大小, 4 * 隐藏单元个数)。
encoding=torch.cat((outputs[0],outputs[-1]),-1)
outs=self.decoder(encoding)
return outs
我们首先要把输入的[batch_size,max_len]中的元素转化为词向量,得到[max_len,batch_size,embed_size]的数据,然后使用LSTM提取特征,得到的outputs是[max_len,batch_size,2*num_hidden],隐藏状态的尺寸是[num_layers,batch_size,num_hidden],是最后一步所有的隐藏状态。提取完特征就要走全连接层了,首先联结最初和最终时间步的特征,torch.cat((outputs[0],outputs[-1]),-1)得到尺寸为[batch_size,4*num_hidden],然后输入到全连接层得到[batch_size,2]的预测结果,待会这个结果和label走一遍loss就得到损失了。
引入训练好的词向量
- 使用训练好的词向量初始化模型中的self.embedding层,并设置它的requires_grad=False