昇思25天学习打卡营第24天|基于MindSpore通过GPT实现情感分类

今天学习了《基于MindSpore通过GPT实现情感分类》相关内容,这章节内容比较少,主要代码如下:

安装实验环境:

python 复制代码
%%capture captured_output
# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14

安装mindnlp和jieba

python 复制代码
# 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行`!pip install mindnlp==0.3.1`
!pip install mindnlp
!pip install jieba
%env HF_ENDPOINT=https://hf-mirror.com`

jieba是一个优秀的中文分词第三方库,主要用于Python编程语言中。 它能够帮助用户将中文文本切割成单个的词语,这对于自然语言处理和文本分析尤为重要。jieba库提供了多种分词模式,使得用户可以根据不同的需求选择合适的分词方式。此外,jieba库还支持词频统计、词云图生成以及构建对象等功能,是处理中文文本的一个强大工具。‌

python 复制代码
import os

import mindspore
from mindspore.dataset import text, GeneratorDataset, transforms
from mindspore import nn

from mindnlp.dataset import load_dataset

from mindnlp._legacy.engine import Trainer, Evaluator
from mindnlp._legacy.engine.callbacks import CheckpointCallback, BestModelCallback
from mindnlp._legacy.metrics import Accuracy

导入 mindspore 、mindnlp等框架和库

python 复制代码
imdb_ds = load_dataset('imdb', split=['train', 'test'])
imdb_train = imdb_ds['train']
imdb_test = imdb_ds['test']

导入数据

python 复制代码
imdb_train.get_dataset_size()

运行后输出:25000

python 复制代码
import numpy as np

def process_dataset(dataset, tokenizer, max_seq_len=512, batch_size=4, shuffle=False):
    is_ascend = mindspore.get_context('device_target') == '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']

    if shuffle:
        dataset = dataset.shuffle(batch_size)

    # map dataset
    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")
    # batch dataset
    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
python 复制代码
from mindnlp.transformers import GPTTokenizer
# tokenizer
gpt_tokenizer = GPTTokenizer.from_pretrained('openai-gpt')

# add sepcial token: <PAD>
special_tokens_dict = {
    "bos_token": "<bos>",
    "eos_token": "<eos>",
    "pad_token": "<pad>",
}
num_added_toks = gpt_tokenizer.add_special_tokens(special_tokens_dict)
python 复制代码
# split train dataset into train and valid datasets
imdb_train, imdb_val = imdb_train.split([0.7, 0.3])
python 复制代码
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)
python 复制代码
next(dataset_train.create_tuple_iterator())

运行后输出:

Tensor(shape=\[4, 512\], dtype=Int64, value= \[\[ 11, 250, 15 ... 3, 242, 3\], \[ 5, 23, 5 ... 40480, 40480, 40480\], \[ 14, 3, 5 ... 243, 8, 18073\], \[ 7, 250, 3 ... 40480, 40480, 40480\]\]), Tensor(shape=\[4, 512\], dtype=Int64, value= \[\[1, 1, 1 ... 1, 1, 1\], \[1, 1, 1 ... 0, 0, 0\], \[1, 1, 1 ... 1, 1, 1\], \[1, 1, 1 ... 0, 0, 0\]\]), Tensor(shape=\[4\], dtype=Int32, value= \[0, 1, 0, 1\])

python 复制代码
在这里插入代码片
python 复制代码
from mindnlp.transformers import GPTForSequenceClassification
from mindspore.experimental.optim import Adam

# set bert config and define parameters for training
model = GPTForSequenceClassification.from_pretrained('openai-gpt', num_labels=2)
model.config.pad_token_id = gpt_tokenizer.pad_token_id
model.resize_token_embeddings(model.config.vocab_size + 3)

optimizer = nn.Adam(model.trainable_params(), learning_rate=2e-5)

metric = Accuracy()

# define callbacks to save checkpoints
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)
python 复制代码
trainer.run(tgt_columns="labels")
python 复制代码
evaluator = Evaluator(network=model, eval_dataset=dataset_test, metrics=metric)
evaluator.run(tgt_columns="labels")
相关推荐
Xudde.2 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
晓晓hh3 小时前
JavaSE学习——迭代器
java·开发语言·学习
lijianhua_97123 小时前
国内某顶级大学内部用的ai自动生成论文的提示词
人工智能
EDPJ3 小时前
当图像与文本 “各说各话” —— CLIP 中的模态鸿沟与对象偏向
深度学习·计算机视觉
蔡俊锋3 小时前
用AI实现乐高式大型可插拔系统的技术方案
人工智能·ai工程·ai原子能力·ai乐高工程
自然语3 小时前
人工智能之数字生命 认知架构白皮书 第7章
人工智能·架构
大熊背3 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
eastyuxiao4 小时前
如何在不同的机器上运行多个OpenClaw实例?
人工智能·git·架构·github·php
421!4 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
诸葛务农4 小时前
AGI 主要技术路径及核心技术:归一融合及未来之路5
大数据·人工智能