高級接口功能
現在我們可以構建和共享一個基本接口, 讓我們來探索一些更高級的特性, 如狀態和解釋。
使用狀態保存數據
Gradio 支持 會話狀態, 其中數據在頁面加載中的多個提交中持續存在。會話狀態對於構建演示很有用, 例如, 你希望在用戶與模型交互時保留數據的聊天機器人。請注意, 會話狀態不會在模型的不同用戶之間共享數據。
要將數據存儲在會話狀態中, 你需要做三件事:
- 向函數中傳遞一個 額外的參數 , 該參數表示接口的狀態。
- 在函數結束時, 將狀態的更新值作為 額外的返回值 返回。
- 在創建
接口
時添加 ‘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()
請注意輸出組件的狀態如何在提交之間保持不變。注意: 可以給 state 參數傳入一個默認值, 作為 state 的初始值。
通過解釋來理解預測
大多數機器學習模型都是黑盒子, 函數的內部邏輯對終端用戶是隱藏的。為了提高透明度, 我們通過簡單地將 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()
通過提交一個輸入, 然後單擊輸出組件下的Interpret來測試解釋功能。
除了Gradio提供的默認解釋方法之外, 你還可以為 interpretation
參數指定 shap
, 並設置 num_shap
參數。這使用基於 Shapley 的解釋, 你可以在 here 閱讀更多信息。最後, 還可以將自己的解釋函數傳入 interpretation
參數。在Gradio的入門頁面 here 中可以看到一個例子。
這結束了我們對Gradio的Interface
類的深入研究。正如我們所看到的, 這個類使用幾行Python代碼創建機器學習演示變得簡單。然而, 有時你會想通過改變佈局或鏈接多個預測函數來定製你的demo。如果我們能以某種方式將 接口
分成可定製的 “塊”, 那不是很好嗎? 幸運的是, 有! 這是最後一部分的主題。