多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## pipeline 的处理流程 1. **预处理 **(preprocessing),将原始文本转换为模型可以接受的输入格式; 2. 将处理好的输入**送入模型**; 3. 对模型的输出进行**后处理 **(postprocessing),将其转换为人类方便阅读的格式。 ![](https://img.kancloud.cn/20/92/209296e0a4dd6188428e65e89451e158_2794x945.png) ### 使用分词器进行预处理 因为神经网络模型无法直接处理文本,因此首先需要通过**预处理**环节将文本转换为模型可以理解的数字。具体地,我们会使用每个模型对应的分词器 (tokenizer) 来进行: 1. 将输入切分为词语、子词或者符号(例如标点符号),统称为**tokens**; 2. 根据模型的词表将每个 token 映射到对应的 token 编号(就是一个数字); 3. 根据模型的需要,添加一些额外的输入。 如 ``` from transformers import AutoTokenizer checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" tokenizer = AutoTokenizer.from_pretrained(checkpoint) raw_inputs = [ "I've been waiting for a HuggingFace course my whole life.", "I hate this so much!", ] inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt") print(inputs) ``` > 每个模型都有自定特定的预处理通过 Hub 中找到对应模型的相关操作 输出 ``` { 'input_ids': tensor([ [ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012, 102], [ 101, 1045, 5223, 2023, 2061, 2172, 999, 102, 0, 0, 0, 0, 0, 0, 0, 0] ]), 'attention_mask': tensor([ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0] ]) } ``` ### 将预处理好的输入送入模型 ``` from transformers import AutoModel checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" model = AutoModel.from_pretrained(checkpoint) ``` >所有 pipelines 都具有类似的模型结构,只是模型的最后一部分会使用不同的 head 以完成对应的任务。 ![](https://img.kancloud.cn/fb/2f/fb2f6dc39db13781a1a1766cddbbfd95_2444x1143.png) Transformers 库封装了很多不同的结构,常见的有: * `*Model`(返回 hidden states) * `*ForCausalLM`(用于条件语言模型) * `*ForMaskedLM`(用于遮盖语言模型) * `*ForMultipleChoice`(用于多选任务) * `*ForQuestionAnswering`(用于自动问答任务) * `*ForSequenceClassification`(用于文本分类任务) * `*ForTokenClassification`(用于 token 分类任务,例如 NER) ### 对模型输出进行后处理 由于模型的输出只是一些数值,因此并不适合人类阅读。例如我们打印出上面例子的输出: