到目前为止,我们已经了解了如何在非常初级的层面上将 transformers 与 huggingface Transformers 库一起使用。我们现在将开始了解如何使用该库来完成与文本、音频和图像相关的不同任务。

但在我们继续之前,我们将向您介绍 Gradio,这是一个用于在 huggingface 之上构建 UI 的库。

Gradio:简介

Gradio 是一个专门为部署和推理机器学习模型而构建的Web 框架 。Gradio 使我们能够通过 Web 界面快速公开我们的 ML 模型,而无需学习太多编码。通过收购 Gradio,Hugging Face 向前迈进了一步,为 huggingface 社区提供了一个简单的界面,可以在 huggingface 模型上部署和提供 UI。

在本章中,我们将使用huggingface spaces ,它为我们提供了一个接口来快速部署和提供我们的应用程序(使用 huggingface API 构建),一个 Web 前端,最终用户可以使用它与我们的应用程序进行交互。

在Hugging Face上创造空间

要在huggingface infra 上创建一个空间,我们需要有一个 huggingface 的帐户。这可以通过导航到https://huggingface.co/并在那里创建一个帐户来完成。创建账户后,我们可以点击最右边 的彩色圆圈,如图5-1所示。

图 5-1登录 后Hugging Face屏幕

点击新建空间,我们看到如图5-2所示的画面。

图 5-2 创造一个新的空间

为您的空间命名并选择 Gradio 作为SDK 。现在保持默认公开以提高可见性,最后单击“Create Space”按钮。

您将看到如图5-3所示的以下菜单。

图 5-3

huggingface 网页上显示的菜单

对于本章中的大多数应用程序,我们将使用文件和版本以及应用程序选项卡。

单击文件和版本选项卡,在右侧,我们看到添加文件。单击它我们可以添加我们的应用程序所需的文件。

对于我们的应用程序,我们只需要创建两个文件 :

  1. app.py:这是 Gradio 应用程序的主要代码文件。

  1. requirements.txt:此文件包含应用程序所需的 Python 依赖项。

Hugging Face任务

我们将从问答任务开始。

问答

模型的输入将是一个段落和该段落中的一个问题。模型推理的输出将是问题的答案。

我们使用的模型是在 SQuAD数据集 上训练的。

斯坦福问答数据集,也称为SQuAD ,是一个阅读理解数据集,由众包人员针对一组维基百科文章提出的问题组成。每个问题的答案都是来自相应阅读文章的一段文本,也称为span ,否则问题可能无法回答。

SQuAD 1.1 包含超过 100,000 个问答对,涵盖 500 多篇不同的文章。

首先,使用 RoBERTa基础 模型 ,使用SQuAD 2. 0数据集进行微调。它接受 了问答对的训练,包括无法回答的问题,用于问答任务。

模型使用的一些超参数是

  • batch_size:96

  • n_epochs:2

  • max_seq_len:386

  • max_query_length:64

首先使用huggingface UI 创建一个新空间,如上一节中的步骤所述。

单击 UI 上的文件和版本选项卡。使用以下内容创建文件 requirements.txt:

requirements.txt

gradio

transformers

torch

创建另一个文件 app.py 并复制 清单5-1中的内容。

from transformers import AutoModelForQuestionAnswering, AutoTokenizer, pipeline
import gradio as grad
import ast
mdl_name = "deepset/roberta-base-squad2"
my_pipeline = pipeline('question-answering', model=mdl_name, tokenizer=mdl_name)
def answer_question(question,context):text= "{"+"'question': '"+question+"','context': '"+context+"'}"di=ast.literal_eval(text)response = my_pipeline(di)return response
grad.Interface(answer_question, inputs=["text","text"], outputs="text").launch()

清单 5-1 app.py 的代码

单击 Commit changes 按钮提交更改,如图5-4所示。

图 5-4 提交 app.py 文件

