热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

transformer库使用

Transformer库简介是一个开源库,其提供所有的预测训练模型,都是基于transformer模型结构的。Transformer库我们可以使用


Transformer库简介

是一个开源库,其提供所有的预测训练模型,都是基于transformer模型结构的。


Transformer库

我们可以使用 Transformers 库提供的 API 轻松下载和训练最先进的预训练模型。使用预训练模型可以降低计算成本,以及节省从头开始训练模型的时间。这些模型可用于不同模态的任务,


  • 文本:文本分类、信息抽取、问答系统、文本摘要、机器翻译和文本生成。
  • 图像:图像分类、目标检测和图像分割。
  • 音频:语音识别和音频分类。
  • 多模态:表格问答系统、OCR、扫描文档信息抽取、视频分类和视觉问答。
    Transformer库支持最流行的深度学习库,




    p


    y


    T


    o


    r


    c


    h


    t


    e


    n


    s


    o


    r


    f


    l


    o


    w


    J


    A


    X



    pyTorch tensorflow JAX


    pyTorchtensorflowJAX

    相关资源对应网站如下:
    在这里插入图片描述

Transformer库支持的模型和架构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:Tokenizer slow:使用 Python 实现 tokenization 过程。Tokenizer fast:基于 Rust 库 Tokenizers 进行实现


Pipeline

pipeline() 作用就是使用预训练模型进行推断,它支持从这里下载所有模型


pipeline() 支持的任务类型


支持许多常见任务


  • 文本
    • 情感分析
    • 文本生成
    • 命名实体识别
    • 问答系统
    • 掩码恢复
    • 文本摘要
    • 机器翻译
    • 特征提取
  • 图像
    • 图像分类
    • 图像分割
    • 目标检测
  • 音频
    • 音频分类
    • 自动语音识别(ASR)
      注意:可以在 Transformers 库的源码(查看 Transformers/pipelines/init.py 中的 SUPPORTED_TASKS 定义)中查看其支持的任务,不同版本支持的类型会存在差异

pipeline使用

简单的使用

当我们需要进行一个情感分类任务时,我们可以直接使用如下代码:

from transformers import pipeline
classifier = pipeline("sentiment-analysis")
result = classifier("We are very happy to show you the 🤗 Transformers library.")
print(result)
将输出以下结果



将输出以下结果:

[{'label': 'POSITIVE', 'score': 0.9997795224189758}]

上面的代码中




p


i


p


e


l


i


n


e


(


"


s


e


n


t


i


m


e


n


t





a


n


a


l


y


s


i


s


"


)



pipeline("sentiment-analysis")


pipeline("sentimentanalysis")
下载并缓存一个默认的情感分析预测训练模型和加载对应的




t


o


k


e


n


i


z


e


r



tokenizer


tokenizer
,针对不同类型的任务,对应的参数名称可以查看pipelilne参数taskj的说明,不同类型的任务所下载的默认预训练模型可以在Transformer中的源码(查看 Transformers/pipelines/init.py 中的 SUPPORTED_TASKS 定义)中查看

当我们需要一次性推理多个句子时候,可以使用list形式作为参数传入:

from transformers import pipeline
classifier = pipeline("sentiment-analysis")
results = classifier(["We are very happy to show you the 🤗 Transformers library.",
"We hope you don't hate it."])
print(results)

将输出以下结果:

[{'label': 'POSITIVE', 'score': 0.9997795224189758},
{'label': 'NEGATIVE', 'score': 0.5308570265769958}]

选择模型

上面部分,在进行推理时**,使用的是对应任务的默认模型。但是有时候我们希望使用指定的模型**,可以通过指定 pipeline() 的参数 model 来实现
  第一种方法

from transformers import pipeline
classifier = pipeline("sentiment-analysis",
model="IDEA-CCNL/Erlangshen-Roberta-110M-Sentiment")
result = classifier("今天心情很好")
print(result)

将输出以下结果:

[{'label': 'Positive', 'score': 0.9374911785125732}]

第二种方法:(和上面的方法,加载的是相同的模型。不过这种方法可以使用本地模型进行推理。)


预测训练模型


预训练tokenizer

from transformers import AutoModelForSequenceClassification
from transformers import AutoTokenizer
from transformers import pipeline
model_path = r"../pretrained_model/IDEA-CCNL(Erlangshen-Roberta-110M-Sentiment)"
model = AutoModelForSequenceClassification.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
result = classifier("今天心情很好")
print(result)

将输出以下结果:

[{‘label’: ‘Positive’, ‘score’: 0.9374911785125732}]

``

总结:上面部分介绍了使用 pipeline() 对文本分类任务的推断的方法。针对文本其他类型任务、图像和音频的任务,使用方法基本一致,详细可参照 这里。


