Gradio的web界面演示与交互机器学习模型,Blocks的事件侦听《7》

news2025/1/13 7:35:59

在第一篇文章我们就熟悉了Blocks的用法,使用Blocks比Interface更加灵活,这节重点关注Blocks里面的相关操作。

1、Blocks标准例子

import gradio as gr

def greet(name):
    return "你好 " + 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()

 这个大家都很熟悉了,在标准的Blocks块里面布局一些输入输出组件,然后点击按钮,添加侦听器,调用的参数也是标准的三个参数:回调函数、输入、输出
这里的输出不能交互,所以不能编辑,当然也可以指定参数gr.Textbox(label="问候输出", interactive=True)来让它有交互性。

2、事件侦听类型

上面的例子是通过按钮的点击来触发,下面看一个change()事件侦听器,输入的时候,就会进行输出操作,当然不同的组件支持不同的事件监听器。例如,Video组件支持play()事件监听器,当用户按下play键时触发。 

import gradio as gr

def welcome(name):
    return f"欢迎, {name}!"

with gr.Blocks() as demo:
    gr.Markdown(
    """
    # 寅恪光潜
    输入的过程观察输出
    """)
    inp = gr.Textbox(placeholder="输入你的名字")
    out = gr.Textbox()
    inp.change(welcome, inp, out)

demo.launch()

这里没有做动态图演示了,注意的是输入更改,输出就会跟着更改 

这里在输入的时候就会触发change侦听事件,只要输入有变化就会自动进行处理与输出。另外我们也注意到,在Blocks块里面支持Markdown标记语言。

3、多个数据流 

使用Blocks不像接口那样局限于单一的数据流,可以使用多个数据流,比如下面的两个文本框,可以a是输入b是输出,也可以反过来是a是输出和b为输入:

import gradio as gr

def increase(num):
    return num + 1

with gr.Blocks() as demo:
    a = gr.Number(label="a")
    b = gr.Number(label="b")
    btoa = gr.Button("a > b")
    atob = gr.Button("b > a")
    atob.click(increase, a, b)
    btoa.click(increase, b, a)

demo.launch()

点击按钮a>b的时候,将会让b作为输入,a作为输出,a=b+1,反过来,当点击b>a的时候,a作为输入,b作为输出,b=a+1

接着来看一个自动语音识别的示例,将语音转为文字的输出作为下个模型处理的输入,分析文本的情感,这里只支持英文,所以我截取了一段“The Sound of silence”音乐来看下效果
首次运行将会下载模型pytorch_model.bin配置文件config.json,词汇vocab.txt等相关文件。

from transformers import pipeline

import gradio as gr

asr = pipeline("automatic-speech-recognition", "facebook/wav2vec2-base-960h")
classifier = pipeline("text-classification")

def speech_to_text(speech):
    text = asr(speech)["text"]
    return text

def text_to_sentiment(text):
    return classifier(text)[0]["label"]

demo = gr.Blocks()

with demo:
    audio_file = gr.Audio(type="filepath")
    text = gr.Textbox()
    label = gr.Label()

    b1 = gr.Button("Recognize Speech")
    b2 = gr.Button("Classify Sentiment")

    b1.click(speech_to_text, inputs=audio_file, outputs=text)
    b2.click(text_to_sentiment, inputs=text, outputs=label)

demo.launch()

这种音乐的识别有伴奏,识别难度稍微大点。
管道pipeline可接受的任务比较多,比如语音识别、图片分类、图片到文字、问答,摘要等等,然后这里再提供了一个预训练模型。
文本情感分类函数classifier

print(classifier("Good man"))#[{'label': 'POSITIVE', 'score': 0.9998418092727661}]

4、函数输入为列表与字典

到目前为止,您看到的事件侦听器都只有一个输入组件。如果想让多个输入组件向函数传递数据,你有两个选项来决定函数如何接受输入组件的值,先来看示例(官方例子做了简单修改):

