工程的博客

如何用MLflow实验Keras网络模型:电影评论的二元分类

在您最喜欢的Python IDE中使用MLflow

2018年8月23日 工程的博客

分享这篇文章

上一篇博文,我们演示了您可以轻松入门MLflow这是一个管理机器学习生命周期的开源bob体育客户端下载平台。特别地,我们演示了一个简单的Keras/TensorFlow模型使用MLflow和PyCharm.这次我们探索了一个二元分类Keras网络模型。使用MLflow的跟踪api,我们将跟踪指标-精度和损耗-在基线模型和实验模型之间运行的训练和验证期间。和之前一样,我们将使用PyCharm和localhost运行所有实验。

IMDB电影评论的二元分类

二元分类是一个常见的机器学习问题,您希望将结果分为两个不同的类,特别是对于情感分类。对于这个例子,我们将电影评论分为“积极的”或“消极的”评论,通过检查评论的文本内容,以发现表达情感的常用词。

主要从François Chollet’s借来《Python深度学习》, Keras网络示例代码已经完成模块化和修改构成:构成…MLFlow项目并将MLflow跟踪API记录参数、度量和工件。

方法与实验

因特网电影数据库(IMDB)是打包的Keras;它是一个5万部热门电影的集合,分为2.5万条用于培训的评论和2.5万条用于验证的评论,“积极”和“消极”情绪的分布是均匀的。我们将使用这个数据集来训练和验证我们的模型。

通过简单的数据准备,我们可以将这些数据转换为张量,如numpy数组,用于我们的Keras神经网络从模型到流程。(读取和准备数据的代码在模块中:data_utils_nn.py.)

我们将创建两个Keras神经网络模型-基线和实验并在我们的数据集上训练它们。而基准模型会不会保持不变,我们会不会用这两个实验实验模型,通过提供不同的调优参数和损失函数来比较结果。

这就是MLflow的跟踪组件极大地帮助我们评估无数调优参数中的哪一个在我们的模型中产生最佳指标。让我们先来看看基线模型。

基线模型:Keras神经网络性能

来源:Python深度学习

François的代码示例使用这个Keras网络体系结构选择进行二进制分类。它由三个部分组成致密层: 1个隐藏层(16个单元),1个输入层(16个单元),1个输出层(1个单元),如图所示。“隐藏单位是层的表示空间中的一个维度,”Chollet写道,16对于这个问题空间已经足够了;对于复杂的问题,如图像分类,我们总是可以增加单元或添加隐藏层来进行实验,并观察其对精度和损失指标的影响(我们将在下面的实验中进行)。

而输入层和隐藏层使用线性整流函数(Rectified Linear Unit)作为激活函数,最终输出层使用乙状结肠,将其结果压缩为[0,1]之间的概率。数值接近1表示正,而低于0.5则表示负。

使用这个推荐的基线架构,我们训练我们的基础模型,并记录所有的参数、度量和工件。此代码片段来自模块models_nn.py,创建了一个密集层的堆栈,如上图所示。

....defbuild_basic_model自我):base_model = models.Sequential()base_model.add (layers.Dense (16激活=“relu”, input_shape = (10000)))base_model.add (layers.Dense (16激活=“relu”))base_model.add (layers.Dense (1激活=“乙状结肠”))返回base_model

接下来,在建立模型之后,我们编译模型,使用适当的损失函数和优化器。由于我们期望概率作为最终输出,二元分类的推荐损失函数为binary_crosstropy相应的建议优化器为rmsprop。来自模块的代码片段train_nn.py编译我们的模型。

keras进口优化器......如果优化器= =“rmsprop”opt = optimizer . rmsprop (lr=lr)模型。编译(optimizer=opt, loss= ' binary_crossentropy ', metrics=[' accuracy '])...

最后,我们通过运行迭代或epoch来拟合(训练)和评估,每次迭代使用IMDB数据集中的512个样本的默认批量大小,并使用默认参数:

  • epoch = 20
  • Loss = binary_misantropy
  • 单位= 16
  • 隐藏层= 1

从命令行运行,cd到Git存储库目录keras / imdbclassifier然后运行:

python main_nn.py

或者从GitHub回购顶级目录运行:

Mlflow运行keras/imdbclassifier -e main

