【Hugging Face】Hugging Face 主要类和函数介绍

2023-05-16

Hugging Face 主要类和函数介绍

  • Hugging face是什么?
  • 什么是自然语言处理?
  • Pipeline
  • Dataset
  • Pipeline on GPU
  • Metrics
  • AutoClasses
  • 在本地保存和加载模型
  • 结论
  • 参考资料

本文旨在为初学者介绍Hugging Face的主要类和函数,包括Pipeline, Datasets, Metrics, and AutoClasses。HuggingFace是一个非常流行的 NLP库。本文包含其主要类和函数的概述以及一些代码示例。可以作为该库的一个入门教程 。本文所有代码通过Colab notebook进行编写!

Hugging face是什么?

Hugging face 是一家总部位于纽约的聊天机器人初创服务商,开发的应用在青少年中颇受欢迎,相比于其他公司,Hugging Face更加注重产品带来的情感以及环境因素。官网链接在此 https://huggingface.co/ 。

但更令它广为人知的是Hugging Face专注于NLP技术,拥有大型的开源社区。尤其是在github上开源的自然语言处理,预训练模型库 Transformers,已被下载超过一百万次,github上超过24000个star。Transformers 提供了NLP领域大量state-of-art的预训练语言模型结构的模型和调用框架。以下是repo的链接(https://github.com/huggingface/transformers)

这个库最初的名称是pytorch-pretrained-bert,它随着BERT一起应运而生。pytorch-pretrained-bert用当时已有大量支持者的pytorch框架复现了BERT的性能,并提供预训练模型的下载,使没有足够算力的开发者们也能够在几分钟内就实现state-of-art-fine-tuning。

直到2019年7月16日,在repo上已经有了包括BERT,GPT,GPT-2,Transformer-XL,XLNET,XLM在内六个预训练语言模型,这时候名字再叫pytorch-pretrained-bert就不合适了,于是改成了pytorch-transformers,势力范围扩大了不少。这还没完!2019年6月Tensorflow2的beta版发布,Huggingface也闻风而动。为了立于不败之地,又实现了TensorFlow 2.0和PyTorch模型之间的深层互操作性,可以在TF2.0/PyTorch框架之间随意迁移模型。在2019年9月也发布了2.0.0版本,同时正式更名为 transformers 。到目前为止,transformers 提供了超过100种语言的,32种预训练语言模型,简单,强大,高性能,是新手入门的不二选择。

但是,对于我们来说,Hugging Face 是一个开源库,用于构建、训练和部署最先进的NLP模型。Hugging Face 提供了两个主要的库,用于模型的transformers 和用于数据集的datasets 。可以直接使用 pip 安装它们。

pip install transformers

什么是自然语言处理?

NLP 是语言学和机器学习交叉领域,专注于理解与人类语言相关的一切。 NLP 任务的目标不仅是单独理解单个单词,而且是能够理解这些单词的上下文。

以下是常见 NLP 任务的列表,每个任务都有一些示例:

  • 对整个句子进行分类: 获取评论的情绪,检测电子邮件是否为垃圾邮件,确定句子在语法上是否正确或两个句子在逻辑上是否相关
  • 对句子中的每个词进行分类: 识别句子的语法成分(名词、动词、形容词)或命名实体(人、地点、组织)
  • 生成文本内容: 用自动生成的文本完成提示,用屏蔽词填充文本中的空白
  • 从文本中提取答案: 给定问题和上下文,根据上下文中提供的信息提取问题的答案
  • 从输入文本生成新句子: 将文本翻译成另一种语言,总结文本

NLP 不仅限于书面文本。它还解决了语音识别和计算机视觉中的复杂挑战,例如生成音频样本的转录或图像描述。

Pipeline

使用transformers库中的Pipeline是开始试验的最快和最简单的方法:通过向Pipeline对象提供任务名称,然后从Hugging Face模型存储库中自动下载合适的模型,然后就可以使用了

transformers库中已经提供了以下的几个任务,例如:

  • 文本分类
  • 问答
  • 翻译
  • 文本摘要
  • 文本生成

除此以外还有计算机视觉音频任务(主要也是基于transformer的)。下面是一个情绪分析任务的例子。为了预测句子的情绪,只需将句子传递给模型。

Transformers 库中最基本的对象是pipeline() 函数。它将模型与其必要的预处理和后处理步骤连接起来,使我们能够通过直接输入任何文本并获得最终的答案:

from transformers import pipeline

classifier = pipeline("sentiment-analysis")
classifier("I've been waiting for a HuggingFace course my whole life.")

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”)和一个分数(即预测标签的分数)。

也可以通过设置模型名称的参数指定要使用的模型,所有的模型和关于模型的信息都在官方文档中提供了。例如下面代码使用的是twitter-roberta-base-sentiment
指定模型名称和参数
执行分析并输出结果:
指定模型进行分析
默认情况下,此pipeline选择一个特定的预训练模型,该模型已针对英语情感分析进行了微调。创建分类器对象时,将下载并缓存模型。如果重新运行该命令,则将使用缓存的模型,无需再次下载模型。

