【大模型】基于Hugging Face調用及微調大模型(1)

文章目錄

  • 一、前言
  • 二、Transformer
  • 三、Hugging Face
    • 3.1 Hugging Face Dataset
    • 3. 2 Hugging Face Tokenizer
    • 3.3 Hugging Face Transformer
    • 3.4 Hugging Face Accelerate
  • 四、基于Hugging Face調用模型
    • 4.1 調用示例
    • 4.2 調用流程概述
      • 4.2.1 Tokenizer
      • 4.2.2 模型的加載
      • 4.2.3 模型基本邏輯
      • 4.2.4 加入輸出頭
  • 參考資料

一、前言

ChatGPT的基本原理以及預訓練大語言模型的發展史,我們知道ChatGPT和所有預訓練大語言模型的核心是什么?其實就是 Transformer,Hugging Face 的火爆離不開他們開源的這個 Transformers 庫。這個開源庫里有數萬個我們可以直接調用的模型。很多場景下,這個開源模型已經足夠我們使用了。接下來我們就從Transformer的架構和具體的案例來介紹Hugging Face Transformer。

二、Transformer

Transformer 是一種用于自然語言處理和其它序列到序列任務的神經網絡模型,它是在2017年由Vaswani等人提出來的 ,Transformer的核心模塊是通過自注意力機制(Self Attention) 捕捉序列之間的依賴關系。

我們在之前的博客中介紹過Transformer,具體參考:Transformer 模型詳解

三、Hugging Face

Hugging Face Transformers 是一家公司,在Hugging Face提供的API中,我們幾乎可以下載到所有前面提到的預訓練大模型的全部信息和各種參數。我們可以認為這些模型在Hugging Face基本就是開源的了,我們只需要拿過來微調或者重新訓練這些模型。

用官方的話來說,Hugging Face Transformers 是一個用于自然語言處理的Python庫,提供了預訓練的語言模型和工具,使得研究者和工程師能夠輕松的訓練使用共享最先進的NLP模型,其中包括BERT、GPT、RoBERTa、XLNet、DistillBERT等等。

通過 Transformers 可以輕松的用這些預訓練模型進行文本分類、命名實體識別、機器翻譯、問答系統等NLP任務。這個庫還提供了方便的API、示例代碼和文檔,讓我們使用這些模型或者學習模型變得非常簡單。

Hugging Face官網:https://huggingface.co/
在這里插入圖片描述

Hugging Face的主要產品包括Hugging Face Dataset、Hugging Face Tokenizer、Hugging Face Transformer和Hugging Face Accelerate。

  • Hugging Face Dataset:是一個庫,用于輕松訪問和共享音頻、計算機視覺和自然語言處理(NLP)任務的數據集。只需一行代碼即可加載數據集,并使用強大的數據處理方法快速準備好數據集,以便在深度學習模型中進行訓練。在Apache Arrow格式的支持下,以零拷貝讀取處理大型數據集,沒有任何內存限制,以實現最佳速度和效率。

  • Hugging Face Tokenizer:是一個用于將文本轉換為數字表示形式的庫。它支持多種編碼器,包括BERT、GPT-2等,并提供了一些高級對齊方法,可以用于映射原始字符串(字符和單詞)和標記空間之間的關系。

  • Hugging Face Transformer:是一個用于自然語言處理(NLP)任務的庫。它提供了各種預訓練模型,包括BERT、GPT-2等,并提供了一些高級功能,例如控制生成文本的長度、溫度等。

  • Hugging Face Accelerate:是一個用于加速訓練和推理的庫。它支持各種硬件加速器,例如GPU、TPU等,并提供了一些高級功能,例如混合精度訓練、梯度累積等。

3.1 Hugging Face Dataset

Hugging Face Dataset是一個公共數據集倉庫,用于輕松訪問和共享音頻、計算機視覺和自然語言處理(NLP)任務的數據集。只需一行代碼即可加載數據集,并使用強大的數據處理方法快速準備好數據集,以便在深度學習模型中進行訓練。

