Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Path: blob/main/transformers_doc/zh/quicktour.ipynb
Views: 2542
快速上手
Pipeline
使用pipeline()
是利用预训练模型进行推理的最简单的方式. 你能够将pipeline()
开箱即用地用于跨不同模态的多种任务. 来看看它支持的任务列表:
任务 | 描述 | 模态 | Pipeline |
---|---|---|---|
文本分类 | 为给定的文本序列分配一个标签 | NLP | pipeline(task="sentiment-analysis") |
文本生成 | 根据给定的提示生成文本 | NLP | pipeline(task="text-generation") |
命名实体识别 | 为序列里的每个token分配一个标签(人, 组织, 地址等等) | NLP | pipeline(task="ner") |
问答系统 | 通过给定的上下文和问题, 在文本中提取答案 | NLP | pipeline(task="question-answering") |
掩盖填充 | 预测出正确的在序列中被掩盖的token | NLP | pipeline(task="fill-mask") |
文本摘要 | 为文本序列或文档生成总结 | NLP | pipeline(task="summarization") |
文本翻译 | 将文本从一种语言翻译为另一种语言 | NLP | pipeline(task="translation") |
图像分类 | 为图像分配一个标签 | Computer vision | pipeline(task="image-classification") |
图像分割 | 为图像中每个独立的像素分配标签(支持语义、全景和实例分割) | Computer vision | pipeline(task="image-segmentation") |
目标检测 | 预测图像中目标对象的边界框和类别 | Computer vision | pipeline(task="object-detection") |
音频分类 | 给音频文件分配一个标签 | Audio | pipeline(task="audio-classification") |
自动语音识别 | 将音频文件中的语音提取为文本 | Audio | pipeline(task="automatic-speech-recognition") |
视觉问答 | 给定一个图像和一个问题,正确地回答有关图像的问题 | Multimodal | pipeline(task="vqa") |
创建一个pipeline()
实例并且指定你想要将它用于的任务, 就可以开始了. 你可以将pipeline()
用于任何一个上面提到的任务, 如果想知道支持的任务的完整列表, 可以查阅pipeline API 参考. 不过, 在这篇教程中, 你将把 pipeline()
用在一个情感分析示例上:
pipeline()
会下载并缓存一个用于情感分析的默认的预训练模型和分词器. 现在你可以在目标文本上使用 classifier
了:
如果你有不止一个输入, 可以把所有输入放入一个列表然后传给pipeline()
, 它将会返回一个字典列表:
pipeline()
也可以为任何你喜欢的任务遍历整个数据集. 在下面这个示例中, 让我们选择自动语音识别作为我们的任务:
你需要确保数据集中的音频的采样率与 facebook/wav2vec2-base-960h
训练用到的音频的采样率一致:
当调用"audio"
column时, 音频文件将会自动加载并重采样. 从前四个样本中提取原始波形数组, 将它作为列表传给pipeline:
对于输入非常庞大的大型数据集 (比如语音或视觉), 你会想到使用一个生成器, 而不是一个将所有输入都加载进内存的列表. 查阅 pipeline API 参考 来获取更多信息.
在pipeline中使用另一个模型和分词器
使用 AutoModelForSequenceClassification
和AutoTokenizer
来加载预训练模型和它关联的分词器 (更多信息可以参考下一节的 AutoClass
):
使用 TFAutoModelForSequenceClassification
和AutoTokenizer
来加载预训练模型和它关联的分词器 (更多信息可以参考下一节的 TFAutoClass
):
在pipeline()
中指定模型和分词器, 现在你就可以在法语文本上使用 classifier
了:
AutoClass
在幕后, 是由AutoModelForSequenceClassification
和AutoTokenizer
一起支持你在上面用到的pipeline()
. AutoClass 是一个能够通过预训练模型的名称或路径自动查找其架构的快捷方式. 你只需要为你的任务选择合适的 AutoClass
和它关联的预处理类.
让我们回过头来看上一节的示例, 看看怎样使用 AutoClass
来重现使用pipeline()
的结果.
AutoTokenizer
分词器负责预处理文本, 将文本转换为用于输入模型的数字数组. 有多个用来管理分词过程的规则, 包括如何拆分单词和在什么样的级别上拆分单词 (在 分词器总结学习更多关于分词的信息). 要记住最重要的是你需要实例化的分词器要与模型的名称相同, 来确保和模型训练时使用相同的分词规则.
使用AutoTokenizer
加载一个分词器:
将文本传入分词器:
分词器返回了含有如下内容的字典:
input_ids: 用数字表示的token.
attention_mask: 应该关注哪些token的指示.
分词器也可以接受列表作为输入, 并填充和截断文本, 返回具有统一长度的批次:
AutoModel
🤗 Transformers 提供了一种简单统一的方式来加载预训练的实例. 这表示你可以像加载AutoTokenizer
一样加载AutoModel
. 唯一不同的地方是为你的任务选择正确的AutoModel
. 对于文本 (或序列) 分类, 你应该加载AutoModelForSequenceClassification
:
模型在logits
属性输出最终的激活结果. 在 logits
上应用softmax函数来查询概率:
🤗 Transformers 提供了一种简单统一的方式来加载预训练的实例. 这表示你可以像加载AutoTokenizer
一样加载TFAutoModel
. 唯一不同的地方是为你的任务选择正确的TFAutoModel
, 对于文本 (或序列) 分类, 你应该加载TFAutoModelForSequenceClassification
:
模型在logits
属性输出最终的激活结果. 在 logits
上应用softmax函数来查询概率:
所有 🤗 Transformers 模型 (PyTorch 或 TensorFlow) 在最终的激活函数(比如softmax)之前 输出张量, 因为最终的激活函数常常与loss融合. 模型的输出是特殊的数据类, 所以它们的属性可以在IDE中被自动补全. 模型的输出就像一个元组或字典 (你可以通过整数、切片或字符串来索引它), 在这种情况下, 为None的属性会被忽略.
保存模型
当你的模型微调完成, 你就可以使用PreTrainedModel.save_pretrained()
把它和它的分词器保存下来:
当你准备再次使用这个模型时, 就可以使用PreTrainedModel.from_pretrained()
加载它了:
当你的模型微调完成, 你就可以使用TFPreTrainedModel.save_pretrained()
把它和它的分词器保存下来:
当你准备再次使用这个模型时, 就可以使用TFPreTrainedModel.from_pretrained()
加载它了:
🤗 Transformers有一个特别酷的功能, 它能够保存一个模型, 并且将它加载为PyTorch或TensorFlow模型. from_pt
或from_tf
参数可以将模型从一个框架转换为另一个框架:
自定义模型构建
你可以修改模型的配置类来改变模型的构建方式. 配置指明了模型的属性, 比如隐藏层或者注意力头的数量. 当你从自定义的配置类初始化模型时, 你就开始自定义模型构建了. 模型属性是随机初始化的, 你需要先训练模型, 然后才能得到有意义的结果.
通过导入AutoConfig
来开始, 之后加载你想修改的预训练模型. 在AutoConfig.from_pretrained()
中, 你能够指定想要修改的属性, 比如注意力头的数量:
使用AutoModel.from_config()
根据你的自定义配置创建一个模型:
使用TFAutoModel.from_config()
根据你的自定义配置创建一个模型:
查阅创建一个自定义结构指南获取更多关于构建自定义配置的信息.
Trainer - PyTorch优化训练循环
所有的模型都是标准的torch.nn.Module
, 所以你可以在任何典型的训练模型中使用它们. 当你编写自己的训练循环时W, 🤗 Transformers为PyTorch提供了一个Trainer
类, 它包含了基础的训练循环并且为诸如分布式训练, 混合精度等特性增加了额外的功能.
取决于你的任务, 你通常可以传递以下的参数给Trainer
:
PreTrainedModel
或者torch.nn.Module
:TrainingArguments
含有你可以修改的模型超参数, 比如学习率, 批次大小和训练时的迭代次数. 如果你没有指定训练参数, 那么它会使用默认值:一个预处理类, 比如分词器, 特征提取器或者处理器:
加载一个数据集:
创建一个给数据集分词的函数, 并且使用
map
应用到整个数据集:用来从数据集中创建批次的
DataCollatorWithPadding
:
现在把所有的类传给Trainer
:
一切准备就绪后, 调用train()
进行训练:
对于像翻译或摘要这些使用序列到序列模型的任务, 用Seq2SeqTrainer
和Seq2SeqTrainingArguments
来替代.
你可以通过子类化Trainer
中的方法来自定义训练循环. 这样你就可以自定义像损失函数, 优化器和调度器这样的特性. 查阅Trainer
参考手册了解哪些方法能够被子类化.
另一个自定义训练循环的方式是通过回调. 你可以使用回调来与其他库集成, 查看训练循环来报告进度或提前结束训练. 回调不会修改训练循环. 如果想自定义损失函数等, 就需要子类化Trainer
了.
使用Tensorflow训练
所有模型都是标准的tf.keras.Model
, 所以你可以通过Keras API实现在Tensorflow中训练. 🤗 Transformers提供了prepare_tf_dataset()
方法来轻松地将数据集加载为tf.data.Dataset
, 这样你就可以使用Keras的compile
和fit
方法马上开始训练.
使用
TFPreTrainedModel
或者tf.keras.Model
来开始:一个预处理类, 比如分词器, 特征提取器或者处理器:
创建一个给数据集分词的函数
使用
map
将分词器应用到整个数据集, 之后将数据集和分词器传给prepare_tf_dataset()
. 如果你需要的话, 也可以在这里改变批次大小和是否打乱数据集:一切准备就绪后, 调用
compile
和fit
开始训练:
接下来做什么?
现在你已经完成了 🤗 Transformers 的快速上手教程, 来看看我们的指南并且学习如何做一些更具体的事情, 比如写一个自定义模型, 为某个任务微调一个模型以及如何使用脚本来训练模型. 如果你有兴趣了解更多 🤗 Transformers 的核心章节, 那就喝杯咖啡然后来看看我们的概念指南吧!