加载模型

我们将介绍加载模型的一些方法:


随机初始化模型权值


使用预训练权值初始化模型权值


预处理

模型本身无法理解原始文本,图像或者音频的,所以需要先将数据转换成模型可以接受的形式,然后再传入模型中。


NLP Auto Tokenizer

处理文本数据的主要工具是




t


o


k


e


n


i


z


e


r



tokenizer


tokenizer
,首先




t


o


k


e


n


i


z


e


r



tokenizer


tokenizer
会根据一组规则将文本拆分成token,然后将这些token转换成数值(根据词表,即 vocab),这些数值会被构建成张量并作为模型的输入,模型所需要的其他输入也是有




t


o


k


e


n


i


z


e


r



tokenizer


tokenizer
添加的

当我们使用预训练模型时候,一定要使用对应的预训练




t


o


k


e


n


i


z


e


r



tokenizer


tokenizer
,只有这样,才能确保文本以预训练语料库相同的方式进行切割,并使用相同对应的索引




t


o


k


e


n



token


token
索引,即




V


o


c


a


b



Vocab


Vocab


Tokenizer

使用 AutoTokenizer.from_pretrained() 加载一个预训练 tokenizer,并将文本传入 tokenizer:

from transformers import AutoTokenizer
model_path = r"../pretrained_model/IDEA-CCNL(Erlangshen-Roberta-110M-Sentiment)"
tokenizer = AutoTokenizer.from_pretrained(model_path)
encoded_input = tokenizer("今天心情很好")
prin**加粗样式**t(encoded_input)
**加粗样式**

并输出以下结果:

{'input_ids': [101, 791, 1921, 1921, 3698, 4696, 1962, 102],
'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0],
'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1]}

可以看到上面输出包含三个部分:


  • input_ids:对应于句子中每个 token 的索引。
  • token_type_ids:当存在多个序列时,标识 token 属于那个序列
  • attention_mask:表明对应的 token 是否需要被注意(1 表示需要被注意,0 表示不需要被注意。涉及到注意力机制)
    我们还可以i使用




    t


    o


    k


    e


    n


    i


    z


    e


    r



    tokenizer


    tokenizer
    将 input_ids 解码为原始输入:

decoded_input = tokenizer.decode(encoded_input["input_ids"])
print(decoded_input)

将输出以下结果:

[CLS] 今 天 天 气 真 好 [SEP]

我们可以看到上面的输出,相比原始文本多了 [CLS] 和 [SEP],它们是在 BERT 等模型中添加一些特殊 token
  如果需要同时处理多个句子,可以将多个文本以list形式输入到




t


o


k


e


n


i


z


e


r



tokenizer


tokenizer
中。


填充 Pad

当我们处理一批句子时,它的长度并不总是相同的,但是模型的输入需要具有统一的形状




s


h


a


p


e



shape


shape
,填充是实现此需求的一种策略,即为 token 较少的句子添加特殊的填充 token
给 tokenizer() 传入参数 padding=True:

batch_sentences = ["今天天气真好",
"今天天气真好,适合出游"]
encoded_inputs = tokenizer(batch_sentences, padding=True)
print(encoded_inputs)

将输出以下结果:

{'input_ids':
[[101, 791, 1921, 1921, 3698, 4696, 1962, 102, 0, 0, 0, 0, 0],
[101, 791, 1921, 1921, 3698, 4696, 1962, 8024, 6844, 1394, 1139, 3952, 102]], 'token_type_ids':
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
'attention_mask':
[[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]}

可以看到 tokenizer 使用 0 对第一个句子进行了一些填充。


截断(Truncation)

当句子太短时候,可以采用填充策略,但是有时候,句子可能太长,模型无法处理,在这种情况下,可以将句子进行截断。
给 tokenizer() 传入参数 truncation=True 即可实现
   如果想了解 tokenizer() 中更多关于参数 padding 和 truncation 的信息,可以参照 这里


构建张量(Build tensors)

最终,如果我们想要 tokenizer 返回传入模型中的实际张量。需要设置参数 return_tensors。如果是传入 PyTorch 模型,将其设置为 pt;如果是传入 TensorFlow 模型,将其设置为 tf

batch_sentences = ["今天天气真好",
"今天天气真好,适合出游"]
encoded_inputs = tokenizer(batch_sentences,
padding=True, truncation=True,
return_tensors="pt")
print(encoded_inputs)

将输出以下结果:

{'input_ids':
tensor([[ 101, 791, 1921, 1921, 3698, 4696, 1962, 102, 0, 0, 0, 0,
0],
[ 101, 791, 1921, 1921, 3698, 4696, 1962, 8024, 6844, 1394, 1139, 3952,
102]]),
'token_type_ids':
tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]),
'attention_mask':
tensor([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}

其他

针对音频数据,预处理包括重采样、特征提取、填充和截断。这对图像数据,预处理主要包括:特征提取和数据增强。针对多模态数据,不同类型的数据使用前面介绍的对应预处理方法详细请参照,虽然每种数据预处理方法不完全一样,但是最的目的都是一致的,将原始数据转换为模型可以接受的形式


微调预训练模型

下面将以一个文本多分类的例子,简单介绍如何使用我们自己的数据训练一个分类模型


准备数据

在微调预训练模型之前,我们需要先准备数据,我们可以使用




D


a


t


a


s


e


t



Dataset


Dataset
库,的load_dataset加载数据集

from datasets import load_dataset
# 第 1 步:准备数据
# 从文件中获取原始数据
datasets = load_dataset(f'./my_dataset.py')
# 输出训练集中的第一条数据
print(datasets["train"][0])

在这里需要注意一下,因为我们是使用自己的数据进行模型训练,所以上面 load_dataset 传入的参数是一个 py 文件的路径。这个 py 文件按照 Datasets 库的规则读取文件并返回训练数据,如果想了解更多信息,可以参照
如果我们只是想简单的学习Transformer库的使用**,可以使用 Datasets 这个库预置的一些数据集,这个时候 load_dataset 传入的参数是一些字符串**(比如,load_dataset(“imdb”)),然后会自动下载对应数据集


预处理

在将数据喂给模型之前,需要将数据进行预处理(Tokenize、填充、截断等)。

from transformers import AutoTokenizer
# 第 2 步:预处理数据
# 2.1 加载 tokenizer
tokenizer = AutoTokenizer.from_pretrained(configure["model_path"])
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
# 2.2 得到经过 tokenization 后的数据
tokenized_datasets = datasets.map(tokenize_function, batched=True)
print(tokenized_datasets["train"][0])

首先,加载tokenizer, 使用




d


a


t


a


s


e


t


s


.


m


a


p


(


)



datasets.map()


datasets.map()
生成经过预处理后的数据,因为数据经过




t


o


k


e


n


i


z


e


r


(


)



tokenizer()


tokenizer()
,处理后不再是dataset格式,所以需要使用 datasets.map() 进行处理


加载模型

在前面的部分,已经介绍过模型加载的方法,可以使用 AutoModelXXX.from_pretrained 加载模型:

from transformers import AutoModelForSequenceClassification
# 第 3 步:加载模型
classification_model = AutoModelForSequenceClassification.from_pretrained(
configure["model_path"], num_labels=get_num_labels())

与前面部分不同的地方在于:上面的代码中有一个 num_labels 参数,需要给这个参数传入我们的数据集中的类别数量


设定度量指标

在模型的训练过程中,我们希望能够输出模型的性能指标:比如准确率、精确率、召回率、F1 值等)以便了解模型的训练情况.们可以通过 Datasets 库提供的 load_metric() 来实现。下面的代码中实现了准确率计算:

import numpy as np
from datasets import load_metric
# 第 4 步:设定度量指标
metric = load_metric("./accuracy.py")
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)