import gradio as gr

with gr.Blocks() as demo:
    a = gr.Number(label="a")
    b = gr.Number(label="b")
    with gr.Row():
        add_btn = gr.Button("求和")
        sub_btn = gr.Button("求差")
    c1 = gr.Number(label="a+b的结果")
    c2 = gr.Number(label="a-b的结果")

    def add(num1, num2):
        return num1 + num2
    add_btn.click(add, inputs=[a, b], outputs=c1)

    def sub(data):
        return data[a] - data[b]
    sub_btn.click(sub, inputs={a, b}, outputs=c2)

demo.launch()

注意加法和减法的两个函数的写法和调用的不同!
add()和sub()都接受a和b作为输入。但是,这些侦听器之间的语法是不同的。
对于add_btn侦听器,我们将输入作为列表传递。add()函数将这些输入作为参数。a的值映射到实参num1, b的值映射到实参num2。
对于sub_btn侦听器,我们将输入作为一个集合传递(注意这里从中括号变为了大括号),函数sub()接受一个字典参数data,其中键是输入组件,值是这些组件的值。

5、函数返回为列表与字典

在上面我们的函数参数输入可以是列表或字典,同理,在函数的返回值中,也是可以返回列表或者字典的。

with gr.Blocks() as demo:
    food_box = gr.Number(value=10, label="Food Count")
    status_box = gr.Textbox()
    def eat(food):
        if food > 0:
            #return food - 1, "full"
            return {food_box: food - 1, status_box: "full"}
        else:
            #return 0, "hungry"
            return {status_box: "hungry"}
    gr.Button("EAT").click(
        fn=eat, 
        inputs=food_box,
        outputs=[food_box, status_box]
    )
demo.launch()

这里可以看到函数返回的列表或字典,里面的值分别是食物数量以及饱腹还是饥饿状态。

6、更新组件配置 

事件侦听器函数的返回值通常是对应输出组件的更新值。有时我们也想更新组件的配置,比如,可见性,这里看个示例就是看论文的长短来更新输入文本框的高度。

import gradio as gr

def change_textbox(choice):
    if choice == "short":
        return gr.update(lines=2, visible=True, value="比较短的论文...")
    elif choice == "long":
        return gr.update(lines=8, visible=True, value="比较长的论文")
    else:
        return gr.update(visible=False)

with gr.Blocks() as demo:
    radio = gr.Radio(
        ["short", "long", "none"], label="论文写作的长度?"
    )
    text = gr.Textbox(lines=2, interactive=True)
    radio.change(fn=change_textbox, inputs=radio, outputs=text)

demo.launch()

当我们点击不同的单选按钮的时候,就会触发change侦听事件,然后通过change_textbox函数的用户选择,来更新文本框组件

7、连续运行事件

还可以通过使用事件侦听器的then方法连续运行事件。这将在前一个事件完成运行后运行一个事件。这对于运行分多个步骤更新组件的事件非常有用。
例如,在下面的聊天机器人示例中,我们首先使用用户消息更新聊天机器人,然后模拟延迟后使用计算机响应更新聊天机器人。

import gradio as gr
import random
import time

md = """This is some code:

hello

```py
def fn(x, y, z):
    print(x, y, z)
"""

with gr.Blocks() as demo:
    chatbot = gr.Chatbot()
    msg = gr.Textbox()
    clear = gr.Button("Clear")

    def respond(message, chat_history):
        bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])
        chat_history.append((message, md))
        time.sleep(1)
        return "", chat_history

    msg.submit(respond, [msg, chatbot], [msg, chatbot])
    clear.click(lambda: None, None, chatbot, queue=False)

demo.launch()

事件侦听器的.then()方法执行后续事件,而不管前一个事件是否引发任何错误。如果您希望仅在前一个事件成功执行时才运行后续事件,请使用.success()方法,该方法接受与.then()相同的参数。

