如何使用Gradio构建机器学习Web应用

你好,亲爱的读者们!今天,我将向你们介绍一个强大的Python库,它可以让你在几分钟内构建出令人印象深刻的机器学习Web应用。无需深厚的编程知识,Gradio将成为你的得力助手,助你将机器学习模型和数据科学工作流变成令人愉悦的应用程序。

开篇故事

你是否曾经想要将你的机器学习模型展示给他人,但却发现这个过程充满了繁琐的工作和技术挑战?或者你是否希望快速部署你的模型,并让用户通过浏览器与之互动?如果是的话,那么Gradio正是你需要的工具。

什么是Gradio?

Gradio是一个开源的Python库,用于构建机器学习和数据科学演示和Web应用程序。通过Gradio,你可以快速创建一个漂亮的用户界面,围绕你的机器学习模型或数据科学工作流,并允许人们通过浏览器拖放他们自己的图像、粘贴文本、录制自己的声音,并与你的演示互动。

Gradio的用途广泛,包括:

  • 演示 你的机器学习模型,供客户、合作伙伴、用户或学生使用。
  • 快速部署 模型,生成可分享的链接,并获得模型性能的反馈。
  • 在开发过程中交互式地调试 你的模型,使用内置的操作和解释工具。

快速入门

先决条件:Gradio需要Python 3.8或更高版本,仅此而已!

Gradio的功能

与他人分享你的机器学习模型、API或数据科学工作流的最佳方式之一是创建一个允许用户或同事在其浏览器中尝试演示的交互式应用程序

Gradio允许你在Python中构建演示并分享它们,通常只需几行代码!那么,让我们开始吧。

Hello,世界

要使用一个简单的“Hello,World”示例运行Gradio,请按照以下三个步骤进行操作:

1. 使用pip安装Gradio:

pip install gradio

2. 将以下代码保存为Python脚本并运行,或在Jupyter Notebook(或Google Colab)中运行:

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

demo.launch()

我们将导入的名称缩短为gr,以提高Gradio代码的可读性。这是一种被广泛采用的约定,你应该遵循,以便任何与你的代码一起工作的人都能轻松理解。

3. 在Jupyter Notebook中,演示将自动显示,或者如果在脚本中运行,则会在浏览器中弹出,并在http://localhost:7860上运行:

在本地开发时,如果希望将代码作为Python脚本运行,可以使用Gradio CLI以重新加载模式启动应用程序,这将提供无缝快速的开发。了解有关重新加载的更多信息,请参阅自动重新加载指南

gradio app.py

注意:也可以使用python app.py,但它不会提供自动重新加载机制。

Interface

你会注意到,为了创建演示,我们创建了一个gr.Interface。这个Interface类可以将用户界面包装在任何Python函数周围。在上面的示例中,我们看到了一个简单的基于文本的函数,但该函数可以是任何东西,从音乐生成器到税收计算器再到预训练机器学习模型的预测函数。