在Apache Arrow格式的支持下,以零拷貝讀取處理大型數據集,沒有任何內存限制,以實現最佳速度和效率。Hugging Face Dataset還與擁抱面部中心深度集成,使您可以輕松加載數據集并與更廣泛的機器學習社區共享數據集。

在花時間下載數據集之前,快速獲取有關數據集的一些常規信息通常會很有幫助。數據集的信息存儲在 DatasetInfo 中,可以包含數據集描述、要素和數據集大小等信息。

使用 load_dataset_builder() 函數加載數據集構建器并檢查數據集的屬性,而無需提交下載:

>>> from datasets import load_dataset_builder
>>> ds_builder = load_dataset_builder("rotten_tomatoes")# Inspect dataset description
>>> ds_builder.info.description
Movie Review Dataset. This is a dataset of containing 5,331 positive and 5,331 negative processed sentences from Rotten Tomatoes movie reviews. This data was first used in Bo Pang and Lillian Lee, ``Seeing stars: Exploiting class relationships for sentiment categorization with respect to rating scales.'', Proceedings of the ACL, 2005.# Inspect dataset features
>>> ds_builder.info.features
{'label': ClassLabel(num_classes=2, names=['neg', 'pos'], id=None),'text': Value(dtype='string', id=None)}

如果您對數據集感到滿意,請使用 load_dataset() 加載它:

from datasets import load_datasetdataset = load_dataset("rotten_tomatoes", split="train")

3. 2 Hugging Face Tokenizer

Tokenizers 提供了當今最常用的分詞器的實現,重點是性能和多功能性。這些分詞器也用于Transformers。

Tokenizer 把文本序列輸入到模型之前的預處理,相當于數據預處理的環節,因為模型是不可能直接讀文字信息的,還是需要經過分詞處理,把文本變成一個個token,每個模型比如BERT、GPT需要的Tokenizer都不一樣,它們都有自己的字典,因為每一個模型它的訓練語料庫是不一樣的,所以它的token和它的字典大小、token的格式都會各有不同。整體來講,就是給各種各樣的詞進行分詞,然后編碼,以123456來代表詞的狀態,這個就是Tokenizer的作用。

所以,Tokenizer的任務就是把輸入的文本轉換成一個一個的標記,它還可以負責對文本序列的清洗、截斷、填充進行處理。簡而言之,就是為了滿足具體模型所要求的格式。

主要特點:

  • 使用當今最常用的分詞器訓練新的詞匯表并進行標記化。
  • 由于Rust實現,因此非常快速(訓練和標記化),在服務器CPU上對1GB文本進行標記化不到20秒。
  • 易于使用,但也非常多功能。
  • 旨在用于研究和生產。
  • 完全對齊跟蹤。即使進行破壞性規范化,也始終可以獲得與任何令牌對應的原始句子部分。
  • 執行所有預處理:截斷、填充、添加模型所需的特殊令牌。

這里演示如何使用 BPE 模型實例化一個:classTokenizer

from tokenizers import Tokenizer
from tokenizers.models import BPE
tokenizer = Tokenizer(BPE(unk_token="[UNK]"))

3.3 Hugging Face Transformer

Transformers提供API和工具,可輕松下載和訓練最先進的預訓練模型。使用預訓練模型可以降低計算成本、碳足跡,并節省訓練模型所需的時間和資源。這些模型支持不同模態中的常見任務,例如:

  • 自然語言處理:文本分類、命名實體識別、問答、語言建模、摘要、翻譯、多項選擇和文本生成。
  • 計算機視覺:圖像分類、目標檢測和分割。
  • 音頻:自動語音識別和音頻分類。
  • 多模式:表格問答、光學字符識別、從掃描文檔中提取信息、視頻分類和視覺問答。

Transformers支持PyTorch、TensorFlow和JAX之間的框架互操作性。這提供了在模型的每個階段使用不同框架的靈活性;在一個框架中用三行代碼訓練一個模型,在另一個框架中加載它進行推理。模型還可以導出到ONNX和TorchScript等格式,以在生產環境中部署。

