🤗 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'}
深度估计
深度估计预测图像中每个像素到相机的距离。此计算机视觉任务对于场景理解和重建尤其重要。例如,在自动驾驶汽车中,车辆需要了解行人、交通标志和其他车辆等物体有多远,以避免障碍物和碰撞。深度信息也有助于从二维图像构建三维表示,并可用于创建生物结构或建筑物的高质量三维表示。
深度估计有两种方法
- 立体:通过比较同一图像从略微不同角度拍摄的两张图像来估计深度
- 单目:从单个图像估计深度
>>> 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'}]
标记分类
在任何 NLP 任务中,文本都会通过将文本序列分割成单个单词或子词进行预处理。这些被称为 标记。标记分类会为每个标记分配来自预定义类别集的标签。
两种常见的标记分类类型是
- 命名实体识别 (NER):根据实体类别(如组织、人员、位置或日期)对标记进行标记。NER 在生物医学领域尤其受欢迎,它可以标记基因、蛋白质和药物名称。
- 词性标注 (POS):根据词性(如名词、动词或形容词)对标记进行标记。POS 有助于翻译系统理解两个相同的词在语法上的差异(银行作为名词与银行作为动词)。
>>> 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.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 **如何**解决这些任务。
< > 在 GitHub 上更新