循环神经网络实现情感分析

目录

  • 前言
  • 预处理
  • 建立模型
  • 引入训练好的词向量
  • 训练就不说了

前言

  • 本文用于快速回忆相关知识,个人笔记。

预处理

  • 数据每个样本是一个句子,首先定一个最大句子长度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

训练就不说了

你可能感兴趣的:(nlp)