# 導入必要的庫
from transformers import AutoModelForSequenceClassification# 初始化分詞器和模型
model_name = "bert-base-cased"
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)# 將文本編碼為模型期望的張量格式
inputs = tokenizer(dataset["train"]["text"][:10], padding=True, truncation=True, return_tensors="pt")# 將編碼后的張量輸入模型進行預測
outputs = model(**inputs)# 獲取預測結果和標簽
predictions = outputs.logits.argmax(dim=-1)

3.4 Hugging Face Accelerate

Accelerate 是一個庫,只需添加四行代碼,即可在任何分布式配置中運行相同的 PyTorch 代碼!簡而言之,大規模的訓練和推理變得簡單、高效和適應性強。

from accelerate import Acceleratoraccelerator = Accelerator()model, optimizer, training_dataloader, scheduler = accelerator.prepare(model, optimizer, training_dataloader, scheduler
)

四、基于Hugging Face調用模型

首先需要安裝Hugging Face必要的庫:

pip install transformers

4.1 調用示例

首先安裝 transformers 依賴包:

pip install transformers

from transformers import pipeline#用人家設計好的流程完成一些簡單的任務
classifier = pipeline("sentiment-analysis")
classifier(["I've been waiting for a HuggingFace course my whole life.","I hate this so much!",]
)

這里重點講講pipeline,它是hugging face的基本工具,可以理解為一個端到端(end-to-end)的一鍵調用Transformer模型的工具。它具備了數據預處理、模型處理、模型輸出后處理等步驟,可以直接輸入原始數據,然后給出預測結果,十分方便,在第三部分調用流程中再詳細說明。通過pipeline,可以很方便地調用預訓練模型!

  • 符合預期的正常結果,輸出情感分類的結果:
[{'label': 'POSITIVE', 'score': 0.9598049521446228},{'label': 'NEGATIVE', 'score': 0.9994558691978455}]
  • 不符合預期的異常結果,輸出報錯信息:
OSError: We couldn't connect to 'https://huggingface.co' to load this file, couldn't find it in the cached files and it looks like google/mt5-small is not the path to a directory containing a file named config.json. Checkout your internet connection or see how to run the library in offline mode at 'https://huggingface.co/docs/transformers/installation#offline-mode'.

【報錯原因】:Hugging Face模型在國外,國內服務器無法訪問到國外的模型,需要將模型下載到本地來加載。

【解決步驟】:
在HuggingFace官方找到對應的model:
在這里插入圖片描述
可以看到有非常多 sentiment-analysis 相關的模型,這里我們下載 avichr/heBERT_sentiment_analysis 這個model的相關文件:
在這里插入圖片描述

將下載的文件放到本地"./models/sentiment_analysis" 目錄下,并將代碼修改為:

from transformers import pipeline
model_path = "./models/sentiment_analysis"
classifier = pipeline("sentiment-analysis", model=model_path)  # 通過本地路徑加載模型
classifier(["I've been waiting for a HuggingFace course my whole life.","I hate this so much!",]
)

4.2 調用流程概述

首先原始文本用Tokenizer進行分詞處理得到輸入的文本,然后通過模型進行學習,學習之后進行處理、預測分析。huggingface有個好處,分詞器、數據集、模型都封裝好了!很方便。
在這里插入圖片描述

4.2.1 Tokenizer

Tokenizer會做3件事:

  • 分詞,分字以及特殊字符(起始,終止,間隔,分類等特殊字符可以自己設計的)
  • 對每一個token映射得到一個ID(每個詞都會對應一個唯一的ID)
  • 還有一些輔助信息也可以得到,比如當前詞屬于哪個句子(還有一些MASK,表示是否是原來的詞還是特殊字符等)

Hugging Face中自帶AutoTokenizer工具,可以自動根據模型來判斷采用哪個分詞器:

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 this course my whole life.","I hate this so much!",
]
inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt")
print(inputs)

打印結果(得到兩個字典映射,‘input_ids’,一個tensor集合,每個詞所對應的ID集合;attention_mask,一個tensor集合,表示是否是原來的詞還是特殊字符等):

{'input_ids': tensor([[ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 2023, 2607, 2026, 2878,2166, 1012,  102],[ 101, 1045, 5223, 2023, 2061, 2172,  999,  102,    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, 0, 0, 0, 0, 0, 0, 0]])}

