Keras深度学习模型诞生记!

点击上方关注,All in AI中国

作者:Ben Weber

Keras库为深度学习提供了一个容易接近的窗口,使神经网络可以被广泛的受众访问。然而,我当前面临的主要挑战是,从Keras的探索模型过渡到生产模型。Keras是用Python编写的,直到最近,这些语言之外的支持还很有限。虽然诸如Flask、PySPark和CloudML这样的工具可以直接在Python中生成这些模型,但我通常更喜欢用Java来部署模型。

Keras深度学习模型诞生记!

像ONNX(https://github.com/onnx/onnx)这样的项目正在走向/推动深度学习的标准化进程。但支持这些格式的运行时仍然有限。我们经常使用的一种方法是将Keras模型转换为TensorFlow图,然后在其他支持TensorFlow的运行库中使用这些图。我最近发现了Deeplearning4J(DL4J)项目,该项目支持Keras模型,使在Java中进行深度学习变得更加容易(https://deeplearning4j.org/docs/latest/keras-import-overview)。

在深度学习探索的过程中,我最常用的一个用例是使用Keras在Python中训练模型,然后使用Java生成模型。对于需要直接在客户端上进行深度学习的情况(如应用模型的Android设备),以及希望利用Java编写现有的生产系统情况,这一点非常有用。关于使用Keras的DL4J请点击:https://deeplearning4j.org/docs/latest/keras-import-overview。

本文概述了如何在Python中训练Keras模型,并将其部署到Java中的方法。我用Jetty提供实时预测,用谷歌的数据流建立批处理预测系统。运行这些示例所需的完整代码和数据可以在GitHub上找到(https://github.com/bgweber/DeployKeras/tree/master)。

模型训练

第一步是使用Python中的Keras库来训练模型。一旦你有了一个可以用来部署的模型,你就可以将其保存为h5格式,并在Python和Java应用程序中使用它。在本教程中,我们将使用我博客文章中训练过的,预测哪些玩家可能购买新游戏的模型(https://towardsdatascience.com/deploying-keras-deep-learning-models-with-flask-5da4181436a2)。

模型的输入是10个二进制特性(G1、G2、……、G10),它们描述的是玩家已经购买的游戏,标签是一个变量,用来描述用户购买的游戏是否尚未包含在输入中。训练过程中涉及的主要步骤如下:

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

这个过程的输出是一个h5文件,它表示我们可以在Python和Java应用程序中部署的经过训练的模型。在我之前的文章中,我展示了如何使用Flask在Python中提供实时模型预测。在本文中,我将展示如何在Java中构建批处理和实时预测。

Java设置

要使用Java部署Keras模型,我们将使用Deeplearing4j库。它提供了在Java中进行深度学习的功能,并且可以加载和使用经过Keras训练的模型。我们还将使用Dataflow进行批处理预测,使用Jetty进行实时预测。下面是我在这个项目中使用的库:

Deeplearning4j:为Java提供了深度神经网络服务(https://deeplearning4j.org/)。

ND4J:为Java提供张量运算(https://nd4j.org/)。

Jetty:用于设置web端点(https://www.eclipse.org/jetty/)。

Cloud DataFlow:为GCP上的批处理预测提供自动缩放(https://cloud.google.com/dataflow/)。

我使用pom.xml(https://github.com/bgweber/DeployKeras/blob/master/pom.xml)将这些导入到我的项目中,如下所示。对于DL4J来说,在使用Keras时需要核心库和modelimport库。

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

我在Eclipse中设置了我的项目,如果我配置的pom文件没错,就不需要进行额外的设置。

用DL4J进行Keras预测

现在我们已经建立了库,我们可以开始用Keras模型进行预测。我编写了下面的脚本来测试Keras模型并对样本数据集进行预测。第一步是从h5文件加载模型。接下来,我定义一个长度为10的一维张量,并生成随机二进制值。最后一步是调用模型上的输出方法来生成预测。因为我的模型只有一个输出节点,所以我使用getDouble(0)返回模型的输出。

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

使用DL4J时要熟悉的关键概念(之一)是张量。Java没有用来提供有效张量选项的内置库,这也是为什么NDJ4是先决条件的原因。它提供了在Java中实现深度学习后端的n维数组。要在张量对象中设置值,需要传递一个整数数组,该数组为张量提供一个n维索引,并传递要设置的值。因为我使用的是1维张量,所以数组的长度是1。

模型提供了预测和输出方法。预测方法返回预测结果(0或1),而输出方法返回一个连续标签,类似于Scikit-Learning中的predict_proba。

实时预测

现在我们已经在Java中建立并运行了Keras模型,我们可以开始提供模型预测。将采用的第一个方法是使用Jetty在web上建立一个端点来提供模型预测。我以前在跟踪数据和模型生产的帖子中提到过对Jetty的设置。模型端点的完整代码请点击:https://github.com/bgweber/DeployKeras/blob/master/JettyDL4J.java 。

模型端点将作为一个类(single class)实现对Keras模型的加载并提供预测。它实现了对Jetty进行AbstractHandler接口以提供模型结果。下面的代码展示了如何设置Jetty服务以在端口8080上运行,并实例化JettyDL4J类,以及在构造函数中加载Keras模型。

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

管理web请求的处理程序如下面的代码片段所示。将传入的参数(G1、G2、…、G10)转换为1维张量对象,传递给Keras模型的输出方法。然后将请求标记为已处理,并将预测作为字符串返回。

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

当你运行时,它会在端口8080上设置一个端点。你可以通过以下URL来调用模型服务:

Keras深度学习模型诞生记!

结果是一个Keras模型,你现在可以实时调用该模型来从深度学习模型中获得预测。对于生产系统,你可能更希望在Jetty端点前面设置服务,而不是直接在web上公开端点。

批处理预测

Keras模型的另一个用例是批处理预测,你可能需要将估计器应用于数百万条记录。当然 你可以使用Keras模型直接在Python中实现这一点,但是这种方法限制了可扩展性。我将展示如何使用谷歌的数据流将预测应用到使用完全托管管道的大量数据集。我以前在模型制作(https://towardsdatascience.com/data-science-for-startups-model-production-b14a29b2f920)和游戏模拟(https://towardsdatascience.com/scaling-game-simulations-with-dataflow-172926612d50)的文章中提到过如何设置数据流。

通过数据流,你可以指定要在数据集上执行的操作图,其中源数据集和目标数据集可以是关系数据库、消息传递服务、应用程序数据库和其他服务。图像可以作为批处理操作执行,其中基础结构向上旋转以处理大型数据集,然后向下旋转。或者以流模式执行,在该模式中,基础结构被维护,请求在它们到达时被处理。在这两种情况下,服务都将自动优化以满足需求。它完全听从人们的管理,非常适合独立执行大型计算。

Keras深度学习模型诞生记!

上面显示了我的数据流流程中操作的DAG。第一步是为模型创建要评分的数据集。在本例中,我是从样本CSV中加载值的,而在实践中,我通常使用BigQuery作为模型预测值的来源。下一步是转换,需要将TableRow作为输入对象,将行转换为一维张量,并将模型应用于每个张量。使用预测值创建一个新的TableRow。DAG的完整代码请点击:https://github.com/bgweber/DeployKeras/blob/master/DataFlowDL4J.java。

这个管道中的关键步骤是Keras Predict转换,如下面的代码片段所示。对一个对象集合进行转换操作并返回一个对象集合。在转换器中,我们可以定义Keras模型等对象,这些对象与在转换器中定义的每个流程元素步骤之间共享。结果是模型为每个转换器加载一次,而不是为每个需要预测的记录加载一次。

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

流程元素方法的代码如下所示。它读取输入记录,从表格的行创建张量,应用模型,然后保存记录。输出行包含预测值和实际值。

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

Keras深度学习模型诞生记!

在本文中,我排除了CSV加载和BigQuery编写代码块这两种情况,因为你可能使用不同的端点。如果你想尝试运行DAG,可以在GitHub(http://bgweber/)上使用代码和CSV。如果你希望把结果保存到BigQuery中,你需要设置tempLocation程序参数如下:

Keras深度学习模型诞生记!

运行DAG之后,将在BigQuery中创建一个新表,其中包含数据集的实际值和预测值。下面的图像显示了我的Keras模型应用程序中的样本数据点。

Keras深度学习模型诞生记!

与DL4J一起使用数据流的结果是,你可以使用自动标度基础结构来进行批预测,从而获得数百万条记录。

结语

随着深度学习越来越流行,越来越多的语言和环境支持这些模型。随着库开始对模型格式进行标准化,我们可以使用更多的语言进行模型训练和模型部署。这篇文章展示了使用Python中的Keras库训练的神经网络是如何使用Java中的DL4J库进行批处理和实时预测的。这是我第一次将深度学习应用于数百万个数据点。

Keras深度学习模型诞生记!

相关推荐