网站首页 > 技术文章 正文
主要包括Pipeline, Datasets, Metrics, and AutoClasses
HuggingFace是一个非常流行的 NLP 库。本文包含其主要类和函数的概述以及一些代码示例。可以作为该库的一个入门教程 。
Hugging Face 是一个开源库,用于构建、训练和部署最先进的 NLP 模型。Hugging Face 提供了两个主要的库,用于模型的transformers 和用于数据集的datasets 。 可以直接使用 pip 安装它们。
pip install transformers datasets
Pipeline
使用transformers库中的Pipeline是开始试验的最快和最简单的方法:通过向Pipeline对象提供任务名称,然后从 Hugging Face 模型存储库中自动下载合适的模型,然后就可以使用了!
transformers库中已经提供了以下的几个任务,例如:
- 文本分类
- 问答
- 翻译
- 文本摘要
- 文本生成
除此以外还有计算机视觉和音频任务(主要也是基于transformer的)
下面是一个情绪分析任务的例子。 为了预测句子的情绪,只需将句子传递给模型。
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
results = classifier("I'm so happy today!")
print(f"{results[0]['label']} with score {results[0]['score']}")
# POSITIVE with score 0.9998742341995239
模型的输出是一个字典列表,其中每个字典都有一个标签(对于这个特定示例,值为“POSITIVE”或“NEGATIVE”)和一个分数(即预测标签的分数)。
可以为分类器提供多个句子,并在一个函数调用中获得所有结果。
results = classifier(["I'm so happy today!", "I hope you don't hate him..."])
for result in results:
print(f"{result['label']} with score {result['score']}")
# POSITIVE with score 0.9998742341995239
# NEGATIVE with score 0.6760789155960083
也可以通过设置模型名称的参数指定要使用的模型,所有的模型和关于模型的信息都在官方文档中提供了,例如下面代码使用的是twitter-roberta-base-sentiment
classifier = pipeline("sentiment-analysis",
model="cardiffnlp/twitter-roberta-base-sentiment",
tokenizer="cardiffnlp/twitter-roberta-base-sentiment")
# three possible outputs:
# LABEL_0 -> negative
# LABEL_1 -> neutral
# LABEL_2 -> positive
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"{result['label']} with score {result['score']}")
# LABEL_2 with score 0.9814898371696472
# LABEL_1 with score 0.5063014030456543
Dataset
Dataset库可以轻松下载 NLP 中使用的一些最常见的基准数据集。
例如需要加载Stanford Sentiment Treebank(SST2,。 它的目标是二元(正面和负面)分类,只有句子级别的标签。 可以直接使用 load_dataset 函数加载数据集。
import datasets
dataset = datasets.load_dataset("glue", "sst2")
print(dataset)
DatasetDict({
train: Dataset({
features: ['sentence', 'label', 'idx'],
num_rows: 67349
})
validation: Dataset({
features: ['sentence', 'label', 'idx'],
num_rows: 872
})
test: Dataset({
features: ['sentence', 'label', 'idx'],
num_rows: 1821
})
})
数据集已经被分为训练集、验证集和测试集。可以使用 split 参数调用 load_dataset 函数,直接得到我们感兴趣的数据集的拆分。
dataset = datasets.load_dataset("glue", "sst2", split='train')
print(dataset)
Dataset({
features: ['sentence', 'label', 'idx'],
num_rows: 67349
})
如果想使用 Pandas 处理数据集,可以直接使用数据集的对象创建df。
import pandas as pd
df = pd.DataFrame(dataset)
df.head()
使用GPU
现在已经加载了一个关于情感分析的数据集,下面开始创建一个情感分析模型。
首先测试下预测 500 个句子的情绪并测量它需要多少时间。
classifier = pipeline("sentiment-analysis")
%time results = classifier(dataset.data["sentence"].to_pylist()[:500])
# CPU times: user 21.9 s, sys: 56.9 ms, total: 22 s
# Wall time: 21.8 s
预测 500 个句子需要 21.8 秒,平均每秒 23 个句子。我们试试 GPU。
为了让分类器使用 GPU,首先必须保证GPU是可用的,然后用参数device=0 。这样就可以在 支持CUDA 的GPU上运行模型,其中从零开始的每个 id 都映射到一个 CUDA 设备,值 -1 是 CPU。
classifier = pipeline("sentiment-analysis", device=0)
%time results = classifier(dataset.data["sentence"].to_pylist()[:500])
# CPU times: user 4.07 s, sys: 49.6 ms, total: 4.12 s
# Wall time: 4.11 s
预测 500 句只用了 4.1 秒,平均每秒 122 句,速度提高了大约 6 倍!这就对了
指标
如果想在 SST2 数据集上测试分类器的质量怎么办? 应该使用哪个指标?
在 Hugging Face 中,metrics 和 datasets 是配对在一起的。 所以可以使用与 load_dataset 函数相同的参数调用 load_metric 函数。
对于 SST2 数据集,指标是准确度。可以使用以下代码直接通过metric获得指标值。
metric = datasets.load_metric("glue", "sst2")
n_samples = 500
X = dataset.data["sentence"].to_pylist()[:n_samples]
y = dataset.data["label"].to_pylist()[:n_samples]
results = classifier(X)
predictions = [0 if res["label"] == "NEGATIVE" else 1 for res in results]
print(metric.compute(predictions=predictions, references=y))
# {'accuracy': 0.988}
AutoClasses
pipeline 在底层是由 AutoModel 和 AutoTokenizer 类来实现的。 AutoClass(即像 AutoModel 和 AutoTokenizer 这样的通用类)是加载模型的快捷方式,它可以从其名称或路径中自动检索预训练模型。 在使用时只需要为任务选择合适的 AutoModel 并使用 AutoTokenizer 为其关联的分词器:在这个示例中是对文本进行分类,因此正确的 AutoModel 是 AutoModelForSequenceClassification。
下面我们看看如何使用 AutoModelForSequenceClassification 和 AutoTokenizer 来实现与上面Pipeline相同的功能:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
model_name = "nlptown/bert-base-multilingual-uncased-sentiment"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
这里使用 AutoTokenizer 创建一个分词器对象,并使用 AutoModelForSequenceClassification 创建一个模型对象。 只需要传递模型的名称,剩下的事情都会自动完成。
接下来让我们看看如何使用分词器对句子进行分词。 tokenizer 输出是一个字典,由 input_ids(即在输入句子中检测到的每个 token 的 id,取自 tokenizer 词汇表)、token_type_ids(用于需要两个文本进行预测的模型中,我们现在可以忽略它们)组成的字典, 和 attention_mask(显示在标记化期间发生填充的位置)。
encoding = tokenizer(["Hello!", "How are you?"], padding=True,
truncation=True, max_length=512, return_tensors="pt")
print(encoding)
{'input_ids': tensor([[ 101, 29155, 106, 102, 0, 0],
[ 101, 12548, 10320, 10855, 136, 102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 0, 0],
[1, 1, 1, 1, 1, 1]])}
然后将标记完的句子传递给模型,模型负责输出预测。 这个特定的模型输出五个分数,其中每个分数是评论得分的概率,因为分数从 1 到 5。
outputs = model(**encoding)
print(outputs)
SequenceClassifierOutput(loss=None, logits=tensor([[-0.2410, -0.9115, -0.3269, -0.0462, 1.2899],
[-0.3575, -0.6521, -0.4409, 0.0471, 0.9552]],
grad_fn=<AddmmBackward0>), hidden_states=None, attentions=None)
该模型在 logits 属性中输出最终结果。 将 softmax 函数应用于 logits 可以获得每个标签的概率。
from torch import nn
pt_predictions = nn.functional.softmax(outputs.logits, dim=-1)
print(pt_predictions)
tensor([[0.1210, 0.0619, 0.1110, 0.1470, 0.5592],
[0.1269, 0.0945, 0.1168, 0.1902, 0.4716]], grad_fn=<SoftmaxBackward0>)
在本地保存和加载模型
最后,看看如何在本地保存模型。 这可以使用分词器和模型的 save_pretrained 函数来完成。
pt_save_directory = "./model"
tokenizer.save_pretrained(pt_save_directory)
model.save_pretrained(pt_save_directory)
如果要加载之前保存的模型,可以使用AutoModel 类的 from_pretrained 函数加载它。
model = AutoModelForSequenceClassification.from_pretrained("./model")
总结
在本文中介绍了Hugging Face 库的主要类和函数。 包括transformers 的datasets库,以及如何使用Pipeline在几行代码中加载模型,并让这些代码在 CPU 或 GPU 上运行,还介绍了如何直接从库中加载基准数据集以及如何计算指标。 最后还演示了如何使用最重要的两个类 AutoModel 和 AutoTokenizer和如何在本地保存和加载模型,通过以上的介绍我想已经可以使用Hugging Face库开始你的NLP之旅了。
作者:Fabio Chiusano
猜你喜欢
- 2024-10-12 动手实现卷积神经网络 卷积神经网络教程
- 2024-10-12 【机器学习】Sigmoid和Softmax的区别
- 2024-10-12 视觉Transformer中ReLU替代softmax,DeepMind新招让成本速降
- 2024-10-12 首个快速知识蒸馏的视觉框架:ResNet50 80.1%精度,训练加速30%
- 2024-10-12 RBF-Softmax:让模型学到更具表达能力的类别表示
- 2024-10-12 深度学习入门指南:25个初学者需要知道的概念
- 2024-10-12 英伟达又赚到了!FlashAttention3来了:H100利用率飙升至75%
- 2024-10-12 Softmax简介 简述softmax回归与线性回归相同与不同
- 2024-10-12 商汤最新论文登上ICLR 2022:给注意力机制Softmax找个“平替”
- 2024-10-12 深度残差学习在图像识别中的应用综述
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)