如果想根據id重新獲得原始句子,如下操作:

tokenizer.decode([ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 2023, 2607, 2026, 2878,2166, 1012,  102])

生成的文本會存在特殊字符,這些特殊字符是因為人家模型訓練的時候就加入了這個東西,所以這里默認也加入了(google系的處理)

"[CLS] i've been waiting for a this course my whole life. [SEP]"

4.2.2 模型的加載

模型的加載直接指定好名字即可(先不加輸出層),這里checkpoint相當于一個文本,只是方便引用,checkpoint在hugging face中也是專門用來保留原來模型,然后再來訓練的。

另外AutoModel類也做下說明,AutoModel類及其相關模型類覆蓋了非常多模型。它能夠根據checkpoint名稱分析得到合適的模型架構,并且使用該架構實例化model,方便后續調用。

from transformers import AutoModelcheckpoint = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModel.from_pretrained(checkpoint)
model

打印出來模型架構,就是DistilBertModel(蒸餾后的bert模型,模型參數大約只有原來的60%,訓練更快,但準確率下降不多)的架構了,能看到embeddings層、transformer層,看得還比較清晰:

DistilBertModel((embeddings): Embeddings((word_embeddings): Embedding(30522, 768, padding_idx=0)(position_embeddings): Embedding(512, 768)(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(dropout): Dropout(p=0.1, inplace=False))(transformer): Transformer((layer): ModuleList((0): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(1): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(2): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(3): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(4): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(5): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))))
)

從里面取一個TransformerBlock進行分析,如下所示,可以看出由 注意力層+標準化層+前饋神經網絡(全連接)層+標準化層 組成,可以看到每一層的邏輯,然后由多個TransformerBlock堆疊。哈哈,有這個東東要想改某一層只需要動動手調一調就行了!

TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))

看下輸出層的結構,這里**表示分配字典,按照參數順序依次賦值:

outputs = model(**inputs)
print(outputs.last_hidden_state.shape)

輸出:

torch.Size([2, 15, 768])

4.2.3 模型基本邏輯

根據上面代碼總結模型的邏輯:input—>詞嵌入—>Transformer—>隱藏層—>Head層。

在這里插入圖片描述

4.2.4 加入輸出頭

from transformers import AutoModelForSequenceClassificationcheckpoint = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
outputs = model(**inputs)
print(outputs.logits.shape)

這里就得到分類后的結果:

torch.Size([2, 2])

再來看看模型的結構:

model

輸出:

DistilBertForSequenceClassification((distilbert): DistilBertModel((embeddings): Embeddings((word_embeddings): Embedding(30522, 768, padding_idx=0)(position_embeddings): Embedding(512, 768)(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(dropout): Dropout(p=0.1, inplace=False))(transformer): Transformer((layer): ModuleList((0): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(1): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(2): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(3): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(4): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True))(5): TransformerBlock((attention): MultiHeadSelfAttention((dropout): Dropout(p=0.1, inplace=False)(q_lin): Linear(in_features=768, out_features=768, bias=True)(k_lin): Linear(in_features=768, out_features=768, bias=True)(v_lin): Linear(in_features=768, out_features=768, bias=True)(out_lin): Linear(in_features=768, out_features=768, bias=True))(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)(ffn): FFN((dropout): Dropout(p=0.1, inplace=False)(lin1): Linear(in_features=768, out_features=3072, bias=True)(lin2): Linear(in_features=3072, out_features=768, bias=True))(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)))))(pre_classifier): Linear(in_features=768, out_features=768, bias=True)(classifier): Linear(in_features=768, out_features=2, bias=True)(dropout): Dropout(p=0.2, inplace=False)
)

之后采用softmax進行預測:

import torchpredictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
print(predictions)

輸出:

tensor([[1.5446e-02, 9.8455e-01],[9.9946e-01, 5.4418e-04]], grad_fn=<SoftmaxBackward0>)

id2label這個我們后續可以自己設計,標簽名字對應都可以自己指定:

model.config.id2label

輸出:

{0: 'NEGATIVE', 1: 'POSITIVE'}

