如果你曾经建立过一个机器学习模型,你可能会想 "嗯,这很酷,但其他人怎么能看到它有多酷?"
模型部署是机器学习的一部分,但它并没有被谈论得那么多。
因此,在这篇文章中,我将向你介绍一个新的工具,它将帮助你为你的机器学习模型生成一个网络应用,然后你可以与其他开发者分享,这样他们就可以试用它了。
我将使用scikit-learn建立一个简单的神经网络模型,并使用Gradio为该模型创建一个GUI(这就是我说的那个很酷的新工具)。
让我们开始吧:
我们不能用创造问题的思维来解决我们的问题 - 阿尔伯特-爱因斯坦
什么是Gradio?
图片来源: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库不会出错。试一试吧。