Transformers 快速入门教程 您所在的位置:网站首页 快速入门电脑 Transformers 快速入门教程

Transformers 快速入门教程

2024-07-03 01:57| 来源: 网络整理| 查看: 265

Transformers 快速入门教程

快速掌握 🤗 Transformers!无论您是开发人员还是日常用户,这个快速上手都将帮助您入门,并展示如何使用 pipeline() 进行推断、加载预训练模型和预处理器以及使用 PyTorch 或 TensorFlow 快速训练模型。如果您是初学者,我们建议您查看我们的教程或下一个 课程 以获取更详细的概念解释。

在开始之前,请确保您已安装了所需的所有库:

!pip install transformers datasets

您还需要安装您喜欢的机器学习框架:

Pytorch Hide Pytorch content pip install torch TensorFlow Hide TensorFlow content pip install tensorflow Pipeline

pipeline() 是使用预训练模型进行推断的最简单和最快捷的方式。您可以直接使用 pipeline() 来处理不同模态的许多任务,表格中展示了其中的一些任务:

要查看可用任务的完整列表,请参阅 pipeline API 参考 。

任务 描述 模态 Pipeline 标识符 文本分类 为给定的文本序列分配一个标签 NLP pipeline(task=“sentiment-analysis”) 文本生成 生成给定提示的文本 NLP pipeline(task=“text-generation”) 摘要生成 生成文本或文档序列的摘要 NLP pipeline(task=“summarization”) 图像分类 为图像分配一个标签 计算机视觉 pipeline(task=“image-classification”) 图像分割 为图像的每个像素分配一个标签(支持语义分割、全景分割和实例分割) 计算机视觉 pipeline(task=“image-segmentation”) 目标检测 预测图像中对象的边界框和类别 计算机视觉 pipeline(task=“object-detection”) 音频分类 为一些音频数据分配一个标签 音频 pipeline(task=“audio-classification”) 自动语音识别 将语音转录成文本 音频 pipeline(task=“automatic-speech-recognition”) 视觉问答 根据图像和问题回答关于图像的问题 多模态 pipeline(task=“vqa”) 文档问答 根据图像和问题回答关于文档的问题 多模态 pipeline(task=“document-question-answering”) 图像字幕生成 为给定的图像生成字幕 多模态 pipeline(task=“image-to-text”)

首先创建一个 pipeline() 的实例,并指定要用它处理的任务。在本指南中,我们将使用情感分析的 pipeline() 作为示例:

>>> from transformers import pipeline >>> classifier = pipeline("sentiment-analysis")

pipeline() 会下载并缓存用于情感分析的默认 预训练模型 和分词器。现在,您可以将 classifier 应用于目标文本:

>>> classifier("We are very happy to show you the 🤗 Transformers library.") [{'label': 'POSITIVE', 'score': 0.9998}]

如果您有多个输入,请将输入作为列表传递给 pipeline(),以返回一个字典列表:

>>> results = classifier(["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."]) >>> for result in results: ... print(f"label: {result['label']}, with score: {round(result['score'], 4)}") label: POSITIVE, with score: 0.9998 label: NEGATIVE, with score: 0.5309

pipeline() 还可以迭代处理任何您喜欢的任务的整个数据集。对于这个例子,让我们选择自动语音识别作为我们的任务:

>>> import torch >>> from transformers import pipeline >>> speech_recognizer = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-base-960h")

加载一个音频数据集(有关详细信息,请参阅 🤗 数据集 快速入门 ),您想要迭代处理它。例如,加载 MInDS-14 数据集:

>>> from datasets import load_dataset, Audio >>> dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")

您需要确保数据集的采样率与 facebook/wav2vec2-base-960h 训练时的采样率相匹配:

>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=speech_recognizer.feature_extractor.sampling_rate))

在调用 "audio" 列时,音频文件将被自动加载和重新采样。从前 4 个样本中提取原始波形数组,并将其作为列表传递给 pipeline:

>>> result = speech_recognizer(dataset[:4]["audio"]) >>> print([d["text"] for d in result]) ['I WOULD LIKE TO SET UP A JOINT ACCOUNT WITH MY PARTNER HOW DO I PROCEED WITH DOING THAT', "FONDERING HOW I'D SET UP A JOIN TO HELL T WITH MY WIFE AND WHERE THE AP MIGHT BE", "I I'D LIKE TOY SET UP A JOINT ACCOUNT WITH MY PARTNER I'M NOT SEEING THE OPTION TO DO IT ON THE APSO I CALLED IN TO GET SOME HELP CAN I JUST DO IT OVER THE PHONE WITH YOU AND GIVE YOU THE INFORMATION OR SHOULD I DO IT IN THE AP AN I'M MISSING SOMETHING UQUETTE HAD PREFERRED TO JUST DO IT OVER THE PHONE OF POSSIBLE THINGS", 'HOW DO I FURN A JOINA COUT']