您可以使用事件侦听器的每个参数以固定的时间表运行事件。这将在客户端连接打开时每秒钟运行一次事件。如果连接关闭,事件将在下一个迭代之后停止运行。注意,这并没有考虑事件本身的运行时。所以一个运行时间为1秒的函数在every=5的情况下,实际上是每6秒运行一次。
接下来看一个每秒更新的正弦曲线的例子:

import math
import gradio as gr
import plotly.express as px
import numpy as np

plot_end = 2 * math.pi

def get_plot(period=1):
    global plot_end
    x = np.arange(plot_end - 2 * math.pi, plot_end, 0.02)
    y = np.sin(2*math.pi*period * x)
    fig = px.line(x=x, y=y)
    plot_end += 2 * math.pi
    if plot_end > 1000:
        plot_end = 2 * math.pi
    return fig


with gr.Blocks() as demo:
    with gr.Row():
        with gr.Column():
            gr.Markdown("更改滑块的值以自动更新绘图")
            period = gr.Slider(label="Period of plot", value=1, minimum=0, maximum=10, step=1)
            plot = gr.Plot(label="Plot (updates every half second)")

    dep = demo.load(get_plot, None, plot, every=1)
    period.change(get_plot, period, plot, every=1, cancels=[dep])


if __name__ == "__main__":
    demo.queue().launch()

如果没有安装plotly模块,同样会报模块缺失的错误
ModuleNotFoundError: No module named 'plotly'
安装,依然推荐加豆瓣镜像:

pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com plotly

有兴趣的可以查阅其余章节:

Gradio的web界面演示与交互机器学习模型,安装和使用《1》
Gradio的web界面演示与交互机器学习模型,主要特征《2》
Gradio的web界面演示与交互机器学习模型,分享应用《3》
Gradio的web界面演示与交互机器学习模型,全局状态与会话状态《4》
Gradio的web界面演示与交互机器学习模型,接口自动刷新或连续刷新数据流《5》
Gradio的web界面演示与交互机器学习模型,高级接口特征《6》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简单的汉诺塔,神奇的预言,竟然需要5849亿年???(52)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日主题 汉诺塔 古印度大梵天传说 Python玩转汉诺塔 递归 汉诺塔 汉诺塔(Hanoi)是一个著名的益智游戏,也称…

规则引擎架构-基于aviator

目录 aviator使用场景ASM 字节码操控框架aviator 表达式例子debug表达式类生成过程b-ca生成的class文件 aviator使用场景 github地址:aviator 使用场景: 规则判断及规则引擎公式计算动态脚本控制集合数据 ELT 等 …… ASM 字节码操控框架 asm实现&a…

【Dubbo】Dubbo架构的演进过程分析

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

Go并发编程 Goroutine、Channel、Select、Mutex锁、sync、Atomic等

本文所有实例代码运行go版本:go version go1.18.10 windows/amd64 1 并发编程介绍 1.1 串行、并发、并行 串行:所有任务一件一件做,按照事先的顺序依次执行,没有被执行到的任务只能等待。最终执行完的时间等于各个子任务之和。…

效率神器!神级ChatGPT浏览器插件分享

大家好,我是卷了又没卷,薛定谔的卷的AI算法工程师「陈城南」~ 担任某大厂的算法工程师,带来最新的前沿AI知识和工具,欢迎大家交流~,后续我还会分享更多 AI 有趣工具和实用玩法,包括AI相关技术、ChatGPT、AI…

初识SpringBoot -- SpringBoot入门保姆级教程(一)

文章目录 前言一、初识SpringBoot1.SpringBoot简介2.用编译器IDEA创建SpringBoot项目3.在官网创建SpringBoot项目4.SpringBoot项目快速启动(前后端分离基本能力)5.了解SpringBoot起步依赖和启动类 总结 前言 为了巩固所学的知识,作者尝试着开…

RocketMQ消息消费

