並獲得增強文件體驗
開始使用
模型
在本節中,我們將更深入地瞭解如何建立和使用模型。我們將使用 AutoModel 類,當您想要從檢查點例項化任何模型時,它非常方便。
AutoModel 類及其所有相關類實際上只是庫中各種模型的簡單包裝器。它是一個聰明的包裝器,因為它可以自動猜測檢查點對應的模型架構,然後使用此架構例項化模型。
但是,如果您知道要使用的模型型別,則可以直接使用定義其架構的類。讓我們看看 BERT 模型是如何工作的。
建立 Transformer
初始化 BERT 模型的第一步是載入配置物件
from transformers import BertConfig, BertModel
# Building the config
config = BertConfig()
# Building the model from the config
model = BertModel(config)配置包含許多用於構建模型的屬性
print(config)BertConfig {
[...]
"hidden_size": 768,
"intermediate_size": 3072,
"max_position_embeddings": 512,
"num_attention_heads": 12,
"num_hidden_layers": 12,
[...]
}雖然您還沒有看到所有這些屬性的作用,但您應該認識其中的一些:hidden_size 屬性定義了 hidden_states 向量的尺寸,num_hidden_layers 定義了 Transformer 模型的層數。
不同的載入方法
從預設配置建立模型會使用隨機值進行初始化
from transformers import BertConfig, BertModel
config = BertConfig()
model = BertModel(config)
# Model is randomly initialized!模型可以在這種狀態下使用,但它會輸出亂碼;它需要先進行訓練。我們可以從頭開始針對手頭的任務訓練模型,但正如您在第 1 章中看到的,這需要很長時間和大量資料,並且會產生不可忽略的環境影響。為了避免不必要的重複工作,能夠共享和重用已經訓練過的模型勢在必行。
載入已經訓練好的 Transformer 模型很簡單——我們可以使用 from_pretrained() 方法來實現
from transformers import BertModel
model = BertModel.from_pretrained("bert-base-cased")如您之前所見,我們可以用等效的 AutoModel 類替換 BertModel。從現在開始我們將這樣做,因為這會生成與檢查點無關的程式碼;如果您的程式碼適用於一個檢查點,它應該可以無縫地適用於另一個檢查點。即使架構不同,只要檢查點針對類似的任務進行了訓練(例如,情感分析任務),這同樣適用。
在上面的程式碼示例中,我們沒有使用 BertConfig,而是透過 bert-base-cased 識別符號載入了預訓練模型。這是一個由 BERT 作者自己訓練的模型檢查點;您可以在其模型卡片中找到更多詳細資訊。
此模型現在已使用檢查點的所有權重進行初始化。它可以直接用於推理其訓練過的任務,也可以針對新任務進行微調。透過使用預訓練權重而不是從頭開始訓練,我們可以快速獲得良好的結果。
權重已下載並快取(因此將來呼叫 from_pretrained() 方法不會重新下載它們)到快取資料夾中,預設情況下為 ~/.cache/huggingface/transformers。您可以透過設定 HF_HOME 環境變數來自定義快取資料夾。
用於載入模型的識別符號可以是模型中心上任何模型的識別符號,只要它與 BERT 架構相容即可。可以在此處找到所有可用的 BERT 檢查點的完整列表。
儲存方法
儲存模型與載入模型一樣簡單——我們使用 save_pretrained() 方法,它類似於 from_pretrained() 方法
model.save_pretrained("directory_on_my_computer")這會將兩個檔案儲存到您的磁碟上
ls directory_on_my_computer
config.json pytorch_model.bin如果您檢視 config.json 檔案,您會識別出構建模型架構所需的屬性。此檔案還包含一些元資料,例如檢查點源自哪裡以及上次儲存檢查點時您使用的是哪個 🤗 Transformers 版本。
pytorch_model.bin 檔案稱為 狀態字典;它包含您模型的所有權重。這兩個檔案是相輔相成的;配置是瞭解模型架構所必需的,而模型權重是模型的引數。
使用 Transformer 模型進行推理
既然您已經瞭解瞭如何載入和儲存模型,那麼讓我們嘗試使用它進行一些預測。Transformer 模型只能處理數字——由分詞器生成的數字。但在我們討論分詞器之前,讓我們先了解模型接受哪些輸入。
分詞器可以處理將輸入轉換為適當框架的張量,但為了幫助您理解正在發生的事情,我們將快速瞭解在將輸入傳送到模型之前必須執行的操作。
假設我們有幾個序列
sequences = ["Hello!", "Cool.", "Nice!"]分詞器將這些轉換為詞彙索引,這些索引通常稱為輸入 ID。每個序列現在都是一個數字列表!生成的輸出是
encoded_sequences = [
[101, 7592, 999, 102],
[101, 4658, 1012, 102],
[101, 3835, 999, 102],
]這是一個編碼序列的列表:一個列表的列表。張量只接受矩形形狀(例如矩陣)。這個“陣列”已經是矩形形狀,因此將其轉換為張量很容易
import torch
model_inputs = torch.tensor(encoded_sequences)使用張量作為模型的輸入
使用模型中的張量非常簡單——我們只需使用輸入呼叫模型即可
output = model(model_inputs)
雖然模型接受許多不同的引數,但只有輸入 ID 是必需的。我們將在後面解釋其他引數的作用以及何時需要它們,但首先我們需要仔細看看構建 Transformer 模型可以理解的輸入的分詞器。