Deeplearning4j:JVM 的深度學習和 ETL
本文轉載自微信公眾號「Java架構大仙」,作者Java架構大仙。轉載本文請聯系Java架構大仙公眾號。
Deeplearning4j 旨在將模型與 Java 應用程序集成,提供了一組組件,用于構建包含 AI 的基于 JVM 的應用程序。
Eclipse Deeplearning4j是一個用于 JVM 的開源分布式深度學習庫。Deeplearning4j 是用 Java 編寫的,與任何 JVM 語言兼容,例如Scala、Clojure 或Kotlin。底層計算是用 C、C++ 和Cuda 編寫的。Keras將用作 Python API。Deeplearning4j與 Hadoop 和Apache Spark集成,將 AI 帶入業務環境,以在分布式 GPU 和 CPU 上使用。
Deeplearning4j實際上是一堆項目,旨在支持基于 JVM 的深度學習應用程序的所有需求。除了 Deeplearning4j 本身(高級 API),它還包括ND4J(通用線性代數)、SameDiff(基于圖的自動微分)、DataVec (ETL)、Arbiter(超參數搜索)和C++ LibND4J(支持所有上述的)。LibND4J 反過來調用標準庫來支持 CPU 和 GPU,例如OpenBLAS、OneDNN (MKL-DNN)、cuDNN和cuBLAS。
Eclipse Deeplearning4j 的目標是為構建包含 AI 的應用程序提供一組核心組件。企業內的 AI 產品通常具有比機器學習更廣泛的范圍。該發行版的總體目標是為構建深度學習應用程序提供智能默認值。
Deeplearning4j 在某種程度上與其他所有深度學習框架競爭。范圍內最具可比性的項目是TensorFlow,它是領先的端到端深度學習生產框架。TensorFlow 目前有 Python、C++ 和 Java(實驗性)的接口,以及 JavaScript 的單獨實現。TensorFlow 使用兩種訓練方式:基于圖和立即模式(eager execution)。Deeplearning4j 目前僅支持基于圖的執行。
PyTorch,可能是領先的深度學習研究框架,只支持即時模式;它有 Python、C++ 和 Java 的接口。H2O Sparkling Water 將 H2O 開源分布式內存機器學習平臺與 Spark 集成。H2O 具有 Java 和 Scala、Python、R 和 H2O Flow 筆記本的接口。
Deeplearning4j 的商業支持可以從Konduit購買,它也支持許多從事該項目的開發人員。
Deeplearning4j 的工作原理
Deeplearning4j 將加載數據和訓練算法的任務視為單獨的過程。您使用 DataVec 庫加載和轉換數據,并使用張量和 ND4J 庫訓練模型。
您通過RecordReader接口攝取數據,并使用RecordReaderDataSetIterator. 您可以選擇一個DataNormalization類作為您的DataSetIterator. 使用ImagePreProcessingScaler圖像數據時,NormalizerMinMaxScaler如果沿輸入數據的所有尺寸的均勻范圍,NormalizerStandardize對于其他大多數情況下。如有必要,您可以實現自定義DataNormalization類。
DataSet對象是數據特征和標簽的容器,并將值保存在以下幾個實例中INDArray:一個用于示例的特征,一個用于標簽,另外兩個用于屏蔽(如果您使用的是時間序列數據)。在特征的情況下,INDArray是大小為 的張量Number of Examples x Number of Features。通常,您會將數據分成小批量進行訓練;an 中的示例數量INDArray小到足以放入內存,但大到足以獲得良好的梯度。
如果您查看用于定義模型的 Deeplearning4j 代碼,例如下面的 Java 示例,您會發現它是一個非常高級的 API,類似于 Keras。事實上,Deeplearning4j 的計劃 Python 接口將使用 Keras;現在,如果您有 Keras 模型,則可以將其導入 Deeplearning4j。
- MultiLayerConfiguration conf =新的NeuralNetConfiguration 。建造者() 。optimizationAlgo (OptimizationAlgorithm 。STOCHASTIC_GRADIENT_DESCENT )。更新程序(新Nesterovs (learningRate ,0.9 ))。列表(新DenseLayer 。生成器()。n在(numInputs )。NOUT (numHiddenNodes )。激活(“RELU” )。
- 構建(),新的輸出層。生成器(LossFunction . NEGATIVELOGLIKELIHOOD )。激活(“softmax” )。n在(numHiddenNodes )。nOut ( numOutputs )。構建() )。反向傳播(真)。構建();
該MultiLayerNetwork班可在Eclipse Deeplearning4j最簡單的網絡配置的API; 對于 DAG 結構,請ComputationGraph改用 。請注意,優化算法(本例中的 SGD)與更新器(本例中的 Nesterov)是分開指定的。這個非常簡單的神經網絡有一個帶有ReLU激活函數的密集層和一個帶有-log(likelihood)損失和softmax激活函數的輸出層,并通過反向傳播解決。更復雜的網絡也可能具有GravesLSTM、ConvolutionLayer、EmbeddingLayer和其他支持的兩打層類型和十六層空間類型。
訓練模型的最簡單方法是.fit()使用您DataSetIterator的參數調用模型配置上的方法。您還可以重置迭代器并根據需要在任意.fit()多個時期內調用該方法,或者使用EarlyStoppingTrainer.
要測試模型性能,請使用一個Evaluation類來查看訓練模型與測試數據的擬合程度,這些數據不應與訓練數據相同。
Deeplearning4j 提供了一個偵聽器工具,可幫助您直觀地監控網絡的性能,它將在每個小批量處理后調用。最常用的偵聽器之一是ScoreIterationListener.
安裝和測試 Deeplearning4j
目前,試用 Deeplearning4j 的最簡單方法是使用官方快速入門。它需要相對較新的 Java 版本、Maven 的安裝、工作的 Git 以及 IntelliJ IDEA(首選)或 Eclipse 的副本。還有一些用戶提供的快速入門。首先使用 Git 或 GitHub Desktop 將 eclipse/deeplearning4j-examples 存儲庫克隆到您自己的機器上。然后從 dl4j-examples 文件夾使用 Maven 安裝項目。
- martinheller @馬丁斯-視網膜-的MacBook dl4j -實例%MVN全新安裝
- [ INFO ]掃描的項目... [ WARNING ] [ WARNING ]部分中遇到的問題,同時建立有效的模式進行組織。deeplearning4j :dl4j -實例:罐子:1.0 。0 - beta7 [警告]
- 'build.plugins.plugin.(groupId:artifactId)'必須是唯一的,但發現插件 org 的重復聲明。阿帕奇。行家。插件:行家-編譯-插件@行250 ,列21
- [ WARNING ]
- [ WARNING ]這是強烈推薦,因為他們威脅到你構建的穩定性,解決這些問題。[ WARNING ] [ WARNING ]對于這個原因,未來
- Maven的版本可能不會再支持建立這種畸形的項目。
- [警告]
- [信息]
- [信息] ------------------<組織。deeplearning4j : dl4j - examples >----------------- [信息] DL4J 1.0 的構建簡介。0 - beta7 [ INFO ] --------------------------------[ jar ]--------- ------------------------下載自
- 中央:https ://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-enforcer-plugin/1.0.1/maven-enforcer-plugin-1.0.1.pom從中央
- 下載:https : //repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-enforcer-plugin/1.0.1/maven-enforcer-plugin-1.0.1.pom (6.5 kB at 4.4 kB/s )從中央下載:https : //repo.maven.apache.org/maven2/org/apache/maven/enforcer/enforcer/1.0.1/enforcer-1.0.1.pom從中央下載:https :
- //repo.maven.apache.org/maven2/org/apache/maven/enforcer/enforcer/1.0.1/enforcer-1.0.1.pom (11 kB at 137 kB/s)從中央
- 下載: https : // repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-enforcer-plugin/1.0.1/maven-enforcer-plugin-1.0.1.jar從中央下載:https ://repo.maven .apache.org/maven2/org/apache/maven/plugins/maven-enforcer-plugin/1.0.1/maven-enforcer-plugin-1.0.1.jar (22 kB at 396 kB/s)從中央下載:https : //repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/1.4.0/exec-maven-plugin-1.4.0.pom
- 從中央下載:https : //repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/1.4.0/exec-maven-plugin-1.4.0.pom (12 kB at 283 kB/s)從中央下載:https : //repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/1.4.0/exec-maven-plugin-1.4.0.jar 已下載來自中央:https ://repo.maven.apache.org/maven2/org/codehaus/mojo/exec-maven-plugin/1.4.0/exec-maven-plugin-1.4.0.jar(46 kB at 924 kB /s)從中央下載:https :
- //repo.maven.apache.org/maven2/com/lewisd/lint-maven-plugin/0.0.11/lint-maven-plugin-0.0.11.pom從中央
- 下載:https ://repo.maven.apache .org/maven2/com/lewisd/lint-maven-plugin/0.0.11/lint-maven-plugin-0.0.11.pom(19 kB at 430 kB/s)從中央下載:https ://repo.maven .apache.org/maven2/com/lewisd/lint-maven-plugin/0.0.11/lint-maven-plugin-0.0.11.jar從中央下載:https ://repo.maven.apache.org/maven2/ com/lewisd/lint-maven-plugin/0.0.11/lint-maven-plugin-0.0.11.jar (106 kB at 1.6 MB/s)從中央下載
- : https : //repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-compiler-plugin/3.5.1/maven-compiler-plugin-3.5.1.pom
- ...
- [警告] - org . agrona 。收藏品。散列[警告] - org 。agrona 。收藏品。Long2ObjectCache$ValueIterator [警告] -組織。agrona 。收藏品。Int2ObjectHashMap$EntrySet [警告] -
- 組織。agrona 。并發。SleepingIdleStrategy
- [警告] - org 。agrona 。收藏品。MutableInteger [警告] - org 。agrona 。收藏品。Int2IntHashMap [警告] - org 。agrona 。收藏品。IntIntConsumer 【警告】-組織。agrona 。同時
- . 狀態。StatusIndicator
- [警告] - 175更多... [警告] javafx - base - 14 - mac 。jar 、javafx - graphics - 14 - mac 。罐子,雅加達。XML 。綁定- API - 2.3 。2.jar定義1 個重疊類:[警告]
- -模塊-信息[ WARNING ]的protobuf - 1.0 。0 - β7的。罐子,番石榴- 19.0 。罐限定3重疊的類:[ WARNING ] - COM 。谷歌。第三方。公共后綴。TrieParser [警告] - com 。谷歌。第三方。公共后綴。
- PublicSuffixPatterns
- [警告] - com 。谷歌。第三方。公共后綴。PublicSuffixType [ WARNING ] JSR305 - 3.0 。2.jar ,番石榴- 1.0 。0 - β7的。罐限定35重疊的類:[ WARNING ] -的javax 。注釋。正則表達式[警告] - javax
- . 注釋。并發。不可變
- [警告] - javax 。注釋。元。TypeQualifierDefault [警告] - javax 。注釋。元。TypeQualifier [警告] - javax 。注釋。語法[警告] - javax 。注釋。檢查返回值[警告]
- - javax 。注釋。CheckForNull
- [警告] - javax 。注釋。非空[警告] - javax 。注釋。元。TypeQualifierNickname [警告] - javax 。注釋。MatchesPattern [警告] - 還有25個...... [警告] maven -陰影-
- 插件檢測到某些類文件
- [警告]存在于兩個或多個JAR 中。當這種情況發生,只有一個[ WARNING ]單一的版本類被復制到超級罐子。【警告】通常這是不是有害的,并可以跳過這些警告,[警告] ,否則試圖基于手動排除假象
- [警告] mvn 依賴項:tree - Ddetail = true和上面的輸出。[警告]參見HTTP ://maven.apache.org/plugins/maven-shade-plugin/ [ INFO ] 。附接陰影偽影。[ INFO ] [ INFO ] --- Maven的-安裝-插件:2.4 :安裝(默認-安裝) @
- dl4j -實例--- [ INFO ]安裝/體積/數據/回購/ deeplearning4j -實例/ dl4j -實例/目標/ dl4j -實例- 1.0 。0 - β7的。jar 到/ Users / martinheller /。m2 /存儲庫/組織/ deeplearning4j / dl4j -
- 實例/ 1.0 。0 -聯蛋白β7 / dl4j -實例- 1.0 。0 - β7的。jar
- [信息]安裝/卷/數據/ repos / deeplearning4j - examples / dl4j - examples / pom 。xml 到/ Users / martinheller /。m2 /存儲庫/組織/ deeplearning4j / dl4j -示例/ 1.0 . 0 -聯蛋白β7 / dl4j -實例- 1.0 。0 - β7的。POM
- [ INFO ]安裝/體積/數據/回購/ deeplearning4j -實例/ dl4j -實例/目標/ dl4j -實例- 1.0 。0 - beta7 -陰影。jar 到/ Users / martinheller /。m2 / repository / org / deeplearning4j / dl4j - examples / 1.0 。0 -聯蛋白β7 / dl4j -實例- 1.0 。0 - β7的-陰影。jar
- [信息] ---------------------------------------------- -------------------------- [信息]
- 構建成功
- [信息] --------------------------------------------- --------------------------- [ INFO ]總時間: 05 : 07 min [ INFO ]完成時間: 2020 - 07 - 10T10 : 58 : 55 - 04 : 00 [信息] ----------------------------------------- ------------------------------- martinheller@Martins - Retina - MacBook dl4j
- -例子%
安裝完成后,使用 IntelliJ IDEA 打開 dl4j-examples/ 目錄并嘗試運行一些示例。
dl4j-examples 下的 README 列出了所有示例并對其進行了簡要說明。順便說一句,您可以使用 IntelliJ IDEA 首選項安裝新版本的 JDK 并將其應用于項目。
著名的鳶尾花數據集只有 150 個樣本,通常很容易建模,盡管其中一些鳶尾花經常被錯誤分類。這里使用的模型是三層密集神經網絡。
運行上圖所示的 Iris 分類器會產生相當好的擬合:準確率、精確度、召回率和 F1 分數都約為 98%。請注意,在混淆矩陣中,只有一個測試用例被錯誤分類。
線性分類器演示在幾秒鐘內運行,并為訓練和測試數據集生成概率圖。數據是專門為線性可分為兩類而生成的。
MNIST 手寫數字數據集的多層感知器 (MLP) 分類模型在大約 14K 次迭代后產生了約 97% 的準確度、精確度、召回率和 F1 分數。這不如卷積神經網絡(如 LeNet)在該數據集上的結果好或快。
Deeplearning4j 性能
對 Java 程序進行基準測試可能很棘手。特別是,您需要在對代碼進行計時之前對其進行預熱以消除 JIT 編譯器的開銷,并且您需要確保 JVM 具有足夠的 RAM 配置用于進行基準測試的程序。Deeplearning4j 社區為各種流行的模型和配置維護了一個基準代碼存儲庫。
據開發人員稱,Deeplearning4j 在使用多個 GPU 的非平凡圖像識別任務中與 Caffe 一樣快。要使用多臺機器,您可以使用 Spark 運行 Deeplearning4j
Java 應用程序的深度學習
總的來說,Deeplearning4j 是一個很有價值的庫,用于加載和調節數據以及在 Java VM 上執行深度學習。雖然尚未像 TensorFlow 或 PyTorch 那樣成熟,但 Deeplearning4j 將吸引希望將深度學習模型集成到基于 Java 的應用程序中的數據科學家。Deeplearning4j 能夠導入 Keras 模型,這將簡化想要從 TensorFlow 轉換的人的過渡。
Deeplearning4j 支持創建圖形然后運行它們,就像TensorFlow 1 一樣。它不支持即時模式訓練,如 TensorFlow 2 和 PyTorch。這對生產來說并不重要,但它可能會使使用 Deeplearning4j 對研究的吸引力降低。
Deeplearning4j 目前有兩種分布式訓練機制,參數平均和梯度共享。后者更可取,但它僅在版本 1.0.0-beta3 中添加到庫中。Deeplearning4j 還與 Spark 集成,這有助于支持在一組機器上進行訓練。在具有多個 GPU 的單個服務器上進行訓練時,使用 Spark 并沒有真正的幫助。