RocketMQ消息消费示例代码: public static void main(String[] args) throws InterruptedException, MQClientException {DefaultMQPushConsumer consumer new DefaultMQPushConsumer("please_rename_unique_group_name_4");consumer.setNamesrvAddr(&qu…

C++ 学习 ::【基础篇:15】:C++ 类的基本成员函数:析构顺序问题(全局/静态/局部量) 及 类类型(自定义类型)与析构函数

本系列 C 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C的三大特性等&#…

Nginx配置块location及rewrite详解(遗憾)

文章目录 一、location配置块详解1.location 大致分为三类2.location 常用的匹配规则3.location 匹配的优先级4.location 匹配流程5.location 的实际使用(1)直接匹配网站根目录首页(2)处理静态文件请求(3)通…

函数式接口相关知识点

这里写目录标题 函数式接口简介以及注意点函数式接口作为方法的参数函数式接口作为方法参数常用的函数式接口Supplier简介具体代码操作 Consumer简介具体代码演示演示1演示2 Predicate接口简介以及接口中的方法text和negate方法and和or方法Function方法简介具体操作1具体操作2 …

SQL语句之DDL语言

说明:DDL(Data Definition Language,数据定义语言),用来定义数据库对象(数据库、表),包括了数据库和表的创建、查询、使用和删除操作。 一、数据库操作 新安装的数据库,默认有以下四个数据库&…

计算机网络-数据链路层

概念 结点:主机、路由器 链路:结点间物理通道 数据链路:结点间逻辑通道,控制数据传输协议的硬件和软件加到链路上构成数据链路 帧:链路层的协议数据单元,封装网络层数据报 数据链路层负责通过一条链路从一…

银行转账问题(死锁)

本文主要讲述死锁的一个经典案例—银行转账问题,并对该问题进行定位、修复。 1. 问题说明 当账户A对账户B进行转账时, 首先需要获取到两把锁:账户A和账户B的锁。获取两把锁成功,且余额大于0,则扣除转出人的余额&…

我记不住的那些C语言的struct知识

背景: 最近在重学C语言,目的是为了能看懂操作系统的底层代码,也为后续使用C语言开发一个类似redis数据库的中间件做准备,于是又重新踏上了学习C语言的道路,早在上学期间就学习过C语言,但是很久都不用了&…

ssm学习-spring01

Spring_day01 今日目标 掌握Spring相关概念完成IOC/DI的入门案例编写掌握IOC的相关配置与使用掌握DI的相关配置与使用1,课程介绍 对于一门新技术,我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那对于Spring来说: 1.1 为什么要学? 从使用和占有率看 Spri…

使用 ChatGPT API 构建系统(一):分类

今天我学习了DeepLearning.AI的 Building Systems with the ChatGPT API 的在线课程,我想和大家一起分享一下该门课程的一些主要内容。 下面是我们通过Openai API来访问ChatGPT模型的主要代码: import openai#您的openai的api key openai.api_key YOUR…

chatgpt赋能python:Python删除节点:从入门到实践

Python删除节点:从入门到实践 在任何编程语言中,删除节点都是一个极为常见的操作。在Python中,它同样非常重要,因为我们通常会使用Python处理各种数据结构,诸如树、链表等等。但是,删除节点并不总是一件容…

C++类和对象 -- 知识点补充

补充 const成员函数static成员友元内部类匿名对象拷贝对象时的一些编译器优化 const成员函数 将const修饰的成员函数称为const成员函数,const修饰类成员函数,实际是修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的成员进行修改。…

javaWeb ssh自习室管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh自习室管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,…

预报名通道已开启,2023第11届国际生物发酵展,8月4-6日上海见!

新机遇、新挑战、新发展 同期展会:酵素产品与益生产品展 制药机械与包装技术展 生化仪器及实验室设备展 合成生物技术与生物制造展 展会时间: 2023年8月4日 9:00-17:00 2023年8月5日 9:00-17:00 2023年8月6日 9:00-15:00 展会地点&#xff1a…