建设机械网站案例,app开发公司怎么找到需要定制的客户,广州网站制作是什么,运输公司网站模板#x1f468;#x1f393;作者简介#xff1a;一位即将上大四#xff0c;正专攻机器学习的保研er #x1f30c;上期文章#xff1a;机器学习深度学习——NLP实战#xff08;情感分析模型——数据集#xff09; #x1f4da;订阅专栏#xff1a;机器学习作者简介一位即将上大四正专攻机器学习的保研er 上期文章机器学习深度学习——NLP实战情感分析模型——数据集 订阅专栏机器学习深度学习 希望文章对你们有所帮助 NLP实战情感分析模型——RNN实现 引入使用循环神经网络表示单个文本加载预训练的词向量训练和评估模型小结 引入
与词相似度和类比任务一样我们也可以将预先训练的词向量应用于情感分析。上节已经下载过了IMDb评论数据集了这个数据集也不算很大虽然下载了很久。。。使用在大规模语料库上预训练的文本表示可以减少模型的过拟合。我们将使用GloVe模型来表示每个词元并将这些词元表示送入多层双向循环神经网络以获得文本序列表示该文本序列表示将被转换为情感分析输出。对于相同的下游应用之后再讲不同的架构选择。 如上图所示将GloVe送入基于循环神经网络的架构用于情感分析。
import torch
from torch import nn
from d2l import torch as d2lbatch_size 64
train_iter, test_iter, vocab d2l.load_data_imdb(batch_size)使用循环神经网络表示单个文本
在文本分类任务中可变长度的文本序列将被转换为固定长度的类别。在下面的BiRNN类中虽然文本序列的每个词元经过嵌入层self.embedding获得其单独的预训练GloVe表示但是整个序列由双向循环神经网络self.encoder编码。更具体的说双向长短期记忆网络在初始和最终时间步的隐状态在最后一层被连结起来作为文本序列的表示。然后通过一个具有两个输出“积极”和“消极”的全连接层self.decoder将此单一文本表示转换为输出类别。
class BiRNN(nn.Module):def __init__(self, vocab_size, embed_size, num_hiddens,num_layers, **kwargs):super(BiRNN, self).__init__(**kwargs)self.embedding nn.Embedding(vocab_size, embed_size)# 将bidirectional设置为True以获取双向循环神经网络self.encoder nn.LSTM(embed_size, num_hiddens, num_layersnum_layers,bidirectionalTrue)self.decoder nn.Linear(4 * num_hiddens, 2)def forward(self, inputs):# inputs的形状是批量大小时间步数# 因为长短期记忆网络要求其输入的第一个维度是时间维# 所以在获得词元表示之前输入会被转置。# 输出形状为时间步数批量大小词向量维度embeddings self.embedding(inputs.T)self.encoder.flatten_parameters()# 返回上一个隐藏层在不同时间步的隐状态# outputs的形状是时间步数批量大小2*隐藏单元数outputs, _ self.encoder(embeddings)# 连结初始和最终时间步的隐状态作为全连接层的输入# 其形状为批量大小4*隐藏单元数encoding torch.cat((outputs[0], outputs[-1]), dim1)outs self.decoder(encoding)return outs让我们构造一个具有两个隐藏层的双向循环神经网络来表示单个文本以进行情感分析。
embed_size, num_hiddens, num_layers 100, 100, 2
devices d2l.try_all_gpus()
net BiRNN(len(vocab), embed_size, num_hiddens, num_layers)def init_weights(m):if type(m) nn.Linear:nn.init.xavier_uniform_(m.weight)if type(m) nn.LSTM:for param in m._flat_weights_names:if weight in param:nn.init.xavier_uniform_(m._parameters[param])
net.apply(init_weights)加载预训练的词向量
下面我们为词表中的单词加载预训练的100维要与embed_size一致的GloVe嵌入。我们使用这些预训练的词向量来表示评论中的词元并且在训练期间不要更新这些向量。
glove_embedding d2l.TokenEmbedding(glove.6b.100d)
embeds glove_embedding[vocab.idx_to_token]
net.embedding.weight.data.copy_(embeds)
net.embedding.weight.requires_grad False训练和评估模型
现在我们可以训练双向循环神经网络进行情感分析。使用Adam优化算法。
lr, num_epochs 0.01, 5
trainer torch.optim.Adam(net.parameters(), lrlr)
loss nn.CrossEntropyLoss(reductionnone)
d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs,devices)
d2l.plt.show()运行结果 loss 0.300, train acc 0.875, test acc 0.818 79.4 examples/sec on [device(type‘cpu’)] 运行图片 接着我们定义一下函数来使用训练好的模型net预测文本序列的情感。
#save
def predict_sentiment(net, vocab, sequence):预测文本序列的情感sequence torch.tensor(vocab[sequence.split()], deviced2l.try_gpu())label torch.argmax(net(sequence.reshape(1, -1)), dim1)return positive if label 1 else negative最后让我们使用训练好的模型对两个简单的句子进行情感预测。
predict_sentiment(net, vocab, this movie is so great)运行结果 ‘positive’ predict_sentiment(net, vocab, this movie is so bad)运行结果 ‘negative’ 小结
1、预训练的词向量可以表示文本序列中的各个词元。 2、双向循环神经网络可以表示文本序列。例如通过连结初始和最终时间步的隐状态可以使用全连接的层将该单个文本表示转换为类别。