Huggingface使用

转载 · chaplinthink · 2025-04-13 · 原文

Huggingface

Huggingface 既是网站名也是其公司名,随着 transformer 浪潮,Huggingface 逐步收纳了众多最前沿的模型和数据集等有趣的工
作,与 transformers 库结合,可以快速使用学习这些模型。目前提到 NLP 必然绕不开 Huggingface。

Huggingface 的具体介绍

其主要包含:

  • Models(模型),包括各种处理 CV 和 NLP 等任务的模型,上面模型都是可以免费获得
  • Datasets(数据集),包括很多数据集
  • Spaces(分享空间),包括社区空间下最新的一些有意思的分享,可以理解为 huggingface 朋友圈
  • Docs(文档,各种模型算法文档),包括各种模型算法等说明使用文档
  • Solutions(解决方案,体验等),包括 others

Huggingface 的 Models

其中,主要包括计算机视觉、自然语言处理、语音处理、多模态、表格处理、强化学习。

展开介绍:

Computer Vision(计算机视觉任务):
lmage Classification(图像分类),
lmage Segmentation(图像分割)、
zero-Shot lmage Classification(零样本图像分类)、
lmage-to-Image(图像到图像的任务)、
Unconditional lmage Generation(无条件图像生成)、
Object Detection(目标检测)、
Video Classification(视频分类)、
Depth Estimation(深度估计,估计拍摄者距离图像各处的距离)

Natural Language Processing(自然语言处理):
Translation(机器翻译)、
Fill-Mask(填充掩码,预测句子中被遮掩的词)、
Token Classification(词分类)、
Sentence Similarity(句子相似度)、
Question Answering(问答系统),
Summarization(总结,缩句)、
Zero-Shot Classification (零样本分类)、
Text Classification(文本分类)、
Text2Tex(t 文本到文本的生成)、
Text Generation(文本生成)、
Conversational(聊天)、
Table Question Answer(表问答,1.预测表格中被遮掩单词 2.数字推理,判断句子是否被表格数据支持)

Audio(语音):
Automatic Speech Recognition(语音识别)、
Audio Classification(语音分类)、
Text-to-Speech(文本到语音的生成)、
Audio-to-Audio(语音到语音的生成)、
Voice Activity Detection(声音检测、检测识别出需要的声音部分)

Multimodal(多模态):
Feature Extraction(特征提取)、
Text-to-Image(文本到图像)、
Visual Question Answering(视觉问答)、
Image2Text(图像到文本)、
Document Question Answering(文档问答)

Tabular(表格):
Tabular Classification(表分类)、
Tabular Regression(表回归)

Reinforcement Learning(强化学习):
Reinforcement Learning(强化学习)、
Robotics(机器人)

模型的使用

一般来说,页面上会给出模型的介绍。例如,我们打开其中一个 fill-mask 任务下下载最多的模型 bert-base-uncased

需要提前安装 transformers 库,可以直接 pip install transformers 安装。还有 Pytorch 或 TensorFlow 库,读者自行下载。

下载完后可以使用 pipeline 直接简单的使用这些模型。第一次执行时 pipeline 会加载模型,模型会自动下载到本地,可以直接用。

第一个参数是任务类型,第二个是具体模型名字

from transformers import pipeline

unmasker = pipeline('fill-mask', model='bert-base-uncased')

unmasker("Hello I'm a [MASK] model.")

运行结果:

[
    {
        "score": 0.10731087625026703,
        "token": 4827,
        "token_str": "fashion",
        "sequence": "hello i ' m a fashion model."
    },
    {
        "score": 0.08774463832378387,
        "token": 2535,
        "token_str": "role",
        "sequence": "hello i ' m a role model."
    },
    {
        "score": 0.053383927792310715,
        "token": 2047,
        "token_str": "new",
        "sequence": "hello i ' m a new model."
    },
    {
        "score": 0.046672236174345016,
        "token": 3565,
        "token_str": "super",
        "sequence": "hello i ' m a super model."
    },
    {
        "score": 0.027095887809991837,
        "token": 2986,
        "token_str": "fine",
        "sequence": "hello i ' m a fine model."
    }
]