或者直接从Gitbub:

Mlflow运行https://github.com/dmatrix/jsd-mlflow-examples.git#keras/imdbclassifier

https://www.youtube.com/watch?v=6oGIwyAlUIM
图1:在本地主机上使用基本模型参数运行动画

在运行结束时,模型将打印一组最终指标,例如binary_lossbinary_accuracyvalidation_loss,validation_accuracy对于所有迭代后的训练集和验证集。

图2:使用基本模型参数运行结果和度量

正如您将从运行中注意到的那样,损失随着迭代而减小,而精度却在增加,前者收敛于0,后者收敛于1。

我们最终的训练数据(binary_loss)收敛到0.211,验证数据(validation_loss)与0.29(与binary_loss.另一方面,精度在几个epoch后出现了分歧,这表明我们可能过度拟合了训练数据(见下图)。

请注意:要访问这些图,启动MLFlow UI,单击任何实验运行,并访问其工件的文件夹。)

当使用未见过的IMDB评论进行预测时,预测结果的平均准确率为0.88,接近我们的验证精度,但仍然相差很远。然而,正如你所看到的,对于一些评论,该网络自信地预测结果,有99%的可能性是积极的评论。

图3a:用基础和实验模型参数记录的Matplotlib工件
图3b:用基础和实验模型参数记录的Matplotlib工件

此时,在观察了基本的模型度量之后,您可能会问,我们能做得更好吗?我们是否可以调整一些调优参数,如隐藏层数、epoch、损失函数或单位,以影响更好的结果。让我们尝试一些推荐的实验。

实验模型:Keras神经网络性能

MLflow的跟踪组件允许我们用不同的参数跟踪模型的实验运行,并持久化它们的度量和工件以供分析。正如Chollet所建议的,让我们使用以下实验参数进行几次运行,这些参数与默认模型不同,并观察结果:

模型 单位 时代 损失函数 隐藏层
基地 16 20. binary_crosstropy 1
实验一 32 30. binary_crosstropy 3.
实验二 32 20. 均方误差 3.

表1:模型和参数

在本地主机上运行实验

因为我们在本地机器上运行MLflow,所以所有结果都在本地记录。但是,您可以轻松地记录度量在Databricks的托管跟踪服务器上远程运行,通过简单地设置环境变量MLFLOW_TRACKING_URI或以编程方式设置mlflow.set_tracking_uri ()

要么连接到跟踪URI并记录结果。在这两种情况下,URI可以是远程服务器的HTTP/HTTPS URI,也可以是目录的本地路径。在本地主机上,URI默认为mlruns目录中。

使用MLFlow在PyCharm中运行实验

由于我更喜欢使用PyCharm进行Python开发,所以我将在笔记本电脑上的PyCharm中运行实验,并提供实验参数。下面是第一个实验的动画。(要学习如何在PyCharm中使用MLflow,请阅读我之前的博客).

虽然我是通过在PyCharm的运行配置中提供参数来运行这些实验的,但您也可以从顶级目录轻松地在命令行上运行这些实验:

mlflow运行keras/imdbclassifier -e main -P hidden_layers=3 -P epoch =30mlflow运行keras/imdbclassifier -e main -P hidden_layers=3 -P output=32 -P loss=mse

https://www.youtube.com/watch?v=Wgt6f6CfpkY
图4:实验1模型参数的动画运行

所有实验的运行都被记录下来,我们可以检查每个指标并比较各种运行以评估结果。所有用来记录这些工件的代码MLflow跟踪APItrain_nn.py模块。下面是部分代码片段:

....mlflow.start_run ():#日志参数mlflow.log_param (“hidden_layers”args.hidden_layers)mlflow.log_param (“输出”args.output)mlflow.log_param (“时代”args.epochs)mlflow.log_param (“loss_function”args.loss)#日志度量mlflow.log_metric (“binary_loss”ktrain_cls.get_binary_loss(历史))mlflow.log_metric (“binary_acc”ktrain_cls.get_binary_acc(历史))mlflow.log_metric (“validation_loss”ktrain_cls.get_binary_loss(历史))mlflow.log_metric (“validation_acc”ktrain_cls.get_validation_acc(历史))mlflow.log_metric (“average_loss”,结果0])mlflow.log_metric (“average_acc”,结果1])# log artifacts (matplotlib图像的丢失/准确性)mlflow.log_artifacts (image_dir)#日志模式mlflow.keras.log_model (keras_model model_dir)打印“损失函数使用”args.loss)如果__name__ = =“__main__ '# main用于测试功能解析器= KParseArgs()Args = parser.parse_args()国旗=len(sys.argv) = =1如果国旗:打印“使用默认基线参数”其他的打印“利用实验参数”打印”hidden_layers:“args.hidden_layers)打印输出:“args.output)打印”时代:“args.epochs)打印损失:“args.loss)KTrain()。train_models (args,标志)

