高级界面功能
现在我们已经可以构建和共享一个基本的界面,让我们探索一些更高级的功能,例如状态和解释。
使用状态来持久化数据
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 类中设置 interpretation 关键字即可设置为默认值。这允许您的用户了解输入的哪些部分对输出负责。请查看下面的简单界面,它显示了一个图像分类器,其中还包含解释
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
拆分为可自定义的“块”,那岂不是很好?幸运的是,确实有!这是最后一部分的主题。