可以自定义加载输入分词器:使用 AutoTokenizer

from transformers import AutoTokenizer 
#下面这种方式可以自动加载 bert-base-uncased 中使用的分词器
tokenizer=AutoTokenizer.from_pretrained("bert-base-uncased")

可以自定义加载模型结构:使用 AutoModel , 不包括输入分词器和输出部分!!!

from transformers import AutoModel
#下面这种方式可以自动加载 bert-base-uncased 中使用的模型,没有最后的全连接输出层和 softmax
model=AutoModel.from_pretrained("bert-base-uncased")

可以自定义加载模型和输出部分:使用 AutoModelForSequenceClassification 等

from transformers import AutoModelForSequenceClassification
#下面这种方式可以自动加载 bert-base-uncased 中使用的模型(包括了输出部分),有最后的全连接输出层
model=AutoModel.AutoModelForSequenceClassification("bert-base-uncased")

模型保存

model.save_pretrained("./")#保持到当前目录

一个简单的流程例子
代码接收一个句子列表,对其进行分词,将其传递给一个预训练的情感分析模型,然后处理输出以获得每个类别的预测概率。最后,将结果打印到控制台

input=['The first sentence!','The second sentence!']

from transformers import AutoTokenizer

#从 Transformers 库中导入 AutoTokenizer 类,用于对输入句子进行分词。
#分词是将文本转换为数值标记的过程,这些标记可以被模型理解。from_pretrained 方法加载一个预训练的分词器
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")

#使用 tokenizer 对象对输入句子进行分词。padding=True 参数确保所有句子都被填充到相同的长度,
#truncation=True 截断过长的句子,return_tensors='pt' 返回 PyTorch 张量
input = tokenizer(input, padding=True, truncation=True, return_tensors='pt')

from transformers import AutoModelForSequenceClassification
# 模型加载:使用 AutoModelForSequenceClassification 类加载一个预训练的序列分类模型。
# from_pretrained 方法加载模型
model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")

print(model)

# 模型推理
output = model(**input)

print(output.logits.shape)

import torch

predictions = torch.nn.functional.softmax(output.logits, dim=-1)

# 打印预测概率
print(predictions)

# ID 到标签的映射
print(model.config.id2label)

Huggingface的Datasets

导入数据集的方法
提前 pip install datasets

from datasets import load_dataset

datasets = load_dataset('glue', 'mrpc')  # 加载glue数据集
print(datasets)  # 打印数据集

print(datasets['train'][0])  # 打印第一个样本

下面给出 bert-base-uncased 的例子,实现对两个句子的相似度计算

# 导入tokenizer

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")

# input = tokenizer("The first sentence!", "The second sentence!")
#
# print(tokenizer.convert_ids_to_tokens(input['input_ids']))


# 实际使用 tokenizer 的方法,得到 tokenizer_data
def tokenize_function(examples):
    return tokenizer(examples['sentence1'], examples['sentence2'], truncation=True)


from datasets import load_dataset
datasets = load_dataset("glue", "mrpc")
tokenizer_data = datasets.map(tokenize_function, batched=True)
print(tokenizer_data)

# 训练参数
from transformers import TrainingArguments

# https://huggingface.co/docs/transformers/main_classes/trainer#transformers.TrainingArguments
training_args = TrainingArguments("test_trainer")
print(training_args)#看下默认值

# 导入模型
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

#导入数据处理的一个东西 DataCollatorWithPadding,变成一个一个 batch
from transformers import DataCollatorWithPadding

data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

#导入训练器,进行训练,API : https://huggingface.co/docs/transformers/main_classes/trainer#transformers.Traine

from transformers import Trainer
trainer = Trainer(
    model,
    training_args,
    train_dataset=tokenizer_data["train"],
    eval_dataset=tokenizer_data["validation"],
    data_collator=data_collator,
    tokenizer=tokenizer,
)

trainer.train()