这将触发构建和部署 过程,并且可以单击图5-5中的“查看日志”按钮来查看活动。

图 5-5 显示各种选项卡,包括“查看日志”按钮

初始阶段将是构建阶段,如图5-6所示。

图 5-6 应用程序的部署状态

点击See logs我们可以看到如图5-7所示的活动 。

图 5-7 显示应用程序的构建进度 。在这里,它正在加载用于创建容器的 Docker 映像

可以看到这里正在构建Docker 镜像 ,然后将部署它。如果一切 运行成功,我们将在 UI 上看到一个绿色的阶段,状态为 Running,如图5-8所示。

图 5-8 应用程序的状态更改为正在运行

完成后,单击“文件和版本”选项卡左侧的“应用程序”选项 卡。这将为您呈现用于键入输入的 UI。提供输入后,请单击提交按钮,如图5-9所示。

图 5-9 通过 Gradio 问答 UI。在标有上下文的输入框中为该段落提供您选择的输入,该段落中的问题应放入标有问题的输入框中

在清单5-2中,我们将在不同的模型上尝试相同的段落 和问题。我们将使用的模型是distilbert-base-cased-distilled-squad:

requirements.txt

gradio

transformers

torch

from transformers import AutoModelForQuestionAnswering, AutoTokenizer, pipeline
import gradio as grad
import ast
mdl_name = "distilbert-base-cased-distilled-squad"
my_pipeline = pipeline('question-answering', model=mdl_name, tokenizer=mdl_name)
def answer_question(question,context):text= "{"+"'question': '"+question+"','context': '"+context+"'}"di=ast.literal_eval(text)response = my_pipeline(di)return response
grad.Interface(answer_question, inputs=["text","text"], outputs="text").launch()

清单 5-2 app.py 的代码

提交更改并等待 部署状态变为绿色。发布单击菜单中的 App 选项卡以启动应用程序。

向 UI 提供输入并单击提交按钮以查看结果,如图5-10所示。

图 5-10 显示用于基于BERT 的问答 的基于 Gradio 的问答 UI

翻译

我们要处理 的下一个任务是语言翻译。这背后的想法是采用一种语言输入,然后根据通过 huggingface 库加载的预训练模型将其翻译成另一种语言。

我们在这里探索的第一个模型是Helsinki-NLP/opus-mt-en-de 模型 ,它接受英语输入并将其翻译成德语。

Code

app.py

from transformers import pipeline
import gradio as grad
mdl_name = "Helsinki-NLP/opus-mt-en-de"
opus_translator = pipeline("translation", model=mdl_name)
def translate(text):response = opus_translator(text)return response
grad.Interface(translate, inputs=["text",], outputs="text").launch()

清单 5-3 app.py 的代码

requirements.txt

gradio

transformers

torch

transformers[sentencepiece]

Output

提交更改 并等待部署状态变为绿色。发布单击菜单中的 App 选项卡以启动应用程序。

向 UI 提供输入并单击提交按钮以查看结果,如图5-11所示。

图 5-11 用于翻译任务的 Gradio UI

我们现在将在清单5-4中看到我们是否可以在不使用管道抽象的情况下编写相同的代码。如果我们还记得我们之前使用 AutoTokenizer 和AutoModel 等Auto 类做过同样的事情 。让我们继续。

Code

app.py

from transformers import AutoModelForSeq2SeqLM,AutoTokenizer
import gradio as grad
mdl_name = "Helsinki-NLP/opus-mt-en-de"
mdl = AutoModelForSeq2SeqLM.from_pretrained(mdl_name)
my_tkn = AutoTokenizer.from_pretrained(mdl_name)
#opus_translator = pipeline("translation", model=mdl_name)
def translate(text):inputs = my_tkn(text, return_tensors="pt")trans_output = mdl.generate(**inputs)response = my_tkn.decode(trans_output[0], skip_special_tokens=True)#response = opus_translator(text)return response
grad.Interface(translate, inputs=["text",], outputs="text").launch()