将一些文本传递到pipeline时涉及三个主要步骤

  1. 文本被预处理为模型可以理解的格式。
  2. 预处理的输入被传递给模型。
  3. 模型处理后输出最终人类可以理解的结果。

目前可用的一些pipeline是:

  • 特征提取(获取文本的向量表示)
  • 填充空缺
  • NER(命名实体识别)
  • 问答
  • 情感分析
  • 文本摘要
  • 文本生成
  • 翻译
  • 零样本分类

Dataset

Dataset库可以轻松下载 NLP 中使用的一些最常见的基准数据集。

我们尝试加载Stanford Sentiment Treebank (SST2) ,它包含来自电影评论的句子和对其情感的人工注释。它使用双向(正面和负面)类分割,只有句子级别的标签。我们可以在数据集库下找到SST2数据集,它作为GLUE数据集的一个子集存储。我们使用load_dataset函数加载数据集。

import datasets

dataset = datasets.load_dataset("glue", "sst2")
print(dataset)

执行结果
数据集已经被分为训练集、验证集和测试集。可以使用split参数调用load_dataset函数,直接得到我们感兴趣的数据集的拆分。

dataset = datasets.load_dataset("glue", "sst2", split='train')
print(dataset)

数据集拆分
如果想使用 Pandas 处理数据集,可以直接使用数据集的对象创建df。

import pandas as pd

df = pd.DataFrame(dataset)
df.head()

数据对象

Pipeline on GPU

现在,已经加载了有关情感分析的数据集,我们尝试使用它的情感分析模型。

要提取数据集中的句子列表,我们可以访问其数据属性。预测500个句子的情感,并测量它需要多长时间。

classifier = pipeline("sentiment-analysis")
%time results = classifier(dataset.data["sentence"].to_pylist()[:500])

CPU完成时间
预测 500 个句子需要 27.9 秒,平均每秒 18 个句子。

现在,我们试试 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])

GPU完成时间
预测 500 句只用了 3.1 秒,平均每秒 161 句,速度提高了大约 9 倍!

Metrics

如果想在SST2数据集上测试分类器的效果怎么办?应该使用哪个指标?在 Hugging Face 中,metrics 和 datasets 是配对在一起的。所以可以使用与 load_dataset 函数相同的参数调用 load_metric 函数。

对于 SST2 数据集,指标是准确度(Accuracy)。可以使用以下代码直接通过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

AutoClasses

pipeline在底层是由AutoModelAutoTokenizer类来实现的。AutoClass(即像 AutoModel 和 AutoTokenizer 这样的通用类)是加载模型的快捷方式,它可以从其名称或路径中自动检索预训练模型。在使用时只需要为任务选择合适的AutoModel并使用AutoTokenizer为其关联的分词器:在上面的示例中是对文本进行分类,因此正确的AutoModelAutoModelForSequenceClassification

下面展示如何使用AutoModelForSequenceClassificationAutoTokenizer 来实现与上面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)

AutoClasses
这里使用 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)

tokenizer输出
然后将标记完的句子传递给模型,模型负责输出预测。这个特定的模型输出五个分数,其中每个分数是human review得分的概率,因为分数从 1 到 5。

outputs = model(**encoding)
print(outputs)

输出预测
该模型在logits属性中输出最终结果。将softmax函数应用于logits可以获得每个标签的概率。

from torch import nn

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

最终输出结果

在本地保存和加载模型

最后,展示如何在本地保存模型。这可以使用分词器和模型的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之旅了。

参考资料

  1. Two minutes NLP — Beginner intro to Hugging Face main classes and functions
  2. Hugging face快速入门
  3. Hugging Face NLP course
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Hugging Face】Hugging Face 主要类和函数介绍 的相关文章