设置训练超参数

在进行模型训练时候,还需要设置一些超参数,Transformers 库提供了 TrainingArguments 类

from transformers import TrainingArguments
# 第 5 步:设置训练超参数
training_args = TrainingArguments(output_dir=configure["output_dir"],
evaluation_strategy="epoch")

在上面的代码中,我们设置了两个参数**:output_dir 指定保存模型的输出路径;evaluation_strategy 决定什么时候对模型进行评估,**设置的参数 epoch 表明每训练完一个 epoch 后进行一次评估,评估内容即上一步设定的度量指标


训练和保存模型

过前面一系列的步骤后,我们终于可以开始进行模型训练了。Transformers 库提供了 Trainer 类,可以很简单方便地进行模型训练。首先,创建一个 Trainer,然后调用 train() 函数,就开始进行模型训练了。当模型训练完毕后,调用 save_model() 保存模型

# 第 6 步:开始训练模型
trainer = Trainer(model=classification_model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
tokenizer=tokenizer,
compute_metrics=compute_metrics)
trainer.train()
# 保存模型
trainer.save_model()

总结

慢慢的会用transformer库编写自己的代码,将其全部都搞定都行啦的样子与打算。


经验
  • 有质疑的研读论文
  • 讲论文进行分类。






推荐阅读
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在2019中国国际智能产业博览会上,百度董事长兼CEO李彦宏强调,人工智能应务实推进其在各行业的应用。随后,在“ABC SUMMIT 2019百度云智峰会”上,百度展示了通过“云+AI”推动AI工业化和产业智能化的最新成果。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 深入解析Android GPS机制:第五部分 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
author-avatar
schell
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有