清单 5-4 app.py 的代码

requirements.txt

gradio

transformers

torch

transformers[sentencepiece]

提交更改 并等待部署状态变为绿色。发布单击菜单中的 App 选项卡以启动应用程序。

向 UI 提供输入并单击提交按钮以查看结果,如图5-12所示。

图 5-12 基于 Gradio 的翻译 UI

为了给你一种幸福 的感觉,当我们尝试通过谷歌翻译 同样的翻译时,我们得到了如下结果,如图5-13所示。

图 5-13 显示 Google 翻译如何翻译我们用于翻译应用程序的相同文本

我们可以看到我们与谷歌的结果有多接近 。这就是抱脸模型的力量。

为了强化这个概念,我们将用不同的语言翻译重复这个练习。这次我们以英法翻译为例。

这次我们采用Helsinki-NLP/opus-mt-en-fr 模型 并尝试翻译我们在前面示例中采用的相同句子,但这次是法语。

首先,我们使用管道抽象编写代码。

Code

app.py

from transformers import pipeline
import gradio as grad
mdl_name = "Helsinki-NLP/opus-mt-en-fr"
opus_translator = pipeline("translation", model=mdl_name)
def translate(text):response = opus_translator(text)return response
txt=grad.Textbox(lines=1, label="English", placeholder="English Text here")
out=grad.Textbox(lines=1, label="French")
grad.Interface(translate, inputs=txt, outputs=out).launch()

清单 5-5 app.py 的代码

requirements.txt

gradio

transformers

torch

transformers[sentencepiece]

提交更改 并等待部署状态变为绿色。发布单击菜单中的 App 选项卡以启动应用程序。

向 UI 提供输入并单击提交按钮以查看结果,如图5-14所示。

图 5-14 使用 Gradio 的翻译 UI

我们得到以下输出。

接下来,我们尝试在清单5-6中没有管道 API 的情况下进行相同的操作。

Code

app.py

from transformers import AutoModel,AutoTokenizer,AutoModelForSeq2SeqLM
import gradio as grad
mdl_name = "Helsinki-NLP/opus-mt-en-fr"
mdl = AutoModelForSeq2SeqLM.from_pretrained(mdl_name)
my_tkn = AutoTokenizer.from_pretrained(mdl_name)
#opus_translator = pipeline("translation", model=mdl_name)
def translate(text):inputs = my_tkn(text, return_tensors="pt")trans_output = mdl.generate(**inputs)response = my_tkn.decode(trans_output[0], skip_special_tokens=True)#response = opus_translator(text)return response
txt=grad.Textbox(lines=1, label="English", placeholder="English Text here")
out=grad.Textbox(lines=1, label="French")
grad.Interface(translate, inputs=txt, outputs=out).launch()

清单 5-6 app.py 的代码

requirements.txt

gradio

transformers

torch

transformers[sentencepiece]

提交更改 并等待部署状态变为绿色。发布单击菜单中的 App 选项卡以启动应用程序。

向 UI 提供输入并单击提交按钮以查看结果,如图5-15所示。

图 5-15 用于翻译任务的 Gradio UI,无需直接使用管道 API

再次将结果与Google Translate 的结果进行比较,如图5-16所示。

图 5-16 Google 翻译 我们用于 Gradio 应用程序的相同文本

正如我们所见,结果 完全匹配。有什么值得欢呼的。

概括

如果要阅读冗长的文档,我们的自然倾向是要么根本不阅读它们,要么只浏览最重要的要点。因此,对信息进行总结以节省时间和脑力处理能力将非常有帮助。

然而,在过去,自动总结文本是一项不可能完成的任务。更具体地说,做一个抽象的总结是一件非常困难的事情。抽象摘要比提取摘要更难,后者从文档中提取关键句子并将它们组合起来形成“摘要”。因为abstractive summarization涉及释义词,所以也比较费时;但是,它有可能产生更加优美和连贯的摘要。

