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