《昇思 25 天学习打卡营第 22 天 | 使用 RNN 进行情感分类 》
活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp
签名:Sam9029
情感分类任务概述
情感分类是自然语言处理中的一项基础任务,目的是判断文本所表达的情感倾向,如正面或负面。
实验环境配置
确保安装了 MindSpore 框架,用于模型的构建和训练。
!pip install mindspore==2.2.14 -i https://pypi.mirrors.ustc.edu.cn/simple
数据准备
使用 IMDB 影评数据集,它包含正面和负面两类评论。
数据下载模块
设计数据下载模块,使用requests
和tqdm
库实现数据的可视化下载。
def http_get(url: str, temp_file: IO):
# 使用requests库下载数据,并使用tqdm库进行流程可视化
# ...
def download(file_name: str, url: str):
# 下载数据并存为指定名称
# ...
IMDB 数据集加载
使用tarfile
库读取数据集,并使用mindspore.dataset.GeneratorDataset
进行数据加载。
class IMDBData():
# IMDB数据集加载器
# ...
imdb_train, imdb_test = load_imdb(imdb_path)
预训练词向量加载
加载 Glove 词向量,作为模型的 Embedding 层。
def load_glove(glove_path):
# 加载Glove词向量
# ...
vocab, embeddings = load_glove(glove_path)
数据预处理
对文本进行 Token 化、索引化,并使用mindspore.dataset
提供的接口进行数据预处理。
lookup_op = ds.text.Lookup(vocab, unknown_token='')
pad_op = ds.transforms.PadEnd([500], pad_value=vocab.tokens_to_ids(''))
type_cast_op = ds.transforms.TypeCast(ms.float32)
imdb_train = imdb_train.map(operations=[lookup_op, pad_op], input_columns=['text'])
imdb_train = imdb_train.map(operations=[type_cast_op], input_columns=['label'])
模型构建
设计情感分类模型,使用nn.Embedding
、nn.LSTM
和nn.Dense
层。
class RNN(nn.Cell):
def init(self, embeddings, hidden_dim, output_dim, n_layers, bidirectional, pad_idx):
# 模型初始化
# ...
def construct(self, inputs):
# 前向传播
# ...
训练与评估
设计训练和评估逻辑,使用nn.BCEWithLogitsLoss
作为损失函数,nn.Adam
作为优化器。
def train_step(data, label):
# 单步训练逻辑
# ...
def evaluate(model, test_dataset, criterion, epoch=0):
# 评估模型性能
# ...
模型训练与保存
进行模型训练,并在每个 epoch 后评估模型在验证集上的性能,保存最优模型。
for epoch in range(num_epochs):
# 训练和评估
# ...
if valid_loss < best_valid_loss:
# 保存模型
# ...
模型加载与测试
加载训练好的模型,对测试集进行评估。
param_dict = ms.load_checkpoint(ckpt_file_name)
ms.load_param_into_net(model, param_dict)
evaluate(model, imdb_test, loss_fn)
自定义输入测试
设计预测函数,对自定义输入文本进行情感分类预测。
def predict_sentiment(model, vocab, sentence):
# 预测文本情感
# ...
思考
在实现情感分类模型时,选择合适的预训练词向量对模型性能至关重要。Glove 词向量因其捕捉了丰富的语义信息而被广泛使用。
模型结构的选择也对结果有显著影响。LSTM 因其门控机制有效地解决了传统 RNN 的梯度消失问题,使得模型能够更好地处理长序列数据。此外,模型的训练和评估过程中,损失函数和优化器的选择对模型的收敛速度和最终性能有直接影响。本例中选用的损失函数和优化器在情感分类任务上表现良好,但针对不同任务可能需要进一步调整。