我们将首先查看google/pegasus-xsum 模型 以生成一些文本的摘要。

这是代码。

app.py

from transformers import PegasusForConditionalGeneration, PegasusTokenizer
import gradio as grad
mdl_name = "google/pegasus-xsum"
pegasus_tkn = PegasusTokenizer.from_pretrained(mdl_name)
mdl = PegasusForConditionalGeneration.from_pretrained(mdl_name)
def summarize(text):tokens = pegasus_tkn(text, truncation=True, padding="longest", return_tensors="pt")txt_summary = mdl.generate(**tokens)response = pegasus_tkn.batch_decode(txt_summary, skip_special_tokens=True)return response
txt=grad.Textbox(lines=10, label="English", placeholder="English Text here")
out=grad.Textbox(lines=10, label="Summary")
grad.Interface(summarize, inputs=txt, outputs=out).launch()

清单 5-7 app.py 的代码

requirements.txt

gradio

transformers

torch

transformers[sentencepiece]

提交更改并等待部署状态变为绿色。发布单击菜单中的 App 选项卡以启动应用程序。

向 UI 提供输入并单击提交按钮以查看结果,如图5-17所示。

图 5-17 使用 Gradio 的摘要应用程序 。在标有英文的框中粘贴段落,提交后,标有摘要的框将显示段落文本的摘要

接下来,我们使用另一个文本,并使用一些参数对模型进行一些调整。

from transformers import PegasusForConditionalGeneration, PegasusTokenizer
import gradio as grad
mdl_name = "google/pegasus-xsum"
pegasus_tkn = PegasusTokenizer.from_pretrained(mdl_name)
mdl = PegasusForConditionalGeneration.from_pretrained(mdl_name)
def summarize(text):tokens = pegasus_tkn(text, truncation=True, padding="longest", return_tensors="pt")translated_txt = mdl.generate(**tokens,num_return_sequences=5,max_length=200,temperature=1.5,num_beams=10)response = pegasus_tkn.batch_decode(translated_txt, skip_special_tokens=True)return response
txt=grad.Textbox(lines=10, label="English", placeholder="English Text here")
out=grad.Textbox(lines=10, label="Summary")
grad.Interface(summarize, inputs=txt, outputs=out).launch()

清单 5-8 app.py 的代码

提交更改并等待部署状态变为绿色。发布单击菜单中的 App 选项卡以启动应用程序。

向 UI 提供输入并单击提交按钮以查看结果,如图5-18所示。

图 5-18 通过 Gradio 应用程序总结文本

图 5-19 用于总结文本的Google Pegasus 模型 Imagsource: https ://1.bp.blogspot.com/-TSor4o51jGI/Xt50lkj6blI/AAAAAAAAGDs/

我们可以看到我们在代码中提供了以下参数:

translated_txt = mdl.generate(**tokens,num_return_sequences=5,max_length=200,temperature=1.5,num_beams=10)

文本生成 是通过使用波束搜索来完成的,这就是 num beams 所指的。与只返回最有可能找到的下一个单词的贪婪搜索相反,此方法返回最有可能找到的 n 个单词。

Num_return_sequences 返回返回的输出数。在前面的示例中,我们给出了 5 作为序列数。

改变由神经网络计算的输出分布是使用温度函数 的一个理由。根据公式 5-1(温度函数),它被添加到 logits 向量中:

