高级界面功能
现在我们已经可以构建和共享一个基本界面,让我们来探索一些更高级的功能,例如状态和解释。
使用状态来持久化数据
Gradio 支持会话状态,其中数据在页面加载期间的多次提交中保持持久性。会话状态对于构建例如聊天机器人的演示很有用,在这些演示中,您希望在用户与模型交互时持久化数据。请注意,会话状态不会在模型的不同用户之间共享数据。
要在会话状态中存储数据,您需要执行以下三件事:
- 将一个额外的参数传入您的函数,它代表界面的状态。
- 在函数结束时,将状态的更新值作为额外的返回值返回。
- 在创建您的
Interface
时添加 “state” 输入和 “state” 输出组件。
请参阅下面的聊天机器人示例
import random
import gradio as gr
def chat(message, history):
history = history or []
if message.startswith("How many"):
response = random.randint(1, 10)
elif message.startswith("How"):
response = random.choice(["Great", "Good", "Okay", "Bad"])
elif message.startswith("Where"):
response = random.choice(["Here", "There", "Somewhere"])
else:
response = "I don't know"
history.append((message, response))
return history, history
iface = gr.Interface(
chat,
["text", "state"],
["chatbot", "state"],
allow_screenshot=False,
allow_flagging="never",
)
iface.launch()
请注意,输出组件的状态如何在提交之间保持持久性。注意:您可以将默认值传递给状态参数,该参数用作状态的初始值。
使用解释来理解预测
大多数机器学习模型都是黑盒子,函数的内部逻辑对最终用户隐藏。为了鼓励透明度,我们使向模型添加解释变得非常容易,只需在 Interface 类中将解释关键字设置为默认值。这允许您的用户了解输入的哪些部分对输出负责。请查看下面的简单界面,它显示了一个图像分类器,该分类器还包含解释
import requests
import tensorflow as tf
import gradio as gr
inception_net = tf.keras.applications.MobileNetV2() # load the model
# Download human-readable labels for ImageNet.
response = requests.get("https://git.io/JJkYN")
labels = response.text.split("\n")
def classify_image(inp):
inp = inp.reshape((-1, 224, 224, 3))
inp = tf.keras.applications.mobilenet_v2.preprocess_input(inp)
prediction = inception_net.predict(inp).flatten()
return {labels[i]: float(prediction[i]) for i in range(1000)}
image = gr.Image(shape=(224, 224))
label = gr.Label(num_top_classes=3)
title = "Gradio Image Classifiction + Interpretation Example"
gr.Interface(
fn=classify_image, inputs=image, outputs=label, interpretation="default", title=title
).launch()
通过提交输入然后单击输出组件下的解释来测试解释功能。
除了 Gradio 提供的默认解释方法外,您还可以为 interpretation
参数指定 shap
并设置 num_shap
参数。这使用基于 Shapley 的解释,您可以在 此处 阅读更多相关内容。最后,您也可以将自己的解释函数传入 interpretation
参数。请参阅 Gradio 的入门页面 此处 中的示例。
这总结了我们对 Gradio 的 Interface
类的深入研究。正如我们所看到的,这个类使在几行 Python 代码中创建机器学习演示变得简单。但是,有时您需要通过更改布局或将多个预测函数链接在一起来自定义演示。如果我们可以以某种方式将 Interface
拆分为可自定义的 “blocks” 将是多么好?幸运的是,这确实可以做到!这是最后一节的主题。