对于输入数据量较大的数据集(如语音或视觉),您需要传递一个生成器而不是列表,以将所有输入加载到内存中。请参阅 pipeline API 参考 以获取更多信息。

在 pipeline 中使用其他模型和分词器

pipeline() 可以适用于 Hub 中的任何模型,这使得轻松调整 pipeline() 以适应其他用例。例如,如果您想要一个能处理法文文本的模型,可以使用 Hub 上的标签来筛选适合的模型。顶部的筛选结果返回了一个针对法文文本进行情感分析的多语言 BERT 模型 :

>>> model_name = "nlptown/bert-base-multilingual-uncased-sentiment" Pytorch Hide Pytorch content

使用 AutoModelForSequenceClassification 和 AutoTokenizer 加载预训练模型及其关联的分词器(有关 AutoClass 的详细内容将在下一部分中讲解):

>>> from transformers import AutoTokenizer, AutoModelForSequenceClassification >>> model = AutoModelForSequenceClassification.from_pretrained(model_name) >>> tokenizer = AutoTokenizer.from_pretrained(model_name) TensorFlow Hide TensorFlow content

使用 TFAutoModelForSequenceClassification 和 AutoTokenizer 加载预训练模型和相应的分词器(有关 TFAutoClass 的更多信息请参见下一节):

>>> from transformers import AutoTokenizer, TFAutoModelForSequenceClassification >>> model = TFAutoModelForSequenceClassification.from_pretrained(model_name) >>> tokenizer = AutoTokenizer.from_pretrained(model_name)

在 pipeline() 中指定模型和分词器,现在可以将 classifier 应用于法语文本:

>>> classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer) >>> classifier("Nous sommes très heureux de vous présenter la bibliothèque 🤗 Transformers.") [{'label': '5 stars', 'score': 0.7273}]

如果找不到适合您场景的模型,您需要对预训练模型进行微调以适应您的数据。请参阅我们的 微调教程 了解更多信息。最后,在微调预训练模型后,请考虑将模型与社区中的大家分享,以使机器学习普惠于每个人! 🤗

AutoClass

在底层,AutoModelForSequenceClassification 和 AutoTokenizer 类共同作用于上述使用的 pipeline()。 AutoClass 是一种快捷方式,可以根据模型的名称或路径自动获取预训练模型的架构。您只需要选择适合您任务的正确 AutoClass 及其关联的预处理类即可。

让我们回到上一节的示例,看看如何使用 AutoClass 复制 pipeline() 的结果。

AutoTokenizer

分词器负责将文本预处理为输入模型的数字数组。有多个规则来控制分词过程,包括如何拆分单词以及应该在何种级别拆分单词(有关分词的更多信息,请参见 tokenizer 概述 )。最重要的是,您需要使用相同模型名称实例化一个分词器,以确保使用模型预训练的相同分词规则。

使用 AutoTokenizer 加载一个分词器:

>>> from transformers import AutoTokenizer >>> model_name = "nlptown/bert-base-multilingual-uncased-sentiment" >>> tokenizer = AutoTokenizer.from_pretrained(model_name)

将文本传递给分词器:

