如何使用Gradio为机器学习模型建立GUI

1,058 阅读6分钟

如果你曾经建立过一个机器学习模型,你可能会想 "嗯,这很酷,但其他人怎么能看到它有多酷?"

模型部署是机器学习的一部分,但它并没有被谈论得那么多。

因此,在这篇文章中,我将向你介绍一个新的工具,它将帮助你为你的机器学习模型生成一个网络应用,然后你可以与其他开发者分享,这样他们就可以试用它了。

我将使用scikit-learn建立一个简单的神经网络模型,并使用Gradio为该模型创建一个GUI(这就是我说的那个很酷的新工具)。

让我们开始吧:

我们不能用创造问题的思维来解决我们的问题 - 阿尔伯特-爱因斯坦

什么是Gradio?

gradio cover.png

图片来源:Gradio

根据Gradio网站的介绍:

Gradio允许你围绕你的TensorFlow或PyTorch模型,甚至任意的Python函数快速创建可定制的UI组件。

嗯,这不是很有信息量,是吗?😅.

如果你曾经使用过像Tkinter这样的Python GUI库,那么Gradio就像那样。

Gradio是一个GUI库,允许你为你的机器学习模型创建可定制的GUI组件。

现在我们了解了Gradio是什么,让我们进入这个项目。

前提条件

要想成功完成本教程,你需要安装Python。

让我们开始构建

你可以在这里查看这个项目的GitHub仓库。现在我将带你一步一步地完成这个项目。

安装所需的软件包

让我们来安装所需的软件包:

pip install sklearn
pip install pandas
pip install numpy
pip install gradio

获取我们的数据

我们的数据将是.CSV格式的。你可以通过点击这里获得数据。

导入软件包

我们将像这样导入所需的软件包:

import numpy as np

import pandas as pd

import gradio as gr

接下来,我们要过滤警告,这样我们就不会看到它们:

import warnings

warnings.filterwarnings('ignore')

导入数据

接下来,我们要导入我们的数据:

data = pd.read_csv('diabetes.csv')

现在让我们用这个命令看看我们的数据集的小预览:

data.head()

让我们看看我们的数据集中的特征列:

print (data.columns)

获取我们的变量

接下来,我们得到我们的X和Y变量,所以输入这些命令:

x = data.drop(['Outcome'], axis=1)

y = data['Outcome']

分割数据

现在我们要用scikit-learn内置的train_test_split函数来分割我们的数据。

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x,y)

缩放我们的数据

接下来,我们将使用scikit-learn内置的StandardScaler对象来扩展我们的数据:

from sklearn.preprocessing import StandardScaler

#instantiate StandardScaler object
scaler = StandardScaler()

#scale data
x_train_scaled = scaler.fit_transform(x_train)

x_test_scaled = scaler.fit_transform(x_test)

在上面的代码中,我们使用scikit-learn提供的StandardScaler对象来扩展我们的数据。要了解更多关于缩放的信息以及我们为什么要这样做,请点击这里

实例化和训练模型

在本节中,我们将创建和训练我们的模型。我们要使用的模型将是多层感知器分类器,这是一个内置于scikit-learn的神经网络:

#import model object
from sklearn.neural_network import MLPClassifier
model =  MLPClassifier(max_iter=1000,  alpha=1)

#train model on training data
model.fit(x_train_scaled, y_train)

#getting model performance on test data
print("accuracy:", model.score(x_test_scaled, y_test))

为Gradio创建函数

现在,有趣的部分来了。在这里,我们将创建一个函数,该函数将接收我们的模型所训练的数据集的特征,并将其作为一个数组传递给我们的模型进行预测。然后,我们将基于该函数建立我们的Gradio网络应用。

为了理解我们为什么要写一个函数,你必须首先理解Gradio是基于函数为我们的机器学习模型建立GUI组件。这个函数为Gradio提供了一种方法,可以从用户那里获得输入,并将其传递给ML模型,然后ML模型会对其进行处理,然后将其传回给Gradio,Gradio再将结果传递出去。

让我们来写一些代码...

首先,我们将获得特征列,然后传递给我们的函数:

#geting our columns

print(data.columns)

现在,我们将像这样创建我们的函数:

def diabetes(Pregnancies, Glucose, Blood_Pressure, SkinThickness, Insulin, BMI, Diabetes_Pedigree, Age):
#turning the arguments into a numpy array  

 x = np.array([Pregnancies,Glucose,Blood_Pressure,SkinThickness,Insulin,BMI,Diabetes_Pedigree,Age])

  prediction = model.predict(x.reshape(1, -1))

  return prediction

在上面的代码中,我们将数据中的特征列作为参数传入一个名为diabetes的函数。然后我们把参数变成一个NumPy数组,再传给我们的模型进行预测。最后,我们返回我们模型的预测结果。

创建我们的Gradio界面

现在我们要用Gradio来创建我们的Web App界面:

outputs = gr.outputs.Textbox()

app = gr.Interface(fn=diabetes, inputs=['number','number','number','number','number','number','number','number'], outputs=outputs,description="This is a diabetes model")

我们在上面做的第一件事是创建一个名为output的变量,用来保存我们模型结果的GUI组件。我们模型的预测结果将被输出到一个文本框中。

然后,我们实例化了Gradio接口对象,并传入我们先前的糖尿病函数。然后,我们生成了我们的Inputs GUI组件,并告诉收音机期待8个数字形式的输入。

这些输入代表了我们数据集中的特征列--与我们传入糖尿病函数的8个特征列名称相同。

然后,我们将先前的输出变量传入对象中的输出参数。

最后,我们将我们的网络应用的描述传入描述参数。

启动Gradio网络应用程序

现在我们要启动我们的Gradio网络应用:

app.launch()

注意:如果你把Gradio应用程序作为脚本从该命令行启动,你将得到一个本地主机链接,然后你将其复制并粘贴到你的浏览器中,以查看你的Web应用程序。

如果你从Jupyter笔记本上启动该应用,你将在运行单元格时看到该应用的实时预览(也会为你提供一个链接)。

如果你想分享你的网络应用,你所要做的就是在你的启动对象中输入share=True 作为参数:

#To provide a shareable link
app.launch(share=True)

然后你会得到一个扩展名为.gradio的链接。但这个可共享的链接只持续24小时,而且只在你的系统运行时才会持续。因为Gradio只是在你的系统上托管了网络应用。

简单地说,要使你的链接发挥作用,你的系统必须是开着的。这是因为Gradio使用你的系统来托管网络应用程序,所以一旦你的系统关闭,服务器连接就会被切断,你就会得到一个500😅。

幸运的是,Gradio还提供了一种方法,让你永久性地托管你的模型。但该服务是基于订阅的,所以你必须每月支付7美元才能访问它。永久托管超出了本文的范围(部分原因是作者已经破产了😅)。但如果你对它感兴趣,请点击这里

重要资源

摘要

Gradio库真的很酷,它有助于解决困扰机器学习社区的一个巨大问题--模型部署。

90%的机器学习模型都没有被部署,而Gradio正在努力解决这个问题。

它也是初学者和专家展示他们的模型的一种方式,也可以在现实生活中测试模型。

使用Gradio库不会出错。试一试吧。