Keras深度學習模型誕生記!

點擊上方關注,All in AI中國

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深度學習模型誕生記!


分享到:


相關文章: