Transformers 文档
🤗 Transformers 的功能
并获得增强的文档体验
开始使用
🤗 Transformers 的功能
🤗 Transformers 是一个用于自然语言处理 (NLP)、计算机视觉以及音频和语音处理任务的预训练最先进模型库。该库不仅包含 Transformer 模型,还包含非 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]
>>> preds
[{'score': 0.4532, 'label': 'hap'},
{'score': 0.3622, 'label': 'sad'},
{'score': 0.0943, 'label': 'neu'},
{'score': 0.0903, 'label': 'ang'}]
自动语音识别
自动语音识别 (ASR) 将语音转录为文本。它是最常见的音频任务之一,部分原因是语音是人类交流的自然形式。如今,ASR 系统已嵌入到扬声器、电话和汽车等“智能”技术产品中。我们可以要求虚拟助手播放音乐、设置提醒并告诉我们天气。
但是 Transformer 架构帮助解决的关键挑战之一是低资源语言。通过在大量语音数据上进行预训练,与以前在 100 倍以上的标记数据上训练的 ASR 系统相比,在低资源语言中仅在一个小时的标记语音数据上微调模型仍然可以产生高质量的结果。
>>> 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")
{'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}
计算机视觉
最早和最成功的计算机视觉任务之一是使用卷积神经网络 (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")
{'score': 0.4335, 'label': 'lynx, catamount'}
{'score': 0.0348, 'label': 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor'}
{'score': 0.0324, 'label': 'snow leopard, ounce, Panthera uncia'}
{'score': 0.0239, 'label': 'Egyptian cat'}
{'score': 0.0229, 'label': 'tiger cat'}
物体检测
与图像分类不同,物体检测识别图像中的多个物体以及物体在图像中的位置(由边界框定义)。物体检测的一些示例应用包括
- 自动驾驶汽车:检测日常交通物体,例如其他车辆、行人和交通信号灯
- 遥感:灾害监测、城市规划和天气预报
- 缺陷检测:检测建筑物中的裂缝或结构损坏以及制造缺陷
>>> 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]
>>> preds
[{'score': 0.9865,
'label': 'cat',
'box': {'xmin': 178, 'ymin': 154, 'xmax': 882, 'ymax': 598}}]
图像分割
图像分割是一项像素级任务,它将图像中的每个像素分配给一个类。它与物体检测不同,物体检测使用边界框来标记和预测图像中的物体,因为分割更精细。分割可以像素级检测物体。图像分割有几种类型
- 实例分割:除了标记物体的类别外,它还标记物体的每个不同实例(“狗-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")
{'score': 0.9879, 'label': 'LABEL_184'}
{'score': 0.9973, 'label': 'snow'}
{'score': 0.9972, 'label': 'cat'}
深度估计
深度估计预测图像中每个像素到相机的距离。此计算机视觉任务对于场景理解和重建尤为重要。例如,在自动驾驶汽车中,车辆需要了解行人、交通标志和其他车辆等物体的距离,以避免障碍物和碰撞。深度信息还有助于从 2D 图像构建 3D 表示,并且可以用于创建生物结构或建筑物的高质量 3D 表示。
深度估计有两种方法
- 立体:通过比较来自略微不同角度的同一图像的两张图像来估计深度
- 单目:从单个图像估计深度
>>> from transformers import pipeline
>>> depth_estimator = pipeline(task="depth-estimation")
>>> preds = depth_estimator(
... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
... )
自然语言处理
NLP 任务是最常见的任务类型之一,因为文本是我们交流的自然方式。要使文本成为模型可识别的格式,需要对其进行标记化。这意味着将文本序列划分为单独的单词或子词(标记),然后将这些标记转换为数字。因此,您可以将文本序列表示为数字序列,一旦有了数字序列,就可以将其输入到模型中以解决各种 NLP 任务!
文本分类
与任何模态中的分类任务一样,文本分类从预定义的类集中标记文本序列(可以是句子级、段落或文档)。文本分类有许多实际应用,其中一些包括
- 情感分析:根据某些极性(如
正面
或负面
)标记文本,这可以为政治、金融和营销等领域的决策提供信息和支持 - 内容分类:根据某些主题标记文本,以帮助组织和过滤新闻和社交媒体提要中的信息(
天气
、体育
、金融
等)
>>> from transformers import pipeline
>>> classifier = pipeline(task="sentiment-analysis")
>>> preds = classifier("Hugging Face is the best thing since sliced bread!")
>>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
>>> preds
[{'score': 0.9991, 'label': 'POSITIVE'}]
标记分类
在任何 NLP 任务中,文本都通过将文本序列分成单独的单词或子词来预处理。这些被称为标记。标记分类为每个标记分配来自预定义类集的标签。
两种常见的标记分类类型是
- 命名实体识别 (NER):根据实体类别(如组织、人物、地点或日期)标记标记。NER 在生物医学环境中尤其受欢迎,它可以标记基因、蛋白质和药物名称。
- 词性标注 (POS):根据标记的词性(如名词、动词或形容词)标记标记。POS 有助于翻译系统理解两个相同的词在语法上如何不同(bank 作为名词与 bank 作为动词)。
>>> from transformers import pipeline
>>> classifier = pipeline(task="ner")
>>> preds = classifier("Hugging Face is a French company based in New York City.")
>>> 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")
{'entity': 'I-ORG', 'score': 0.9968, 'index': 1, 'word': 'Hu', 'start': 0, 'end': 2}
{'entity': 'I-ORG', 'score': 0.9293, 'index': 2, 'word': '##gging', 'start': 2, 'end': 7}
{'entity': 'I-ORG', 'score': 0.9763, 'index': 3, 'word': 'Face', 'start': 8, 'end': 12}
{'entity': 'I-MISC', 'score': 0.9983, 'index': 6, 'word': 'French', 'start': 18, 'end': 24}
{'entity': 'I-LOC', 'score': 0.999, 'index': 10, 'word': 'New', 'start': 42, 'end': 45}
{'entity': 'I-LOC', 'score': 0.9987, 'index': 11, 'word': 'York', 'start': 46, 'end': 50}
{'entity': 'I-LOC', 'score': 0.9992, 'index': 12, 'word': 'City', 'start': 51, 'end': 55}
问答
问答是另一个标记级任务,它返回问题的答案,有时带有上下文(开放域),有时没有上下文(封闭域)。每当我们向虚拟助手询问餐厅是否营业时,都会发生此任务。它还可以提供客户或技术支持,并帮助搜索引擎检索您所要求的相关信息。
问答有两种常见类型
- 抽取式:给定一个问题和一些上下文,答案是模型必须从上下文中抽取的文本跨度
- 生成式:给定一个问题和一些上下文,答案是从上下文中生成的;此方法由 Text2TextGenerationPipeline 而不是下面显示的 QuestionAnsweringPipeline 处理
>>> from transformers import pipeline
>>> question_answerer = pipeline(task="question-answering")
>>> preds = question_answerer(
... question="What is the name of the repository?",
... context="The name of the repository is huggingface/transformers",
... )
>>> print(
... f"score: {round(preds['score'], 4)}, start: {preds['start']}, end: {preds['end']}, answer: {preds['answer']}"
... )
score: 0.9327, start: 30, end: 54, answer: huggingface/transformers
摘要
摘要从较长的文本创建较短的版本,同时尝试保留原始文档的大部分含义。摘要是一项序列到序列的任务;它输出的文本序列比输入短。有很多长篇文档可以进行摘要,以帮助读者快速理解要点。立法议案、法律和财务文件、专利和科学论文是一些可以进行摘要以节省读者时间并作为阅读辅助工具的文件示例。
与问答一样,摘要也有两种类型
- 抽取式:识别并提取原始文本中最重要的句子
- 生成式:从原始文本生成目标摘要(可能包括输入文档中没有的新词);SummarizationPipeline 使用生成式方法
>>> from transformers import pipeline
>>> summarizer = pipeline(task="summarization")
>>> summarizer(
... "In this work, we presented the Transformer, the first sequence transduction model based entirely on attention, replacing the recurrent layers most commonly used in encoder-decoder architectures with multi-headed self-attention. For translation tasks, the Transformer can be trained significantly faster than architectures based on recurrent or convolutional layers. On both WMT 2014 English-to-German and WMT 2014 English-to-French translation tasks, we achieve a new state of the art. In the former task our best model outperforms even all previously reported ensembles."
... )
[{'summary_text': ' The Transformer is the first sequence transduction model based entirely on attention . It replaces the recurrent layers most commonly used in encoder-decoder architectures with multi-headed self-attention . For translation tasks, the Transformer can be trained significantly faster than architectures based on recurrent or convolutional layers .'}]
翻译
翻译将一种语言的文本序列转换为另一种语言。它在帮助不同背景的人们相互交流、帮助翻译内容以覆盖更广泛的受众,甚至作为帮助人们学习新语言的学习工具方面非常重要。与摘要一样,翻译是一项序列到序列的任务,这意味着模型接收输入序列并返回目标输出序列。
早期,翻译模型大多是单语的,但最近,人们对多语言模型的兴趣日益浓厚,这些模型可以在多种语言对之间进行翻译。
>>> from transformers import pipeline
>>> text = "translate English to French: Hugging Face is a community-based open-source platform for machine learning."
>>> translator = pipeline(task="translation", model="google-t5/t5-small")
>>> translator(text)
[{'translation_text': "Hugging Face est une tribune communautaire de l'apprentissage des machines."}]
语言建模
语言建模是一项预测文本序列中单词的任务。它已成为一项非常流行的 NLP 任务,因为预训练的语言模型可以针对许多其他下游任务进行微调。最近,人们对大型语言模型 (LLM) 产生了浓厚的兴趣,这些模型展示了零样本或少样本学习。这意味着该模型可以解决它没有明确训练来完成的任务!语言模型可用于生成流畅且令人信服的文本,但您需要小心,因为文本可能并不总是准确的。
语言建模有两种类型
因果:模型的目的是预测序列中的下一个标记,并且未来的标记被屏蔽
>>> from transformers import pipeline >>> prompt = "Hugging Face is a community-based open-source platform for machine learning." >>> generator = pipeline(task="text-generation") >>> generator(prompt) # doctest: +SKIP
掩码:模型的目的是预测序列中被掩码的标记,并完全访问序列中的标记
>>> text = "Hugging Face is a community-based open-source <mask> for machine learning." >>> 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 ... ] >>> preds [{'score': 0.224, 'token': 3944, 'token_str': ' tool', 'sequence': 'Hugging Face is a community-based open-source tool for machine learning.'}]
多模态
多模态任务要求模型处理多种数据模态(文本、图像、音频、视频)以解决特定问题。图像描述是多模态任务的一个例子,其中模型将图像作为输入,并输出描述图像或图像某些属性的文本序列。
尽管多模态模型处理不同的数据类型或模态,但在内部,预处理步骤帮助模型将所有数据类型转换为嵌入(向量或数字列表,其中包含关于数据的有意义的信息)。对于像图像描述这样的任务,模型学习图像嵌入和文本嵌入之间的关系。
文档问答
文档问答是一项回答文档中自然语言问题的任务。与以文本作为输入的token级别问答任务不同,文档问答以文档的图像作为输入,并附带关于文档的问题,然后返回答案。文档问答可以用于解析结构化文档并从中提取关键信息。在下面的例子中,可以从收据中提取总金额和应找零金额。
>>> 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="What is the total amount?",
... image=image,
... )
>>> preds
[{'score': 0.8531, 'answer': '17,000', 'start': 4, 'end': 4}]
希望本页让你对每种模态中所有类型的任务以及每种任务的实际重要性有了更多的背景信息。在下一部分中,你将学习 🤗 Transformers 如何工作来解决这些任务。
< > 更新 on GitHub