🤗 Transformers 库能做什么¶
🤗 Transformers 是一个包含预训练最先进模型的库,可用于自然语言处理(NLP)、计算机视觉和音频及语音处理任务。该库不仅包含 Transformer 模型,还包括用于计算机视觉任务的现代卷积网络。如今,许多流行的产品,如智能手机、应用程序和电视,都依赖于某种深度学习技术。想从手机拍摄的照片中移除背景物体吗?这就是全景分割任务的一个例子(如果您还不了解这指的是什么,别担心,我们将在下面的章节中详细介绍)。
本页面概述了使用 🤗 Transformers 库,只需三行代码即可解决的音频和语音、计算机视觉以及 NLP 任务。
音频¶
音频和语音处理任务与其他模态任务有所不同,主要是因为音频作为输入是一个连续信号。与文本不同,原始音频波形无法像句子被分成词那样被整齐地分割成离散块。为了解决这个问题,通常会在固定的时间间隔内对原始音频信号进行采样。在相同时间间隔内采样次数越多,采样率越高,音频越接近原始音频源。
以前的方法会预先处理音频以提取有用特征。现在,更常见的是直接将原始音频波形输入特征编码器,以提取音频表示。这简化了预处理步骤,并使模型能够学习最重要的特征。
音频分类¶
音频分类任务是根据预定义的类别对音频数据进行标注。这是一个广泛的任务,具体应用包括:
- 声景分类:给音频标注场景标签(例如“办公室”、“海滩”、“体育场”)
- 声学事件检测:给音频标注声音事件标签(例如“汽车喇叭声”、“鲸鱼叫声”、“玻璃破碎声”)
- 标签:给包含多个声音的音频标注(例如鸟鸣声、会议中的发言人识别)
- 音乐分类:根据音乐类型给音乐分类(例如“金属”、“嘻哈”、“乡村”)
from transformers import pipeline
classifier = pipeline(task="audio-classification", model="superb/hubert-base-superb-er")
preds = classifier("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
自动语音识别¶
自动语音识别(ASR)将语音转录为文本。由于语音是人类自然的交流方式,因此 ASR 是最普遍的音频任务之一。如今,ASR 系统已嵌入到智能扬声器、手机和汽车等产品中。我们可以要求虚拟助手播放音乐、设置提醒并告知天气。
Transformer 架构有助于解决低资源语言的问题。通过在大量语音数据上进行预训练,仅使用一个小时内标签化的低资源语言语音数据进行微调,就能获得高质量的结果,而以前的 ASR 系统需要 100 倍以上的标签化数据。
from transformers import pipeline
transcriber = pipeline(task="automatic-speech-recognition", model="openai/whisper-small")
transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
计算机视觉¶
计算机视觉领域的早期成功任务之一是使用卷积神经网络(CNN)识别邮政编码数字。图像由像素组成,每个像素有一个数值。这使得图像可以表示为像素值的矩阵。每个特定的像素值组合描述了图像的颜色。
解决计算机视觉任务的两种常见方法是:
- 使用卷积来学习图像的分层特征,从低级特征到高级抽象特征。
- 将图像分成块,并使用 Transformer 逐步学习每个图像块之间的关系,从而形成图像。与 CNN 偏好的自底向上方法不同,这种方法更像是从模糊图像开始,然后逐渐聚焦。
图像分类¶
图像分类是对整张图像进行预定义类别标注。像大多数分类任务一样,图像分类有许多实际应用场景,例如:
- 医疗保健:标注医学图像以检测疾病或监测患者健康
- 环境:标注卫星图像以监测森林砍伐、指导荒地管理或检测野火
- 农业:标注作物图像以监测植物健康或卫星图像进行土地利用监测
- 生态学:标注动植物图像以监测野生动物数量或跟踪濒危物种
from transformers import pipeline
classifier = pipeline(task="image-classification")
preds = classifier("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg")
preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
print(*preds, sep="\n")
目标检测¶
与图像分类不同,目标检测识别图像中的多个对象及其在图像中的位置(通过边界框定义)。目标检测的应用示例包括:
- 自动驾驶车辆:检测日常交通物体,如其他车辆、行人和交通灯
- 遥感:灾难监测、城市规划和天气预报
- 缺陷检测:检测建筑物中的裂缝或结构损坏以及制造缺陷
from transformers import pipeline
detector = pipeline(task="object-detection")
preds = detector("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg")
preds = [{"score": round(pred["score"], 4), "label": pred["label"], "box": pred["box"]} for pred in preds]
图像分割¶
图像分割是一项像素级任务,它将图像中的每个像素分配给一个类别。与目标检测使用边界框标注和预测图像中的对象不同,分割更细致,可以检测到像素级别的对象。图像分割有几种类型:
- 实例分割:除了标注对象类别,还标注每个独立实例(例如“狗-1”、“狗-2”)
- 全景分割:结合语义分割和实例分割;它为每个像素标注语义类别和每个独立实例的对象
分割任务对自动驾驶车辆很有帮助,可以为车辆创建周围世界的像素级地图,以安全地避开行人和其他车辆。在医疗成像中,更细致的分割可以识别异常细胞或器官特征。图像分割也可以用于电子商务,通过覆盖虚拟对象来虚拟试穿衣物或创建增强现实体验。
from transformers import pipeline
segmenter = pipeline(task="image-segmentation")
preds = segmenter("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg")
preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
print(*preds, sep="\n")
深度估计¶
深度估计预测图像中每个像素到相机的距离。这项计算机视觉任务对于场景理解和重建非常重要。例如,在自动驾驶车辆中,车辆需要理解行人、交通标志和其他车辆的距离,以避免障碍物和碰撞。深度信息对于从 2D 图像构建 3D 表示也非常有用,可以用于创建高质量的生物结构或建筑物的 3D 表示。
深度估计有两种方法:
- 立体方法:通过比较从不同角度拍摄的两张图像来估计深度。
- 单目方法:从单张图像估计深度。
from transformers import pipeline
depth_estimator = pipeline(task="depth-estimation")
depth_estimator("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg")
自然语言处理¶
NLP 任务是最常见的任务之一,因为文本是人类自然的交流方式之一。为了将文本转换为模型可以识别的格式,需要对其进行分词。这意味着将一段文本分成单独的词语或子词(tokens),然后将这些 tokens 转换为数字。结果,你可以将一段文本表示为数字序列,一旦有了数字序列,就可以将其输入模型以解决各种 NLP 任务!
文本分类¶
类似于其他模态的分类任务,文本分类根据预定义的类别对文本序列(可以是句子、段落或文档)进行标注。文本分类有许多实际应用,例如:
- 情感分析:根据一些极性(如“积极”或“消极”)对文本进行标注,这可以帮助政治、金融和营销领域的决策。
- 内容分类:根据某些主题(如“天气”、“体育”、“金融”等)对文本进行标注,以帮助整理和过滤新闻和社交媒体信息。
from transformers import pipeline
classifier = pipeline(task="sentiment-analysis")
preds = classifier("Hugging Face 是自切片面包以来最好的东西!")
preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
词分类¶
在任何 NLP 任务中,文本会通过将文本序列分为单独的词或子词(tokens)进行预处理。词分类将每个 token 分配一个预定义类别中的标签。
常见的词分类任务包括:
- 命名实体识别(NER):根据实体类别(如组织、人名、地点或日期)标注 token。NER 在生物医学领域中非常受欢迎,可以标注基因、蛋白质和药物名称。
- 词性标注(POS):根据语法类别(如名词、动词或形容词)标注 token。POS 对帮助翻译系统理解两个相同单词之间的语法差异(如名词“银行”与动词“银行”)非常有用。
from transformers import pipeline
classifier = pipeline(task="ner")
preds = classifier("Hugging Face 是一家总部位于纽约市的法国公司。")
preds = [
{
"entity": pred["entity"],
"score": round(pred["score"], 4),
"index": pred["index"],
"word": pred["word"],
"start": pred["start"],
"end": pred["end"],
}
for pred in preds
]
print(*preds, sep="\n")
问答¶
问答是另一个 token 级别的任务,它根据问题返回答案,有时带有上下文(开放域)有时不带上下文(封闭域)。当我们在虚拟助手处询问餐厅是否营业时,就会用到问答任务。它还可以用于提供客户服务或技术支持,并帮助搜索引擎检索相关信息。
常见的问答类型有:
- 抽取式:给定问题和一些上下文,答案是从上下文中提取的文本片段。
- 生成式:给定问题和一些上下文,答案是从上下文中生成的。此方法由 Text2TextGenerationPipeline 处理,而不是 QuestionAnsweringPipeline。
from transformers import pipeline
question_answerer = pipeline(task="question-answering")
preds = question_answerer(
question="仓库的名称是什么?",
context="仓库的名称是 huggingface/transformers",
)
print(
f"score: {round(preds['score'], 4)}, start: {preds['start']}, end: {preds['end']}, answer: {preds['answer']}"
)
摘要生成¶
摘要生成创建一个较短版本的文本,同时尽量保留原始文档的大部分含义。摘要是序列到序列任务,其输出文本序列短于输入。许多长文档可以被概括以帮助读者快速了解主要信息,例如立法法案、法律和金融文件、专利和科学论文。
与问答类似,摘要生成也有两种类型:
- 抽取式:从原始文本中识别并提取最重要的句子。
- 生成式:从原始文本中生成目标摘要(可能包含输入文档中不存在的新词)。SummarizationPipeline 使用生成式方法。
from transformers import pipeline
summarizer = pipeline(task="summarization")
summarizer(
"在本文中,我们介绍了 Transformer,这是一种完全基于注意力机制的序列转换模型,取代了编码器-解码器架构中最常用的循环层,使用多头自注意力。对于翻译任务,Transformer 可以显著更快地进行训练,优于基于循环或卷积层的架构。在 WMT 2014 英语到德语和 WMT 2014 英语到法语的翻译任务中,我们达到了新的最先进水平。在前一个任务中,我们的最佳模型优于所有先前报告的集成模型。"
)
翻译¶
翻译将一种语言的文本转换为另一种语言。它在帮助来自不同背景的人交流、帮助翻译内容以到达更广泛的受众以及作为学习工具帮助人们学习新语言方面非常重要。与摘要生成一样,翻译也是序列到序列任务,意味着模型接收输入序列并返回目标输出序列。
早期,翻译模型主要是单语的,但近年来,对多语言模型的兴趣不断增加,这些模型可以在多种语言对之间进行翻译。
from transformers import pipeline
text = "将英文翻译成法文:Hugging Face 是一个以社区为基础的开源机器学习平台。"
translator = pipeline(task="translation", model="google-t5/t5-small")
translator(text)
语言建模¶
语言建模任务是预测文本序列中的一个词语。由于预训练语言模型可以通过微调解决许多其他下游任务,因此它已成为非常流行的 NLP 任务。最近,大型语言模型(LLMs)引起了广泛关注,它们可以实现零样本或少样本学习,这意味着模型可以解决它没有专门训练过的任务!语言模型可以生成流畅和有说服力的文本,但需要注意的是,生成的文本并不总是准确的。
语言建模有两种类型:
因果式:模型的目标是预测序列中的下一个 token,未来的 token 被遮盖。
from transformers import pipeline prompt = "Hugging Face 是一个以社区为基础的开源机器学习平台。" generator = pipeline(task="text-generation") generator(prompt) # doctest: +SKIP
遮盖式:模型的目标是预测序列中被遮盖的 token,完全访问序列中的所有 token。
from transformers import pipeline text = "Hugging Face 是一个以社区为基础的开源 <mask> 机器学习。" fill_mask = pipeline(task="fill-mask") preds = fill_mask(text, top_k=1) preds = [ { "score": round(pred["score"], 4), "token": pred["token"], "token_str": pred["token_str"], "sequence": pred["sequence"], } for pred in preds ]
多模态¶
多模态任务需要模型处理多种数据模态(文本、图像、音频、视频)以解决特定问题。图像字幕生成就是一个多模态任务的例子,模型以图像作为输入,输出描述图像或图像属性的文本序列。
尽管多模态模型处理不同类型的数据,但在内部,预处理步骤帮助模型将所有数据类型转换为嵌入(向量或数字列表,包含有关数据的有意义信息)。对于图像字幕生成任务,模型学习图像嵌入和文本嵌入之间的关系。
文档问答¶
文档问答任务是根据文档回答自然语言问题。与基于文本的问答任务不同,文档问答以文档图像作为输入,并附带关于文档的问题,以返回答案。文档问答可以用于解析结构化文档并从中提取关键信息。例如,可以从收据中提取总金额和找零金额。
from transformers import pipeline
from PIL import Image
import requests
url = "https://huggingface.co/datasets/hf-internal-testing/example-documents/resolve/main/jpeg_images/2.jpg"
image = Image.open(requests.get(url, stream=True).raw)
doc_question_answerer = pipeline("document-question-answering", model="magorshunov/layoutlm-invoices")
preds = doc_question_answerer(
question="总金额是多少?",
image=image,
)
希望本页面为您提供了一些关于各个模态任务类型及其实际重要性的背景信息。在下一章节中,您将了解 🤗 Transformers 是如何解决这些任务的。