參考資料

  • Hugging Face Transformer:從原理到實戰的全面指南
  • Huggingface中Transformer模型使用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23208.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【java 中 IO 流分為幾種?】

文章目錄 概要分類&#xff08;1&#xff09;按照流的方向分類&#xff08;2&#xff09;按照操作數據單位分類&#xff08;3&#xff09;按照IO流的角色分類&#xff08;4&#xff09;常用流的總結 總結 概要 在Java中&#xff0c;IO流主要用于處理數據的傳輸&#xff0c;它們…

軟信天成:告別數據臟亂差!企業數據清洗實戰方案分享

低質量數據普遍存在。據統計&#xff0c;數據質量問題每年給企業造成高達3.1萬億美元的損失。為了防范這種損失&#xff0c;越來越多的企業采用數據清洗來清洗數據&#xff0c;提高數據質量。 數據清洗&#xff0c;顧名思義是將數據上“臟”的部分清洗掉&#xff0c;讓數據變得…

UV膠為什么會開裂?如何避免UV膠開裂?

UV膠為什么會開裂&#xff1f;如何避免UV膠開裂&#xff1f; UV膠開裂可能由以下幾個主要因素導致&#xff1a; 紫外線照射不足&#xff1a;UV膠的固化需要足夠的紫外線能量。如果紫外線照射不足&#xff0c;膠水可能無法完全固化&#xff0c;導致開裂。這可能是由于固化設備…

調試線上資源文件失效問題

之前的老項目&#xff0c;突然報紅&#xff0c;為了定位問題&#xff0c;使用注入和文件替換的方式進行問題定位&#xff01; 1.使用注入 但是刷新后就沒有了&#xff0c;不是特別好用&#xff01; const jqScript document.createElement(script); jqScript.src https://…

從入門到精通:Java三目運算符詳細教程!

哈嘍&#xff0c;各位小伙伴們&#xff0c;你們好呀&#xff0c;我是喵手。運營社區&#xff1a;C站/掘金/騰訊云&#xff1b;歡迎大家常來逛逛 今天我要給大家分享一些自己日常學習到的一些知識點&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相學習&#xff0c;一…

富格林:謹慎欺詐套路防止被騙

富格林指出&#xff0c;近些年來&#xff0c;在全球風險事件頻發的背景下&#xff0c;黃金的避險價值得以凸顯&#xff0c;越來越多投資者被黃金市場可觀的收益所吸引&#xff0c;紛紛加入黃金市場參與投資交易。很多初次接觸黃金的投資者比較關心的是普通投資者如何謹慎欺詐套…

x264 參考幀管理原理:b_ref_reorder 數組變量

b_ref_reorder變量 在x264編碼器中,b_ref_reorder是一個布爾類型的數組,用于標識當前編碼的切片是否需要對參考幀列表進行重排序。這個數組通常有兩個元素,分別對應于兩個參考幀列表:前向參考幀列表(list0)和后向參考幀列表(list1)。 以下是b_ref_reorder的一些關鍵點:…

探索 Linux 中的 Chronyc:一個用于配置和管理 Chrony 的實用工具

探索 Linux 中的 Chronyc&#xff1a;一個用于配置和管理 Chrony 的實用工具 在 Linux 系統中&#xff0c;時間同步是一個至關重要的功能&#xff0c;它確保了系統時間的準確性&#xff0c;對于各種網絡服務和應用來說都至關重要。Chrony 是一個開源的時間同步工具&#xff0c…

SQLserver通過CLR調用TCP接口

一、SQLserver啟用CLR 查看是否開啟CRL&#xff0c;如果run_value1&#xff0c;則表示開啟 EXEC sp_configure clr enabled; GO RECONFIGURE; GO如果未啟用&#xff0c;則執行如下命令啟用CLR sp_configure clr enabled, 1; GO RECONFIGURE; GO二、創建 CLR 程序集 創建新項…

Vue3:eachars 折線圖 數據不聯動 和 tooltip: trigger: ‘axis‘ 不生效,不提示數據

