如何使用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日

相关推荐

  • 教程:使用Python批量注册自建邮箱账户

    有时候,我们可能需要大量的邮箱账户,用于各种目的,比如测试、订阅、或者是其他项目。在这种情况下,手动一个一个注册邮箱账户会非常繁琐和耗时。但幸运的是,我们可以利用Python编写脚本来自动化这个过程,而且…

    2023年11月2日
    00
  • 编程的奇妙之旅:Python多线程爬虫下载PDF教材

    有一天,当我坐在电脑前,思考着编程的奇妙之处时,一种冒险的感觉涌上心头。我想,为什么不用编程来探索互联网的深处,下载一些有趣的教材呢?于是,我开始了这次奇妙的编程之旅,带着好奇心和激情,我将向你展示…

    2023年10月4日
    00
  • Eureka:通过编码大型语言模型实现人类水平的奖励设计

    在现代科技领域,人工智能(AI)正日益成为不可或缺的一部分。AI不仅在自动化任务中表现出色,还在解决复杂问题方面展现出巨大潜力。但是,将AI应用于一些低级操作任务,如熟练旋转笔尖,似乎是一个不可逾越的挑战…

    2023年10月21日
    00
  • 适应国内网络环境:Python 项目的网络配置技巧

    当小明第一次尝试在自己的新项目中使用 pip 安装 Python 依赖时,他遭遇了让人沮丧的网络问题。下载速度缓慢、连接经常中断,让他对 Python 的开发产生了丝丝疑惑。但很快,他发现了一系列在国内网络环境下针对 Pyt…

    2023年10月9日
    00
  • 如何轻松截取电脑屏幕上的任何部分?

    在这个数字化时代,我们经常需要与他人分享屏幕上的信息,无论是工作中的协作还是在社交媒体上展示有趣的内容。然而,有时候,系统自带的截图工具可能无法满足我们的需求,或者操作起来繁琐。因此,有一天,王大神…

    2023年9月26日
    00
  • 在VS Code中开始使用Python

    你好!在这篇教程中,你将学习如何在Visual Studio Code中使用Python 3创建、运行和调试一个Python“掷骰子”的应用程序,使用虚拟环境,使用包等等!通过使用Python扩展,你可以将VS Code变成一个出色的、轻量级的Py…

    2023年9月19日
    00
  • 如何使用Python和PyQt5创建双色球彩票选号器

    你是否曾经在购买双色球彩票时感到犹豫不决,不知道应该选择哪些数字?如果是这样,那么你来对地方了!本教程将教你如何使用Python和PyQt5库创建一个简单的双色球彩票选号器。通过这个应用程序,你可以随机生成红球…

    2023年10月19日
    00
  • 如何使用Python进行图像形状匹配

    你是否曾经想过如何使用Python来识别一张图片中特定形状的位置,或者进行图像中的物体匹配?在这个教程中,我们将向你展示如何使用Python和OpenCV库进行图像形状匹配。无论你是想识别图像中的某个标志性形状,还是…

    2023年9月14日
    00
  • 在HomePod上使用Python实现Matter语音控制:详细教程

    王大神是一个对音乐和技术充满热情的自由职业者,他充分利用自由的生活和工作方式。最近,他遇到了一个技术挑战:如何在HomePod上使用Python实现Matter语音控制。这个挑战是因为Matter的开发信息相对有限,但王大神…

    2023年11月21日
    00
  • 优化种子文件批量转换成磁力链的Python代码

    种子文件转换成磁力链是一个常见的需求,特别是对于那些喜欢分享和下载种子文件的人来说。在本教程中,我们将介绍如何优化已有的Python代码,以实现将多个种子文件批量转换成磁力链的功能。通过模块化、改进变量名…

    2023年12月18日
    00