核心的Interface类初始化时需要三个必需参数:

  • fn:要在其周围包装UI的函数
  • inputs:用于输入的组件(例如 "text""image""audio"
  • outputs:用于输出的组件(例如 "text""image""label"

让我们更详细地看看这些用于提供输入和输出的组件。

组件属性

我们在前面的示例中看到了一些简单的Textbox组件,但如果你想更改UI组件的外观或行为,该怎么办?

假设你想要自定义输入文本字段 - 例如,你希望它更大,并且有一个文本占位符。如果我们使用Textbox的实际类而不是使用字符串快捷方式,你可以通过组件属性获得更多的自定义能力。

import gradio as gr

def greet(name

):
    return "Hello " + name + "!"

demo = gr.Interface(
    fn=greet,
    inputs=gr.Textbox(lines=2, placeholder="在这里输入姓名..."),
    outputs="text",
)
demo.launch()

多个输入和输出组件

假设你有一个更复杂的函数,带有多个输入和输出。在下面的示例中,我们定义了一个函数,该函数接受一个字符串、一个布尔值和一个数字,并返回一个字符串和一个数字。请看如何传递输入和输出组件的列表。

import gradio as gr

def greet(name, is_morning, temperature):
    salutation = "早上好" if is_morning else "晚上好"
    greeting = f"{salutation} {name}。今天气温是{temperature}度"
    celsius = (temperature - 32) * 5 / 9
    return greeting, round(celsius, 2)

demo = gr.Interface(
    fn=greet,
    inputs=["text", "checkbox", gr.Slider(0, 100)],
    outputs=["text", "number"],
)
demo.launch()

你只需将组件包装在列表中。inputs列表中的每个组件与函数的参数对应,按顺序排列。outputs列表中的每个组件与函数返回的值对应,同样也按顺序排列。

图像示例

Gradio支持许多类型的组件,例如 ImageDataFrameVideoLabel。让我们尝试一个图像到图像的函数,以了解这些组件的感觉!

import numpy as np
import gradio as gr

def sepia(input_img):
    sepia_filter = np.array([
        [0.393, 0.769, 0.189], 
        [0.349, 0.686, 0.168], 
        [0.272, 0.534, 0.131]
    ])
    sepia_img = input_img.dot(sepia_filter.T)
    sepia_img /= sepia_img.max()
    return sepia_img

demo = gr.Interface(sepia, gr.Image(shape=(200, 200)), "image")
demo.launch()

当使用Image组件作为输入时,你的函数将收到一个形状为(height, width, 3)的NumPy数组,其中最后一个维度表示RGB值。我们也会返回一个图像,以NumPy数组的形式。

你还可以使用type=关键字参数设置组件使用的数据类型。例如,如果你希望你的函数接受图像文件的文件路径而不是NumPy数组,那么输入的Image组件可以这样写:

gr.Image(type="filepath", shape=...)

还要注意,我们的输入Image组件附带了一个编辑按钮,允许裁剪和缩放图像。通过这种方式操作图像可以帮助揭示机器学习模型中的偏见或隐藏缺陷!

你可以在Gradio文档中阅读更多关于许多组件以及如何使用它们的信息。

聊天机器人

Gradio包括一个高级类gr.ChatInterface,它类似于gr.Interface,但专门设计用于聊天机器人的UI。gr.ChatInterface类也包装一个函数,但这个函数必须具有特定的签名。函数应该接受两个参数:messagehistory(参数名可以是任何名字,但必须按照这个顺序)

  • message:表示用户输入的str
  • history:表示到目前为止的会话的listlist。每个内部列表包含两个str,表示一对:[用户输入,机器人回复]

除此之外,gr.ChatInterface没有必需的参数(尽管有几个用于自定义UI的参数可用)。

以下是一个玩具示例:

import random
import gradio as gr

def random_response(message, history):
    return random.choice(["是的", "不是"])

demo = gr.ChatInterface(random_response)

demo.launch()

你可以在这里阅读更多关于gr.ChatInterface的信息

Blocks:更灵活和可控

Gradio提供了两种构建应用程序的方法:

1. InterfaceChatInterface,为创建演示提供了高级抽象,这是我们到目前为止讨论的内容。

2. Blocks,这是一种低级API,用于设计具有更灵活布局和数据流的Web应用程序。Blocks允许你做一些事情,比如展示多个数据流和演示、控制组件出现在页面的位置、处理复杂的数据流(例如,输出可以作为其他函数的输入),以及根据用户交互更新组件的属性/可见性 - 仍然都是在Python中。如果你需要这种自定义能力,可以尝试使用Blocks

Hello,Blocks

让我们看一个简单示例。请注意,此处的API与Interface不同。

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

with gr.Blocks() as demo:
    name = gr.Textbox(label="姓名")
    output = gr.Textbox(label="输出框")
    greet_btn = gr.Button("问候")
    greet_btn.click(fn=greet, inputs=name, outputs=output, api_name="greet")

demo.launch()

需要注意的事项:

  • 使用with子句制作Blocks,此子句中创建的任何组件都会自动添加到应用程序中。
  • 组件按垂直顺序出现在应用程序中,按照创建的顺序排列。(稍后我们将介绍如何自定义布局!)
  • 创建了一个Button,然后为该按钮添加了一个click事件侦听器。这个API看起来应该很熟悉!像Interface一样,click方法接受Python函数、输入组件和输出组件。

更复杂的示例

以下是一个应用程序,让你感受一下使用Blocks可以实现的可能性:

import numpy as np
import gradio as gr

def flip_text(x):
    return x[::-1]

def flip_image(x):
    return np.fliplr(x)

with gr.Blocks() as demo:
    gr.Markdown("使用此演示翻转文本或图像文件。")
    with gr.Tab("翻转文本"):
        text_input = gr.Textbox()
        text_output = gr.Textbox()
        text_button = gr.Button("翻转")
    with gr.Tab("翻转图像"):
        with gr.Row():
            image_input = gr.Image()
            image_output = gr.Image()
        image_button = gr.Button("翻转")

    with gr.Accordion("展开查看更多!"):
        gr.Markdown("看看我...")

    text_button.click(flip_text, inputs=text_input, outputs=text_output)
    image_button.click(flip_image, inputs=image_input, outputs=image_output)

demo.launch()

这里有更多的东西!我们将在使用Blocks构建部分介绍如何创建像这样的复杂Blocks应用程序。

恭喜,你现在已经熟悉了Gradio的基础知识! ? 转到我们的下一个指南了解更多关于Gradio的关键特性。

许可证

Gradio根据位于此存储库根目录的LICENSE文件中的Apache许可证2.0获得许可。

引用

还请阅读我们的论文Gradio:在野外轻松共享和测试ML模型,ICML HILL 2019,如果您在您的工作中使用了Gradio,请引用它。

@article{abid2019gradio,
  title = {Gradio: Hassle-Free Sharing and Testing of ML Models in the Wild},
  author = {Abid, Abubakar and Abdalla, Ali and Abid, Ali and Khan, Dawood and Alfozan, Abdulrahman and Zou, James},
  journal = {arXiv preprint arXiv:1906.02569},
  year = {2019},
}

本文由作者 王大神 原创发布于 大神网的AI博客。

转载请注明作者:王大神

原文出处:如何使用Gradio构建机器学习Web应用

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2023年9月28日
下一篇 2023年9月28日

相关推荐

  • 从Java到Python:数据分析新征程的启航

    在现代科技领域,数据分析已经成为了一个不可或缺的部分。对于那些原本从事Java编程的开发者来说,转向Python并掌握数据分析技能可能是一项重要的挑战。本文将探讨从Java到Python的转变,以及如何开始学习Python的…

    2023年10月27日
    00
  • 超越Python性能极限:创建C++扩展模块

    你是否曾想过如何提高Python代码的性能?或者你是否在处理大规模数据时感到Python的速度有些慢?如果是的话,那么你来对地方了!在本篇文章中,我将带你走进C++的魔幻世界,教你如何创建C++扩展模块,以实现超越Pyt…

    2023年9月19日
    00
  • “text-generation-webui”:赋予语言模型“见识”新天地

    想象一下,你坐在舒适的沙发上,手机在手,轻轻一点,就能与世界上最先进的语言模型进行深刻的对话或获取专业的文本生成服务。这不是科幻,这是现实——一切都得益于oobabooga的“text-generation-webui”项目。 项目背…

    2023年9月1日
    00
  • 打造高效客户管理系统 – 从需求到实现

    在现代商业世界中,客户是企业最宝贵的资产之一。建立一个高效的客户管理系统可以帮助你更好地理解、满足和维护你的客户。在本文中,我们将探讨如何使用Python创建一个简单而功能强大的客户管理系统。我们将从需求…

    2023年9月10日
    00
  • 如何使用Python批量复制文件并按照规则整理

    你是否曾经遇到过这样的情景:你有一堆文件需要整理,按照一定的规则复制到不同的文件夹中,但手动复制会耗费大量的时间和精力。或者你需要将文件按照日期、类型或其他条件进行分类整理,但不知道如何批量处理它们…

    2023年9月27日
    00
  • 如何使用Python破解Excel文件密码

    在工作或学习中,你可能会遇到需要访问受密码保护的Excel文件的情况。如果你忘记了密码或者需要解锁一个重要的Excel文件,但又不知道正确的密码,该怎么办呢?本教程将介绍如何使用Python编写一个密码破解工具,以…

    2023年10月19日
    00
  • Python与CCXT:虚拟货币量化交易入门指南

    虚拟货币市场的蓬勃发展吸引了越来越多的投资者,但如何在这个高度波动的市场中获得成功?答案之一是量化交易,而Python和CCXT是您的得力工具。本教程将引导您进入虚拟货币量化交易的世界,学习如何使用Python和CCX…

    2023年12月28日
    00
  • 打造神器:使用Python和Web3创建铭文批量铸造工具

    铭文在许多区块链游戏和应用中扮演着重要的角色。然而,如果你需要大量铸造铭文,手动完成这项任务将是一项繁重和耗时的工作。为了解决这个问题,我们可以使用Python和Web3库创建一个铭文批量铸造工具,以便更高效…

    2023年12月15日
    00
  • 如何使用Django的管理命令在Azure上运行Python Web应用

    你是否正在开发一个使用Django框架构建的Python Web应用,并希望将它部署到Azure云上?如果是的话,你来对地方了!在本教程中,我们将向你展示如何在Azure上托管你的Python Web应用,并使用Django的管理命令来执行…

    2023年9月19日
    00
  • 如何创建一个自动化按键和鼠标点击工具

    在日常计算机使用中,我们常常需要进行重复性的操作,例如定时按下某个键盘按键或模拟鼠标点击。这可能涉及到玩游戏、自动化测试、数据录入等各种场景。为了实现这些功能,你可以创建一个自动化按键和鼠标点击工具…

    2023年9月13日
    00