第1篇 Transformers各種API的綜述


Quick tour

Pipeline

pipeline()是對於給定任務使用預訓練模型最簡單的方法。
pipeline()支持很多常見任務:
文本:

  • 情感分析:對於給定文本的情感極性進行分類
  • 文本生成(英語):針對給定輸入生成文本
  • 命名實體識別:將文本中的每個實體標注對應的標簽
  • 問答:給定一個文本和一個問題,從文本中抽取問題的答案
  • 完形填空:填充給定文本中掩蓋的單詞
  • 摘要:生成長文本的摘要
  • 翻譯:將給定文本翻譯成另外的語言
  • 特征提取:創建一個文本的張量表示

圖像:

  • 圖像分類:對圖像進行分類
  • 圖像分割:對圖像的每個像素進行分類
  • 物體識別:識別出圖像中的物體

音頻:

  • 音頻分類:將給定音頻段賦予一個標簽
  • 自動語音識別:將音頻數據轉換成文本

Pipeline的使用方法

在本文中,以情感分析任務為例,演示pipeline()的使用

首先,引入pipeline()以及指定將要完成的任務:

from transformers import pipeline

classifier = pipeline("sentiment-analysis")

pipeline下載下來,並載入了一個默認的預訓練模型以及用於情感分析的分詞器。現在就可以將classifier用於文本了。

classifier("We are very happy to show you the 🤗 Transformers library.")

#output: [{"label": "POSITIVE", "score": 0.9998}]

對於多個文本,可以傳入一個列表:

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)}")

'''
output: 
label: POSITIVE, with score: 0.9998
label: NEGATIVE, with score: 0.5309
'''

Pipeline

pipeline()是對於給定任務使用預訓練模型最簡單的方法。
pipeline()支持很多常見任務:
文本:

  • 情感分析:對於給定文本的情感極性進行分類
  • 文本生成(英語):針對給定輸入生成文本
  • 命名實體識別:將文本中的每個實體標注對應的標簽
  • 問答:給定一個文本和一個問題,從文本中抽取問題的答案
  • 完形填空:填充給定文本中掩蓋的單詞
  • 摘要:生成長文本的摘要
  • 翻譯:將給定文本翻譯成另外的語言
  • 特征提取:創建一個文本的張量表示

圖像:

  • 圖像分類:對圖像進行分類
  • 圖像分割:對圖像的每個像素進行分類
  • 物體識別:識別出圖像中的物體

音頻:

  • 音頻分類:將給定音頻段賦予一個標簽
  • 自動語音識別:將音頻數據轉換成文本

Pipeline的使用方法

在本文中,以情感分析任務為例,演示pipeline()的使用

首先,引入pipeline()以及指定將要完成的任務:

from transformers import pipeline

classifier = pipeline("sentiment-analysis")

pipeline下載下來,並載入了一個默認的預訓練模型以及用於情感分析的分詞器。現在就可以將classifier用於文本了。

classifier("We are very happy to show you the 🤗 Transformers library.")

'''
output: [{"label": "POSITIVE", "score": 0.9998}]
'''

對於多個文本,可以傳入一個列表:

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)}")

'''
output: 
label: POSITIVE, with score: 0.9998
label: NEGATIVE, with score: 0.5309
'''

除此之外,pipeline()也可以迭代整個數據集。先從安裝Datasets庫開始吧

!pip install datasets

創建一個帶有任務名稱和希望使用模型的pipeline,將device設置為0即可將張量加載到cuda設備

from transformers import pipeline

speech_recognizer = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-base-960h", device=0)

接下來,加載一個數據集,這里使用的是superb數據集

import datasets

dataset = datasets.load_dataset("superb", name="asr", split="test")

然后就可以使用pipeline迭代整個數據集了。

from transformers.pipelines.base import KeyDataset
from tqdm.auto import tqdm

for out in tqdm(speech_recognizer(KeyDataset(dataset, "file"))):
    print(out)

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

pipeline()可以承載Model Hub中的任何模型,使其更容易得適用於其他場景。例如:如果你希望一個模型可以處理法語文本,可以通過Model Hub中的標簽找到恰當的模型。過濾結果返回了一個在情感分析上微調過的多語言bert模型,讓我們來使用這個模型吧。

model_name = "nlptown/bert-base-multilingual-uncased-sentiment"

使用AutoModelForSequenceClassification和AutoTokenizer加載預訓練模型以及相關聯的分詞器。

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

然后你可以在pipeline中指定模型和分詞器,並將其用於目標文本分類。

classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
classifier("Nous sommes très heureux de vous présenter la bibliothèque 🤗 Transformers.")

如果不能找到合適的模型,你需要在自己數據集上微調一個預訓練模型,后面的文章會詳細介紹。

AutoClass

AutoTokenizer

分詞器負責將文本預處理成一個模型能夠理解的形式。首先,分詞器將文本將文本切成一個個的詞匯(tokens)。這里有很多管理分詞過程的規則,包括如何切詞、切成什么層級。最重要的事情是你需要用同一個模型名字去實例化分詞器,從而確保與模型預訓練所使用的分詞規則相同。
要使用一個分詞器,首先需要使用AutoTokenizer加載進來

from transformers import AutoTokenizer

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

接下來,為了構建張量作為模型的輸入,分詞器將tokens轉換成數字。這就相當於模型的“詞匯表”。
下面將你的文本輸入到分詞器中:

encoding = tokenizer("We are very happy to show you the 🤗 Transformers library.")
print(encoding)

'''
output:
{"input_ids": [101, 2057, 2024, 2200, 3407, 2000, 2265, 2017, 1996, 100, 19081, 3075, 1012, 102],
 "attention_mask": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
'''

(這里可以觀察到,分詞器自動在文本的首尾分別加了一個token)
分詞器返回一個詞典,包括:

  • input_ids:每一個token的數值表示
  • attention_mask:指示哪個token需要被關注

與pipeline一樣,分詞器也可以接受一系列輸入。除此之外,分詞器還可以填充很截斷文本,返回一批次等長文本。

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",
)

AutoModel

Transformers提供了一個簡單、統一的方式加載實例。這意味着你可以像加載AutoTokenizer一樣加載AutoModel。唯一的區別就是你需要選擇適合當前任務的模型。當你做文本或者序列分類時,加載AutoModelForSequenceClassification。

from transformers import AutoModelForSequenceClassification

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

現在你可以將已經預處理好的批次數據直接放進模型了。在Pytorch中,**可以將字典解開。

pt_outputs = pt_model(**pt_batch)

模型在logits屬性里面輸出了最終的激活值。對logits進行softmax來得到概率值。

from torch import nn

pt_predictions = nn.functional.softmax(pt_outputs.logits, dim=-1)
print(pt_predictions)

'''
output:
tensor([[2.2043e-04, 9.9978e-01],
        [5.3086e-01, 4.6914e-01]], grad_fn=<SoftmaxBackward>)
'''

所有的transformers模型在最終的激活函數(如softmax)之前輸出張量,因為最終的激活函數經常被融合進損失里面。
模型是一個標准的nn.Module類,所有你可以在你常規的訓練循環中使用它們。但是,為了讓事情更簡潔,transformers為Pytorch提供了一個Trainer類,添加了一些函數用來分布式訓練、混合精度等。
Transformers模型的輸出是特殊的數據類,因此它們的參數在IDE里面可以自動補全。模型的輸出通常表現為元組或字典的形式,值為None的屬性自動忽略。

保存模型

保存模型:

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

加載模型:

pt_model = AutoModelForSequenceClassification.from_pretrained("./pt_save_pretrained")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM