苏州做网站要多少钱,网站开发用什么,银川网站建设银川,东莞 网站推广Mindspore框架循环神经网络RNN模型实现情感分类
Mindspore框架循环神经网络RNN模型实现情感分类|#xff08;一#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|#xff08;二#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…Mindspore框架循环神经网络RNN模型实现情感分类
Mindspore框架循环神经网络RNN模型实现情感分类|一IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|二预训练词向量 Mindspore框架循环神经网络RNN模型实现情感分类|三RNN模型构建 Mindspore框架循环神经网络RNN模型实现情感分类|四损失函数与优化器 Mindspore框架循环神经网络RNN模型实现情感分类|五模型训练 Mindspore框架循环神经网络RNN模型实现情感分类|六模型加载和推理情感分类模型资源下载 Mindspore框架循环神经网络RNN模型实现情感分类|七模型导出ONNX与应用部署
tips:安装依赖库
pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14
pip install tqdm requests一、RNN模型构建
数据集准备完成了输入文本通过查字典序列化的向量化。并使用nn.Embedding层加载了Glove词向量。下一步将使用RNN循环神经网络做特征提取最后将RNN连接至全连接网络nn.Dednse将特征转化为分类。
nn.Embedding - nn.RNN - nn.Dense本项目采用规避RNN梯度消的变种LSTM(Long short-term memory)代替RNN做特征提取层。
1.1 关于RNN
循环神经网络Recurrent Neural Network, RNN是一类以序列sequence数据为输入在序列的演进方向进行递归recursion且所有节点循环单元按链式连接的神经网络。下图为RNN的一般结构 图示左侧为一个RNN Cell循环右侧为RNN的链式连接平铺。实际上不管是单个RNN Cell还是一个RNN网络都只有一个Cell的参数在不断进行循环计算中更新。 由于RNN的循环特性和自然语言文本的序列特性(句子是由单词组成的序列)十分匹配因此被大量应用于自然语言处理研究中。下图为RNN的结构拆解 1.2 关于LSTM(Long short-term memory)
RNN单个Cell的结构简单因此也造成了梯度消失(Gradient Vanishing)问题具体表现为RNN网络在序列较长时在序列尾部已经基本丢失了序列首部的信息。为了克服这一问题LSTM(Long short-term memory)被提出通过门控机制(Gating Mechanism)来控制信息流在每个循环步中的留存和丢弃。下图为LSTM的结构拆解 本项目选择LSTM变种而不是经典的RNN做特征提取可规避梯度消失问题并获得更好的模型效果。 在MindSpore中nn.LSTM对应的公式 h 0 : t , ( h t , c t ) LSTM ( x 0 : t , ( h 0 , c 0 ) ) h_{0:t}, (h_t, c_t) \text{LSTM}(x_{0:t}, (h_0, c_0)) h0:t,(ht,ct)LSTM(x0:t,(h0,c0))
这里nn.LSTM隐藏了整个循环神经网络在序列时间步(Time step)上的循环送入输入序列、初始状态即可获得每个时间步的隐状态(hidden state)拼接而成的矩阵以及最后一个时间步对应的隐状态。我们使用最后的一个时间步的隐状态作为输入句子的编码特征送入下一层。 Time step在循环神经网络计算的每一次循环成为一个Time step。在送入文本序列时一个Time step对应一个单词。因此在本例中LSTM的输出 h 0 : t h_{0:t} h0:t对应每个单词的隐状态集合 h t h_t ht和 c t c_t ct对应最后一个单词对应的隐状态。 下一层全连接层即nn.Dense将特征维度变换为二分类所需的维度1经过Dense层后的输出即为模型预测结果。
1.3 特征提取网络构建
RNN循环神经网络: nn.LSTM() 初始化参数 embeddings:输入向量,hidden_dim:隐藏层特征的维度, output_dim输出维数, n_layersRNN 层的数量,bidirectional:是否为双向 RNN, pad_idx:padding_idx参数用于标记输入中的填充值padding value。在自然语言处理任务中文本序列的长度不一致是非常常见的。为了能够对不同长度的文本序列进行批处理我们通常会使用填充值对较短的序列进行填补。tips:使用nn.embeddings()创建嵌入层时可以通过padding_idx参数指定一个特定的索引用于表示填充值。 embedding_layer nn.Embedding(num_embeddings, embedding_dim, padding_idx0),将padding_idx设置为0表示使用索引为0的词汇作为填充值。在文本序列中我们将使用0来填充较短的序列。
import math
import mindspore as ms
import mindspore.nn as nn
import mindspore.ops as ops
from mindspore.common.initializer import Uniform, HeUniformclass RNN(nn.Cell):def __init__(self, embeddings, hidden_dim, output_dim, n_layers,bidirectional, pad_idx):super().__init__()vocab_size, embedding_dim embeddings.shapeself.embedding nn.Embedding(vocab_size, embedding_dim, embedding_tablems.Tensor(embeddings), padding_idxpad_idx)self.rnn nn.LSTM(embedding_dim,hidden_dim,num_layersn_layers,bidirectionalbidirectional,batch_firstTrue)weight_init HeUniform(math.sqrt(5))bias_init Uniform(1 / math.sqrt(hidden_dim * 2))self.fc nn.Dense(hidden_dim * 2, output_dim, weight_initweight_init, bias_initbias_init)def construct(self, inputs):embedded self.embedding(inputs)_, (hidden, _) self.rnn(embedded)hidden ops.concat((hidden[-2, :, :], hidden[-1, :, :]), axis1)output self.fc(hidden)return output实例化模型打印输出
hidden_size 256
output_size 1
num_layers 2
bidirectional True
lr 0.001
pad_idx vocab.tokens_to_ids(pad)model RNN(embeddings, hidden_size, output_size, num_layers, bidirectional, pad_idx)
print(model)