当前位置: 首页 > article >正文

bert微调下游任务-情感分析

文章目录

    • 背景
    • 前置准备
    • 步骤
    • tokenizer都做了啥
    • 参考

背景

使用bert进行微调,本篇文章的任务是情感分析

前置准备

# 下载相关包
pip install datasets # 我的版本是3.2.0
pip install accelerate  # 1.2.1

步骤

from transformers import BertForSequenceClassification, BertTokenizerFast,Trainer, TrainingArguments
from datasets import load_dataset
import torch
import numpy as np

# 1. 加载数据集
dataset = load_dataset('imdb')
print(dataset)
# 输出如下
'''
DatasetDict({
    train: Dataset({
        features: ['label', 'text'],
        num_rows: 25000
    })
    test: Dataset({
        features: ['label', 'text'],
        num_rows: 25000
    })
    unsupervised: Dataset({
        features: ['label', 'text'],
        num_rows: 50000
    })
})
'''

# 2. 创建训练集和测试集
train_set = dataset['train']
test_set = dataset['test']

# 3. 下载并加载预训练bert-base-un-cased模型和词元分析器。
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
# 这里使用了BertTokenizerFast类创建词元分析器,而不是使用BertTokenizer。与BertTokenizer相比,BertTokenizerFast类有很多优点。
tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased')

'''
出现以下提示,这是正常的,因为BertForSequenceClassification模型包含一个额外的分类层,用于将输出转换为分类标签。这个额外的层被随机初始化了。

Some weights of BertForSequenceClassification were not initialized from the model checkpoint at bert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight']
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
'''
# 4. 对训练集和测试集进行预处理,tokenizer这个函数的原理可以参考最后
def preprocess(data):    
    return tokenizer(data['text'], padding = True, truncation = True, max_length=512)
## 使用preprocess函数对训练集和测试集进行预处理。
batch_size = 512
train_set = train_set.map(preprocess, batched = True, batch_size = batch_size)
test_set = test_set.map(preprocess, batched = True, batch_size = batch_size)
## 接下来,使用set_format函数,选择数据集中需要的列及其对应的格式,如下所示。
train_set.set_format('torch', columns = ['input_ids', 'attention_mask', 'label'])
test_set.set_format('torch', columns = ['input_ids', 'attention_mask', 'label'])

# 5.训练模型
epochs = 2
warmup_steps = 10
weight_decay = 0.01
training_args = TrainingArguments(output_dir = './results',   
 num_train_epochs = epochs,    
 per_device_train_batch_size = batch_size,    
 per_device_eval_batch_size = batch_size,    
 warmup_steps = warmup_steps,    
 weight_decay = weight_decay,    
 logging_dir = './logs',)
trainer = Trainer(model = model, args = training_args, train_dataset = train_set, eval_dataset = test_set)
trainer.train()

# 6.训练结束后,可以使用evaluate函数来评估模型
trainer.evaluate()

tokenizer都做了啥

# 预处理数据集我们以句子I love Paris为例,使用词元分析器对数据集进行快速预处理。首先,对例句进行标记,在句首添加[CLS]标记,在句尾添加[SEP]标记,如下所示。
tokens = [ '[CLS]', 'I', 'love', 'Paris', '[SEP]' ]
# 接下来,将标记映射到唯一的输入ID(标记ID)。假设输入ID如下所示。
input_ids = [101, 1045, 2293, 3000, 102]
# 然后,添加分段ID(标记类型ID)。假设输入中有两个句子,分段ID可以用来区分这两个句子。第1句中的所有标记被映射为0,第2句中的所有标记被映射为1。在这里,我们只有一个句子,因此所有的标记都会被映射为0,如下所示。
token_type_ids = [0, 0, 0, 0, 0]
# 现在创建注意力掩码。我们知道注意力掩码是用来区分实际标记和[PAD]标记的,它把所有实际标记映射为1,把[PAD]标记映射为0。假设标记长度为5,因为标记列表已经有5个标记,所以不必添加[PAD]标记。在本例中,注意力掩码如下所示。
attention_mask = [1, 1, 1, 1, 1]

# !!!不过,我们无须手动执行上述所有步骤,词元分析器会为我们完成这些步骤。我们只需将例句传递给词元分析器,如下所示。
tokenizer('I love Paris')

# 上面的代码将返回以下内容。可以看到,输入句已被标记,并被映射到input_ids、token_type_ids和attention_mask。
{'input_ids': [101, 1045, 2293, 3000, 102],
 'token_type_ids': [0, 0, 0, 0, 0],
 'attention_mask': [1, 1, 1, 1, 1]}

# 通过词元分析器,还可以输入任意数量的句子,并动态地进行补长或填充。要实现动态补长或填充,需要将padding设置为True,同时设置最大序列长度。假设输入3个句子,并将最大序列长度max_length设置为5,如下所示。
tokenizer(['I love Paris', 'birds fly', 'snow fall'], padding = True, max_length = 5)
# 上面的代码将返回以下内容。可以看到,所有的句子都被映射到input_ids、token_type_ids和attention_mask。第2句和第3句只有两个标记,加上[CLS]和[SEP]后,有4个标记。由于将padding设置为True,并将max_length设置为5,因此在第2句和第3句中添加了一个额外的[PAD]标记。这就是在第2句和第3句的注意力掩码中出现0的原因。
{
 'input_ids': [[101, 1045, 2293, 3000, 102], 
               [101, 5055, 4875, 102, 0],
               [101, 4586, 2991, 102, 0]],
 'token_type_ids': [[0, 0, 0, 0, 0], 
                    [1, 1, 1, 1, 1], 
                    [0, 0, 0, 0, 0]], 
 'attention_mask': [[1, 1, 1, 1, 1], 
                    [1, 1, 1, 1, 0], 
                    [1, 1, 1, 1, 0]]
 }

参考

BertTokenizer和BertTokenizerFast的对比


http://www.kler.cn/a/501743.html

相关文章:

  • 该虚拟机似乎正在使用中。 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。
  • 一学就废|Python基础碎片,OS模块
  • React中ElementFiber对象、WorkInProgress双缓存、ReconcileRenderCommit、第一次挂载过程详解
  • HTML中meta的用法
  • ComfyUI的API使用教程
  • 构造函数的原型原型链
  • WRF模式与Python融合技术在多领域中的应用及精美绘图;Python助力WRF自动化运行、WRF模式前后处理等
  • 达梦8-DMSQL程序设计学习笔记1-DMSQL程序简介
  • ASP.NET Core 中,Cookie 认证在集群环境下的应用
  • c# 和python封装起保停
  • 功能篇:mybatis中实现缓存
  • JSON头文件调用
  • Fastapi0.115.6之Tortoise ORM0.23.0基本增删改查大全【亲测可用,仅供参考】
  • AIDD-人工智能药物设计-通过组合生物合成产生新的类似物的抗真菌费尔南型三萜多聚类素的生物合成表征
  • AI多模态论文解读:LLaVA-CoT:让视觉语言模型逐步推理
  • uni-app持久化登录简单实现
  • 八、系统托盘与配置面板
  • springmvc前端传参,后端接收
  • StarRocks Awards 2024 年度贡献人物
  • 《解锁鸿蒙系统AI能力,开启智能应用开发新时代》
  • 【GoLand】无法debug 无法运行
  • 【Orca】Orca - Graphlet 和 Orbit 计数算法
  • 《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》
  • mysql-行溢出处理原理
  • 【HTML+CSS+JS+VUE】web前端教程-21-字体属性
  • 智能化文档开发(DI)