【NLP】第 5 章 :使用Hugging Face的任务相关推荐

  1. 【NLP】第 4 章 :Hugging Face

    如果您对 2018 年以来机器学习和人工智能领域取得的进步略有了解,您几乎肯定已经意识到自然语言处理 领域取得的巨大进步(也称为自然语言处理).这一领域的大部分进展可归功于大型语言模型 ,也称为 LL ...

  2. 哥伦比亚大学 NLP 第三章(第二部分)

    哥伦比亚大学 NLP 第三章(第二部分) 目录 概率上下文无关 CKYCKYCKY 算法 本部分关于上下文无关相关符号的约定均基于第一部分,本部分将继续沿用不再定义 第三章第一部分传送门:https: ...

  3. 《Transformers自然语言处理系列教程》第1章:Transformers 介绍

    2017年,谷歌的研究人员发表了一篇论文,提出了一种用于序列建模的新型神经网络架构.这种架构被称为Transformer,在机器翻译质量和训练成本方面都优于递归神经网络(RNNs). 与此同时,一种名 ...

  4. 【NLP】使用Google的T5提取文本特征

    作者 | Mike Casale 编译 | VK 来源 | Towards Data Science 下图是文本到文本框架的示意图.每个任务都使用文本作为模型的输入,通过训练生成一些目标文本. 这允许 ...

  5. Hugging Face

    Hugging Face是一个开源的NLP(自然语言处理)软件库和社区,它提供了用于构建.训练.使用和共享NLP模型的工具和平台. Hugging Face的主要产品是Transformers库,它是 ...

  6. nlp-with-transformers实战-01_transformers简介

    原文:https://www.oreilly.com/library/view/natural-language-processing/9781098103231/ch01.html Hello Tr ...

  7. CB Insights发布最新AI 100排名,包含100家最有前景的AI初创公司

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! AI 100是CB Insights公司对全球100家最有前途的人工智能初创公司的 ...

  8. Python NLTK的学习(一)

    重新开始的NLTK学习 0.前言 1.语言处理与python 1.1 语言计算:文本和单词 1.1.1 用nltk.book 库练习 1.1.1.1搜索文本 1.1.1.2 词汇计数 1.2 pyth ...

  9. Hugging Face官方NLP课程来了!Transformers库维护者之一授课,完全免费

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自:机器之心 编辑:杜伟 Hugging Face NLP 课程开 ...

最新文章

  1. nginx虚拟目录设置 alias 和 root
  2. 【有图有真相】静态NAT、动态NAT、PAT、端口映射的详细配置过程
  3. 单链表的几个基本操作
  4. Transformer升级之路:Sinusoidal位置编码追根溯源
  5. myeclipse中添加Oracle数据库
  6. 华为管理学案例分析_管理学论文5000字如何高质量写作
  7. 拒绝低效办公,9个超实用职场必备国产软件推荐
  8. 简单python脚本实例-五个python常用运维脚本面试题实例
  9. jmeter与jdk的安装
  10. 十分钟倒计时flash_Flash 101-第6部分:最终倒计时
  11. php如何识别flac文件,flac是什么格式
  12. AHU计科(伪)新生指南
  13. 用java输出一个心型图案_开发工程师的浪漫--java打印心形图案
  14. 几种 FPGA 芯片的工艺结构
  15. 使用腾讯tapd工具,进行创建迭代任务、任务拆解、、制定整体发布计划、多维度甘特图进度把控
  16. 真的以为看过几本理财书籍就能实现财富自由?
  17. mysql中charset()作用_Mysql系列(四) —— MySQL的Charset和Collation
  18. u盘重装系统步骤win10系统重装教程
  19. Oracle创建索引;查询索引
  20. 深度学习—近年来流行的卷积神经网络(一)

热门文章

  1. 微信小程序--引入腾讯位置服务插件
  2. iGills SE-35:iPhone防水保护套让你看海时不再寂寞
  3. Chrome撤销一律不翻译网页方法
  4. C语言终极面试及答案分析
  5. CF51C Three Base Stations
  6. java-php-python-ssm学生宿舍信息管理系统计算机毕业设计
  7. ARM芯片开发(S5PV210芯片)——SD卡启动
  8. A 、B 、C级机房区别
  9. 怎么把录音导入库乐队_将音频和 MIDI 文件导入到 iPad 版库乐队
  10. 乐高于上海月星环球港举办新春互动活动