>>> encoding = tokenizer("We are very happy to show you the 🤗 Transformers library.") >>> print(encoding) {'input_ids': [101, 11312, 10320, 12495, 19308, 10114, 11391, 10855, 10103, 100, 58263, 13299, 119, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

分词器返回一个包含以下内容的字典:

input_ids :您的标记的数字表示形式。 attention_mask :指示应该关注哪些标记。

分词器还可以接受传入数组,并且可以对文本进行填充和截断,以返回固定长度的结果:

Pytorch Hide Pytorch content >>> pt_batch = tokenizer( ... ["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."], ... padding=True, ... truncation=True, ... max_length=512, ... return_tensors="pt", ... ) TensorFlow Hide TensorFlow content >>> tf_batch = tokenizer( ... ["We are very happy to show you the 🤗 Transformers library.", "We hope you don't hate it."], ... padding=True, ... truncation=True, ... max_length=512, ... return_tensors="tf", ... )

有关分词的更多详细信息以及如何使用 AutoImageProcessor、AutoFeatureExtractor 和 AutoProcessor 预处理图像、音频和多模态输入,请参阅 preprocess 教程。

AutoModel Pytorch Hide Pytorch content

🤗 Transformers 提供了一种简单统一的方式来加载预训练模型。这意味着您可以像加载 AutoTokenizer 一样加载 AutoModel。唯一的区别是选择适当的 AutoModel 用于任务。对于文本(或序列)分类,您应该加载 AutoModelForSequenceClassification:

>>> from transformers import AutoModelForSequenceClassification >>> model_name = "nlptown/bert-base-multilingual-uncased-sentiment" >>> pt_model = AutoModelForSequenceClassification.from_pretrained(model_name)

有关 AutoModel 类支持的任务,请参见 task 概述 。

现在将预处理的输入批次直接传递给模型。只需通过添加 ** 来解包字典:

>>> pt_outputs = pt_model(**pt_batch)

模型在 logits 属性中输出最终的激活值。应用 softmax 函数到 logits 可获取概率:

>>> from torch import nn >>> pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1) >>> print(pt_predictions) tensor([[0.0021, 0.0018, 0.0115, 0.2121, 0.7725], [0.2084, 0.1826, 0.1969, 0.1755, 0.2365]], grad_fn=) TensorFlow Hide TensorFlow content

🤗 Transformers 提供了一种简单统一的方式来加载预训练模型。这意味着您可以像加载 AutoTokenizer 一样加载 TFAutoModel。唯一的区别是选择适当的 TFAutoModel 用于任务。对于文本(或序列)分类,您应该加载 TFAutoModelForSequenceClassification:

>>> from transformers import TFAutoModelForSequenceClassification >>> model_name = "nlptown/bert-base-multilingual-uncased-sentiment" >>> tf_model = TFAutoModelForSequenceClassification.from_pretrained(model_name)

有关 AutoModel 类支持的任务,请参见 task 概述 。

现在将预处理的输入批次直接传递给模型,通过直接将字典键传递给张量:

>>> tf_outputs = tf_model(tf_batch)

模型在 logits 属性中输出最终的激活值。应用 softmax 函数到 logits 可获取概率:

>>> import tensorflow as tf >>> tf_predictions = tf.nn.softmax(tf_outputs.logits, axis=-1) >>> tf_predictions

🤗 Transformers 所有模型(PyTorch 或 TensorFlow)在最后的激活函数(例如 softmax)之前输出张量,因为最后的激活函数通常与损失融合。模型输出是特殊的数据类,因此其属性在 IDE 中会自动补全。模型输出的行为类似于元组或字典(可以使用整数、切片或字符串进行索引),在该情况下,将忽略为 None 的属性。

保存模型 Pytorch Hide Pytorch content

微调模型后,您可以使用其分词器使用 PreTrainedModel.save_pretrained() 将其保存:

>>> pt_save_directory = "./pt_save_pretrained" >>> tokenizer.save_pretrained(pt_save_directory) >>> pt_model.save_pretrained(pt_save_directory)

当您准备好再次使用模型时,可以使用 PreTrainedModel.from_pretrained() 重新加载它:

>>> pt_model = AutoModelForSequenceClassification.from_pretrained("./pt_save_pretrained") TensorFlow Hide TensorFlow content

微调模型后,您可以使用其分词器使用 TFPreTrainedModel.save_pretrained() 将其保存:

>>> tf_save_directory = "./tf_save_pretrained" >>> tokenizer.save_pretrained(tf_save_directory) >>> tf_model.save_pretrained(tf_save_directory)

当您准备好再次使用模型时,可以使用 TFPreTrainedModel.from_pretrained() 重新加载它:

>>> tf_model = TFAutoModelForSequenceClassification.from_pretrained("./tf_save_pretrained") 一个特别酷的🤗 Transformers功能是能够将模型保存并重新加载为PyTorch或TensorFlow模型。`from_pt`或`from_tf`参数可以将模型从一个框架转换为另一个框架: Pytorch Hide Pytorch content >>> from transformers import AutoModel >>> tokenizer = AutoTokenizer.from_pretrained(tf_save_directory) >>> pt_model = AutoModelForSequenceClassification.from_pretrained(tf_save_directory, from_tf=True) TensorFlow Hide TensorFlow content >>> from transformers import TFAutoModel >>> tokenizer = AutoTokenizer.from_pretrained(pt_save_directory) >>> tf_model = TFAutoModelForSequenceClassification.from_pretrained(pt_save_directory, from_pt=True) 自定义模型构建

您可以修改模型的配置类来更改模型的构建方式。配置类指定了模型的属性,例如隐藏层或注意力头的数量。当您从自定义配置类初始化一个模型时,您将从头开始。模型的属性将被随机初始化,您需要在使用模型获取有意义的结果之前进行训练。

首先导入 AutoConfig,然后加载要修改的预训练模型。在 AutoConfig.from_pretrained() 中,您可以指定要更改的属性,比如注意力头的数量:

>>> from transformers import AutoConfig >>> my_config = AutoConfig.from_pretrained("distilbert-base-uncased", n_heads=12) Pytorch Hide Pytorch content

使用 AutoModel.from_config() 从自定义配置创建模型:

>>> from transformers import AutoModel >>> my_model = AutoModel.from_config(my_config) TensorFlow Hide TensorFlow content

使用 TFAutoModel.from_config() 从自定义配置创建模型:

>>> from transformers import TFAutoModel >>> my_model = TFAutoModel.from_config(my_config)

有关构建自定义配置的更多信息,请查看 创建自定义架构 指南。

Trainer - 一个针对PyTorch优化过的训练循环

所有模型都是标准的 torch.nn.Module ,因此您可以在任何典型的训练循环中使用它们。虽然您可以编写自己的训练循环,但是🤗 Transformers为PyTorch提供了一个 Trainer 类,其中包含基本的训练循环,并添加了用于分布式训练、混合精度等功能的附加功能。

根据您的任务,您通常会将以下参数传递给 Trainer:

一个 PreTrainedModel 或一个 torch.nn.Module :

>>> from transformers import AutoModelForSequenceClassification >>> model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased")

TrainingArguments 包含您可以更改的模型超参数,例如学习率、批大小和训练时期的数量。如果您不指定任何训练参数,将使用默认值:

>>> from transformers import TrainingArguments >>> training_args = TrainingArguments( ... output_dir="path/to/save/folder/", ... learning_rate=2e-5, ... per_device_train_batch_size=8, ... per_device_eval_batch_size=8, ... num_train_epochs=2, ... )

一个预处理类,例如分词器、图像处理器、特征提取器或处理器:

>>> from transformers import AutoTokenizer >>> tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")

加载一个数据集:

>>> from datasets import load_dataset >>> dataset = load_dataset("rotten_tomatoes") # doctest: +IGNORE_RESULT

创建一个函数来对数据集进行分词:

>>> def tokenize_dataset(dataset): ... return tokenizer(dataset["text"])

然后使用 map 对整个数据集应用它:

>>> dataset = dataset.map(tokenize_dataset, batched=True)

一个 DataCollatorWithPadding 用于从您的数据集创建一个批次的例子:

>>> from transformers import DataCollatorWithPadding >>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

现在将所有这些类收集在 Trainer 中:

>>> from transformers import Trainer >>> trainer = Trainer( ... model=model, ... args=training_args, ... train_dataset=dataset["train"], ... eval_dataset=dataset["test"], ... tokenizer=tokenizer, ... data_collator=data_collator, ... ) # doctest: +SKIP

当准备好后,调用 train() 开始训练:

>>> trainer.train()

对于使用序列到序列模型的任务(如翻译或摘要),请改用 Seq2SeqTrainer 和 Seq2SeqTrainingArguments 类。

您可以通过在 Trainer 中子类化方法来自定义训练循环行为。这使您可以自定义损失函数、优化器和调度器等功能。查看Trainer参考资料以了解可以子类化的方法。

通过使用 Callbacks 来自定义训练循环的另一种方法。您可以使用回调函数与其他库集成,并检查训练循环以报告进展或提前停止训练。回调函数不会修改训练循环本身。要自定义诸如损失函数之类的内容,您需要子类化 Trainer。

使用 TensorFlow 进行训练

所有模型都是标准的 tf.keras.Model ,因此可以使用 Keras API 在 TensorFlow 中训练它们。🤗 Transformers 提供了 prepare_tf_dataset() 方法,以便将数据集轻松加载为 tf.data.Dataset,因此您可以立即使用 Keras 的 compile 和 fit 方法开始训练。

首先,您需要一个 TFPreTrainedModel 或一个 tf.keras.Model :

>>> from transformers import TFAutoModelForSequenceClassification >>> model = TFAutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased")

需要一个预处理类,例如分词器、图像处理器、特征提取器或处理器:

>>> from transformers import AutoTokenizer >>> tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")

创建一个函数来对数据集进行分词:

>>> def tokenize_dataset(dataset): ... return tokenizer(dataset["text"]) # doctest: +SKIP

使用 map 对整个数据集应用分词器,然后将数据集和分词器传递给 prepare_tf_dataset()。如果需要,您还可以在这里更改批大小和打乱数据集:

>>> dataset = dataset.map(tokenize_dataset) # doctest: +SKIP >>> tf_dataset = model.prepare_tf_dataset( ... dataset["train"], batch_size=16, shuffle=True, tokenizer=tokenizer ... ) # doctest: +SKIP

当您准备好后,可以调用 compile 和 fit 开始训练。请注意,Transformers 模型都有一个默认的与任务相关的损失函数,因此除非您想自定义损失函数,否则无需指定:

>>> from tensorflow.keras.optimizers import Adam >>> model.compile(optimizer=Adam(3e-5)) # 不需要损失参数! >>> model.fit(tf_dataset) # doctest: +SKIP 下一步是什么?

现在,你已经完成了🤗 Transformers的快速上手,请查阅我们的指南,了解如何执行更具体的操作,例如编写自定义模型、微调任务模型以及如何使用脚本训练模型。如果您对🤗 Transformers的核心概念更感兴趣,可以泡一杯咖啡,查看我们的概念指南!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有