問題1&#xff1a; 點擊折線圖的頭部數據&#xff08;Email、UnionAds等&#xff09; 下面數據線不聯動問題 問題2&#xff1a;下圖是沒有提示數據的Demo 這是echars官網的提示數據圖 3.解決辦法 &#xff08;1&#xff09;檢查是否設置&#xff1a;trigger&#xff1a;axi…

spring 使用多線程,保證事務一致性

1、背景 最近接受到接口優化的任務&#xff0c;查看代碼邏輯后發現在批量處理數據耗時長&#xff0c;想到使用多線程處理批量數據&#xff0c;又要保持原來的事務一致性。 2、實現方法 &#xff08;1&#xff09;、創建多線程事務管理 Component Slf4j public class MultiT…

海外BGP服務器有什么功能?

當企業選擇海外的BGP服務器進行租用時&#xff0c;能夠實現哪些功能呢&#xff1f; 當企業擁有海外的BGP服務器時&#xff0c;可以改善網站的訪問速度&#xff0c;對于面向全球用戶的網站或者是應用來說&#xff0c;能夠通過在不同區域所部署的BGP服務器&#xff0c;用戶可以根…

【Unity Shader入門精要 第13章】使用深度和法線紋理(一)

1. 原理 深度紋理的本質是一張RenderTexture&#xff0c;只不過其中記錄的不是顏色值&#xff0c;而是一個深度值 這些深度值來自于頂點在空間變換后得到的歸一化設備坐標&#xff08;NDC&#xff09;的Z值 由于NDC坐標的分量取值范圍在[-1, 1]之間&#xff0c;要使顏色值能…

基于pytorch的車牌識別

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、導入數據 from torchvision.transforms import transforms from torch.utils.data import DataLoader from torchvision import datase…

RSA 非對稱加密:

非對稱加密 RSA 擁有兩個密鑰&#xff0c; 分別為 公鑰 和 私鑰&#xff0c; 服務器端擁有公鑰和私鑰&#xff0c; 二客戶端&#xff0c;只有公鑰&#xff0c; 這個公鑰可以隨便傳&#xff0c;即使被截獲也沒有關系&#xff0c; 加密使用公鑰&#xff0c; 而解密&#xff0c;…

Mysql時間操作

一、MySql時間戳轉換 select unix_timestamp(); #獲取時間戳格式時間 select FROM_UNIXTIME(1717399499); #將時間戳轉換為普通格式時間二、Mysql時間相加減結果轉換為秒 方法1&#xff1a;time_to_sec(timediff(endTime, startTime)) SELECTDISTINCT(column1),min(last_mo…

在Jenkins 中使用 NVM 管理 Node.js 部署項目的自動化腳本

在Jenkins 中使用 NVM 管理 Node.js 部署項目的自動化腳本 人生旅途&#xff0c;總有人不斷地走來&#xff0c;有人不斷地離去。當新名字變成老名字&#xff0c;當老的名字漸漸模糊&#xff0c;又是一個故事的結束和另一個故事的開始。 在現代軟件開發中&#xff0c;持續集成/持…

容器化實踐:DevOps環境下的容器交付流程

DevOps的興起是為了應對市場和消費者對技術應用的不斷增長的需求。它的目標是構建一個更快的開發環境&#xff0c;同時保持軟件的高質量標準。DevOps還致力于在敏捷開發周期中提升軟件的整體品質。這一目標的實現依賴于多種技術、平臺和工具的綜合運用。 結合容器化技術與DevO…

深入理解mysql中的各種超時屬性

1. 前言 connectTimeout: 連接超時 loginTimeout: 登錄超時 socketTimeout: Socket網絡超時&#xff0c;即讀超時 queryTimeout: sql執行超時 transactionTimeout:spring事務超時 innodb_lock_wait_timeout:innodb鎖等待超時 wait_timeout:非交互式連接關閉前的等待時間 inter…

uniapp小程序多線程 Worker 實戰【2024】

需求 最近遇到個小程序異步解碼的需求&#xff0c;采用了WebAssembly&#xff0c;涉及大量的計算。由于小程序的雙線程模型只有一個線程處理數據&#xff0c;因此智能尋求其它的解決方案。查看小程序的文檔&#xff0c;發現小程序還提供一個異步線程的Worker方案&#xff0c;可…