随机推荐

  • Content-Type引发的服务端收不到HTTP请求参数的问题

    问题现象 xff1a 前端POST请求参数已经传过来了 xff0c Java后端Debug也能进到请求里 xff0c 可就是取不到请求参数 用Chrome 开发者工具可以看到请求的不同 xff1a 可以看到请求参数一个在Form Data中
  • C++中两个头文件相互引用

    这种做法很显然会出错 xff08 定义一个头文件需要先引进这个头文件自己 xff0c 编译必然报错 xff09 解决方法 xff0c 在头文件中声明另一个类 xff0c 再在源文件中引入头文件 xff0c 就像这样 xff1a a h cl
  • 安装teamveaver时 报错 未安装软件包 libqt5qml5 记录一下

    iser 64 iser 下载 sudo dpkg i teamviewer 15 11 6 amd64 deb sudo iser 的密码 xff1a 正在读取数据库 系统当前共安装有 217060 个文件和目录 正准备解包 teamvi
  • Django教务管理系统|学生选课系统(关注下载源码)

    关注即可下载源码 写在前面 采用Django框架以及MySQL数据库实现BS架构的教务管理系统 xff0c 网页界面模仿了正方软件股份有线公司开发的教务管理系统 题目 建立一个学生选课系统 编写应用程序完成系统开发 建立基本表 xff1a
  • c/c++|解线性方程组的迭代法(高斯-赛德尔迭代法)

    span class token macro property span class token directive keyword include span span class token string lt bits stdc 43
  • C++ 字符(char)转字符串(string)

    char转string 误区 无法使用to string 方法 span class token keyword char span c span class token operator 61 span span class token
  • B树和B+树

    B树 上图是一颗完整的5阶B树 xff0c 符合以下特点 xff1a 对于一个m阶B树 xff0c 每个节点最多有m个分支 xff1b 根节点且不是叶子节点则至少有2个分支 xff0c 而非根非叶节点至少有m 2 xff08 上取整 xff
  • R-Tree

    R Tree R Tree是一颗用来存储高维数据的平衡树 xff0c 它把B树的思想扩展到了多维空间 xff0c 采用了B树分割空间思想 xff0c 并在添加 删除操作时采用合并 分解节点的方法 xff0c 保证树的平衡性 数据结构 每个R
  • 【AI炼丹术】写深度学习代码的一些心得体会

    写深度学习代码的一些心得体会 体会1体会2体会3总结内容来源 一般情况下 xff0c 拿到一批数据之后 xff0c 首先会根据任务先用领域内经典的Model作为baseline跑通 xff0c 然后再在这个框架内加入自己设计的Model x
  • win10配置MMClassification+PyTorch+CUDA

    Win10配置MMClassification 依赖 Python 3 8CUDA 10 2Microsoft Visual C 43 43 14 0PyTorch 1 10 0MMCV 1 3 17MMClassification 0 1
  • 逢七过

    试题描述 相信大家都玩过这个游戏 xff0c 一群人围坐一圈 xff0c 开始喊数 xff0c 是7的倍数或者数中含有7的均要说 过 xff0c 其余的数就直接说出数的大小 为了简化问题 xff0c 我们规定 xff0c 对于下面的情况我们
  • 斐波那契数列

    试题描述 斐波那契数列指的是这样一个数列 xff1a 1 1 2 3 5 8 13 21 34 这个数列从第三项开始 xff0c 每一项都等于前两项之和 请你输出斐波那契数列的前N项 xff08 0 lt N lt 30 xff09 请用循
  • 允许并列的排名

    试题描述 在我们参加的各种竞赛中 xff0c 允许并列的排名方式是经常遇到的 例如有四名选手的成绩分别为50 80 50 30分 xff0c 则80分的选手为第一名 xff0c 50分的两名选手均为第二名 xff0c 30分的选手为第三名
  • n位水仙花数

    试题描述 n位水仙花数是指一个n位数 xff0c 它的每个位上的数字的n次幂之和等于它本身 例如 xff1a 三位水仙花数是指一个三位数 xff0c 它的每个位上的数字的3次幂之和等于它本身 xff08 例如 xff1a 13 43 53
  • 成绩的最高分问题

    试题描述 编写函数ReadScore 和FindMax xff0c 输入某班学生某门课的成绩和学号 xff08 最多不超过40人 xff09 xff0c 当输入为负值时 xff0c 表示输入结束 xff0c 用函数编程通过返回数组中最大元素
  • xcode编译静态库时:**** is not an object file (not allowed in a library)

    出现此错误 xff1a 第一步 xff1a 链接的库是否是存在的且正确的库 a 第二步 xff1a 如果还出现错误 xff0c 那么确定Xcode搜索库路径 Library search paths xff0c 是否有错误 如果在工程目录中
  • Ubuntu桥接模式下无法连接网络的问题

    新装的VMware虚拟机 xff0c 作为开发 xff0c 需要使用桥接模式 xff0c 但是一直无法正常连接网络 xff0c ifconfig一直没有IPV4地址显示 xff0c ping外网也不通 网上的方法也几乎试了个遍 xff0c
  • 黑马程序员————数组,字符串,函数,指针

    Java培训 Android培训 iOS培训 Net培训 期待与您交流 xff01 一 数组的基本概念 只能存放一种类型的数据 xff0c 比如int类型的数组 float类型的数组 里面存放的数据称为 元素 二数组的定义 1 定义 声明数
  • QT控件提升之QPushButton提升为QMenu

    当一个控件进行提升之后 xff0c 就有了新的功能 xff0c 在原来的一些特性基础上 xff0c 发生一些新的改变 QT控件提升方法 xff1a 1 需要写一个需要提升为某种功能的类 2 打开qt设计师 xff0c 在对应需要提升的控件
  • 【Hugging Face】Hugging Face 主要类和函数介绍

    Hugging Face 主要类和函数介绍 Hugging face是什么 xff1f 什么是自然语言处理 xff1f PipelineDatasetPipeline on GPUMetricsAutoClasses在本地保存和加载模型结论