🤗 Transformers 能做什么
🤗 Transformers 是一个包含预训练的最先进模型的库,用于自然语言处理(NLP)、计算机视觉以及音频和语音处理任务。该库不仅包含Transformer模型,还包含非Transformer模型,如用于计算机视觉任务的现代卷积网络。如果你看看当今一些最受欢迎的消费产品,比如智能手机、应用程序和电视,很可能背后有某种深度学习技术。想从智能手机拍摄的照片中移除背景物体吗?这是一个全景分割任务的例子(如果你还不知道这是什么意思,别担心,我们将在接下来的部分中描述它!)。
本页面概述了可以使用🤗 Transformers库在仅三行代码中解决的不同语音和音频、计算机视觉以及NLP任务!
音频
音频和语音处理任务与其他模态有些不同,主要是因为音频作为输入是一个连续信号。与文本不同,原始音频波形不能像句子可以分成单词那样整齐地分割成离散的块。为了解决这个问题,原始音频信号通常以固定的间隔进行采样。如果你在一个间隔内采集更多的样本,采样率就更高,音频就更接近原始音频源。
以前的方法会预处理音频以从中提取有用的特征。现在更常见的做法是直接将原始音频波形输入特征编码器以提取音频表示,从而开始音频和语音处理任务。这简化了预处理步骤,并允许模型学习最重要的特征。
音频分类
音频分类是一项任务,它将音频数据标记为预定义的一组类别。这是一个广泛的类别,有许多具体的应用,其中一些包括:
- 声学场景分类:用场景标签(“办公室”,“海滩”,“体育场”)标记音频
- 声学事件检测:用声音事件标签(“汽车喇叭声”、“鲸鱼叫声”、“玻璃破碎声”)标记音频
- tagging: 标记包含多种声音的音频(鸟鸣声、会议中的说话者识别)
- 音乐分类:用流派标签(“金属”,“嘻哈”,“乡村”)标记音乐
>>> 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}}]
图像分割
图像分割是一项像素级任务,它将图像中的每个像素分配给一个类别。它与目标检测不同,目标检测使用边界框来标记和预测图像中的对象,因为分割更加精细。分割可以在像素级别检测对象。图像分割有几种类型:
- 实例分割:除了标记对象的类别外,还标记对象的每个不同实例(“dog-1”,“dog-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任务!
文本分类
与任何模态中的分类任务一样,文本分类从预定义的类别集中为一段文本(可以是句子级别、段落或文档)打上标签。文本分类有许多实际应用,其中一些包括:
- 情感分析:根据某些极性(如
positive
或negative
)对文本进行标注,这可以为政治、金融和营销等领域的决策提供信息和支持 - 内容分类:根据某些主题对标签文本进行分类,以帮助组织和过滤新闻和社交媒体信息流中的信息(
weather
,sports
,finance
, 等)
>>> 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'}]
Token分类
在任何NLP任务中,文本通过将文本序列分割成单独的单词或子词进行预处理。这些被称为tokens。标记分类为每个标记分配一个来自预定义类集的标签。
两种常见的标记分类类型是:
- 命名实体识别(NER):根据实体类别(如组织、人员、地点或日期)标记一个词。NER在生物医学领域特别受欢迎,它可以标记基因、蛋白质和药物名称。
- 词性标注 (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
总结
摘要生成是从较长的文本中创建较短的版本,同时尽量保留原文的大部分含义。摘要生成是一种序列到序列的任务;它输出的文本序列比输入的更短。有许多长文档可以通过摘要来帮助读者快速理解主要观点。立法法案、法律和财务文件、专利和科学论文是可以通过摘要来节省读者时间并作为阅读辅助的文档的几个例子。
与问答类似,摘要也有两种类型:
- extractive: 识别并提取原文中最重要的句子
- 抽象式:从原始文本生成目标摘要(可能包括输入文档中未出现的新词);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."}]
语言建模
语言建模是一项预测文本序列中单词的任务。由于预训练的语言模型可以微调用于许多其他下游任务,它已成为非常流行的自然语言处理任务。最近,大型语言模型(LLMs)引起了广泛关注,这些模型展示了零样本或少样本学习的能力。这意味着模型可以解决它没有明确训练过的任务!语言模型可以用于生成流畅且有说服力的文本,但你需要小心,因为文本可能并不总是准确的。
语言建模有两种类型:
因果:模型的目标是预测序列中的下一个标记,未来的标记被屏蔽
>>> 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
masked: 模型的目标是在完全访问序列中的标记的情况下预测序列中被遮蔽的标记
>>> 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.2236, 'token': 1761, 'token_str': ' platform', 'sequence': 'Hugging Face is a community-based open-source platform for machine learning.'}]
多模态
多模态任务要求模型处理多种数据模态(文本、图像、音频、视频)以解决特定问题。图像描述是多模态任务的一个例子,其中模型将图像作为输入并输出描述图像或图像某些属性的文本序列。
尽管多模态模型处理不同的数据类型或模态,但在内部,预处理步骤帮助模型将所有数据类型转换为嵌入(向量或包含数据有意义信息的数字列表)。对于像图像字幕生成这样的任务,模型学习图像嵌入和文本嵌入之间的关系。
文档问答
文档问答是一项从文档中回答自然语言问题的任务。与将文本作为输入的标记级问答任务不同,文档问答将文档的图像作为输入,并附带一个关于文档的问题,然后返回一个答案。文档问答可用于解析结构化文档并从中提取关键信息。在下面的示例中,可以从收据中提取总金额和应找零钱。
>>> 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 解决这些任务。
< > Update on GitHub