基于MindSpore通过GPT实现情感分类
【代码】基于MindSpore通过GPT实现情感分类。
·
# 基于MindSpore通过GPT实现情感分类
# 捕获输出信息
%%capture captured_output
# 卸载当前版本的mindspore并安装指定版本
!pip uninstall mindspore -y # 卸载已有的mindspore
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14 # 安装指定版本的mindspore
# 安装mindnlp和jieba库
!pip install mindnlp # 安装mindnlp库
!pip install jieba # 安装jieba用于中文分词
%env HF_ENDPOINT=https://hf-mirror.com # 设置环境变量
# 导入必要的库
import os
import mindspore # 导入mindspore库
from mindspore.dataset import text, GeneratorDataset, transforms # 导入数据集相关模块
from mindspore import nn # 导入神经网络模块
from mindnlp.dataset import load_dataset # 导入mindnlp的数据集加载函数
from mindnlp._legacy.engine import Trainer, Evaluator # 导入训练和评估类
from mindnlp._legacy.engine.callbacks import CheckpointCallback, BestModelCallback # 导入回调函数类
from mindnlp._legacy.metrics import Accuracy # 导入准确率指标
# 加载IMDB情感分类数据集
imdb_ds = load_dataset('imdb', split=['train', 'test']) # 加载IMDB数据集
imdb_train = imdb_ds['train'] # 训练集
imdb_test = imdb_ds['test'] # 测试集
imdb_train.get_dataset_size() # 获取训练集大小
import numpy as np # 导入numpy库
# 数据集处理函数
def process_dataset(dataset, tokenizer, max_seq_len=512, batch_size=4, shuffle=False):
is_ascend = mindspore.get_context('device_target') == 'Ascend' # 判断设备是否为Ascend
# 定义分词函数
def tokenize(text):
if is_ascend:
tokenized = tokenizer(text, padding='max_length', truncation=True, max_length=max_seq_len) # 对文本进行分词并填充
else:
tokenized = tokenizer(text, truncation=True, max_length=max_seq_len) # 对文本进行分词
return tokenized['input_ids'], tokenized['attention_mask'] # 返回输入ID和注意力掩码
if shuffle:
dataset = dataset.shuffle(batch_size) # 打乱数据集
# 映射数据集
dataset = dataset.map(operations=[tokenize], input_columns="text", output_columns=['input_ids', 'attention_mask']) # 对文本进行分词
dataset = dataset.map(operations=transforms.TypeCast(mindspore.int32), input_columns="label", output_columns="labels") # 转换标签类型
# 批量处理数据集
if is_ascend:
dataset = dataset.batch(batch_size) # 对数据集进行批量处理
else:
dataset = dataset.padded_batch(batch_size, pad_info={'input_ids': (None, tokenizer.pad_token_id), # 填充批次
'attention_mask': (None, 0)})
return dataset # 返回处理后的数据集
from mindnlp.transformers import GPTTokenizer # 导入GPT分词器
# 初始化分词器
gpt_tokenizer = GPTTokenizer.from_pretrained('openai-gpt') # 从预训练模型加载分词器
# 添加特殊token
special_tokens_dict = {
"bos_token": "<bos>", # 开始标记
"eos_token": "<eos>", # 结束标记
"pad_token": "<pad>", # 填充标记
}
num_added_toks = gpt_tokenizer.add_special_tokens(special_tokens_dict) # 添加特殊token到分词器
# 将训练集分为训练集和验证集
imdb_train, imdb_val = imdb_train.split([0.7, 0.3]) # 分割训练集为训练和验证集
dataset_train = process_dataset(imdb_train, gpt_tokenizer, shuffle=True) # 处理训练集
dataset_val = process_dataset(imdb_val, gpt_tokenizer) # 处理验证集
dataset_test = process_dataset(imdb_test, gpt_tokenizer) # 处理测试集
next(dataset_train.create_tuple_iterator()) # 获取训练集的一个批次
from mindnlp.transformers import GPTForSequenceClassification # 导入GPT序列分类模型
from mindspore.experimental.optim import Adam # 导入Adam优化器
# 设置模型配置并定义训练参数
model = GPTForSequenceClassification.from_pretrained('openai-gpt', num_labels=2) # 加载GPT分类模型
model.config.pad_token_id = gpt_tokenizer.pad_token_id # 设置填充token ID
model.resize_token_embeddings(model.config.vocab_size + 3) # 调整词汇表大小以包含特殊token
optimizer = nn.Adam(model.trainable_params(), learning_rate=2e-5) # 定义优化器
metric = Accuracy() # 定义准确率指标
# 定义回调以保存模型检查点
ckpoint_cb = CheckpointCallback(save_path='checkpoint', ckpt_name='gpt_imdb_finetune', epochs=1, keep_checkpoint_max=2) # 检查点回调
best_model_cb = BestModelCallback(save_path='checkpoint', ckpt_name='gpt_imdb_finetune_best', auto_load=True) # 最佳模型回调
# 初始化训练器
trainer = Trainer(network=model, train_dataset=dataset_train,
eval_dataset=dataset_train, metrics=metric,
epochs=1, optimizer=optimizer, callbacks=[ckpoint_cb, best_model_cb],
jit=False) # 创建训练器
trainer.run(tgt_columns="labels") # 运行训练
# 初始化评估器
evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric) # 创建评估器
evaluator.run(tgt_columns="labels") # 运行评估
代码解析
- 环境设置与库的安装:
- 卸载已有的
mindspore版本并安装指定的2.2.14版本。 - 安装
mindnlp和jieba等必要的库。
- 卸载已有的
- 数据集加载:
- 使用
load_dataset函数从mindnlp加载 IMDB 数据集,并分别获取训练集和测试集。
- 使用
- 数据预处理:
process_dataset函数用于分词、标签转换和批量处理,最终返回可以用于训练的数据集。
- 分词器配置:
- 使用
GPTTokenizer从预训练模型加载分词器,并添加特殊的开始、结束和填充标记。
- 使用
- 数据集划分:
- 将训练集划分为训练集和验证集,并使用处理函数进行处理。
- 模型和优化器定义:
- 加载基于GPT的序列分类模型,并定义Adam优化器和准确率指标。
- 训练与评估:
- 使用
Trainer类进行模型训练,并使用Evaluator类在测试集上进行评估。设置了检查点回调函数以保存模型状态。
- 使用
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)