使用MLFlow UI进行实验和结果比较

现在是最好的部分。MLflow允许您从MLflow GUI查看所有运行和记录的结果,您可以在其中比较所有三次运行的指标。最近的UI改进MLFlow v0.5.1在比较运行时提供更好的体验。

要在本地主机上启动Flask跟踪服务器:5000,请使用命令行mlflow ui

图5:MLflow UI所有运行的度量、参数和工件的表视图

例如,我可以比较所有三个实验的指标,以查看哪个运行产生了可接受的验证精度和损失,以及查看每个实验的matplotlib图像,以查看它们在各个时代的表现。

https://www.youtube.com/watch?v=89I0Tro8BAQ
图6:带有实验参数的度量的动画视图

比较三次测试的结果

通过在MLFlow UI中快速检查我们的运行,我们可以轻松地观察到以下内容:

  • 改变epoch数并没有给我们带来任何好处,除了模型开始过拟合,因为它达到了99%的训练精度,验证精度没有相应的差异,在几个epoch后出现了分歧。
  • 将损失函数更改为均方误差,单位为32,隐藏层为3,然而,给了我们一个更好的验证损失和收敛average_loss为0表示验证数据。通过在模型之间密切跟踪其他指标,几个额外的隐藏层和更多的单元将验证损失最小化。
图7:比较三个带参数的运行

用进一步的实验改进模型度量

值得注意的是,François Chollet假设,通过进一步的训练、验证和测试(TVT),我们可以实现更高的精度,超过95%,并将损失收敛到0.01%。实现这一目标的一种方法是通过进一步的机器学习技术实验,例如
添加更多数据、简单保持验证、k-fold验证、添加权重正则化、添加退出网络层并增加网络容量.这可以最大限度地减少过拟合并实现泛化,从而提高精度和最小化损失。

我们可以在这里实现这些技术,进行进一步的实验,并使用MLflow来评估结果。我把这个留给读者做练习。

因为这样的实验和迭代是数据科学家评估模型的核心,MLflow促进了这样的生命周期任务。在这种程度上,这篇博客演示了MLflow的部分功能。

封闭的思想

到目前为止,我们演示了MLflow跟踪组件的api的关键用途,以记录模型的无数参数、指标和工件,以便在任何时候或任何人都可以从模型的MLflow Git项目存储库中重现结果。

其次,通过命令行、PyCharm运行和MLFlow UI,我们比较了各种运行以检查最佳指标,并观察到通过改变一些参数,我们接近了一个模型,该模型可能可以以可接受的精度用于基于表达积极或消极评论的常见词汇对IMDB电影评论进行情感分类。更好的是,如前所述,我们可以通过使用建议的机器学习技术进一步改进模型的结果。

最后,但非常重要的是,我们在本地主机上尝试使用PyCharm中的MLflow,但我们也可以轻松地在远程服务器上跟踪实验。随着MLflow、Numpy、Pandas、Keras和TensorFlow包被安装到我们的PyCharm Python虚拟环境中,这种有方法的模型实验迭代是机器学习模型生命周期中至关重要的一步。MLflow平台促进了这一关键bob体育客户端下载步骤——所有这些都在您最喜欢的Python IDE中进行。

接下来是什么

现在我们已经将基线模型与几个实验模型进行了比较,并且已经看到了MLflow的优点,那么下一步是什么呢?尝试MLflowmlflow.org开始吧。或者尝试文档中的一些教程和示例。

阅读更多

这里有一些资源供你了解更多:BOB低频彩

免费试用Databricks

相关的帖子

看到所有工程的博客的帖子