当前位置: 首页 > 科技观察

Deeplearning4j:JVM之深度学习与ETL

时间:2023-03-15 11:12:58 科技观察

本文转载自微信公众号《Java架构大显》,作者Java架构大显。转载本文请联系Java架构大仙公众号。Deeplearning4j旨在将模型与Java应用程序集成,提供了一组组件,用于构建包含AI的基于JVM的应用程序。EclipseDeeplearning4j是一个用于JVM的开源分布式深度学习库。Deeplearning4j是用Java编写的,并且与任何JVM语言兼容,例如Scala、Clojure或Kotlin。底层计算是用C、C++和Cuda编写的。Keras将用作PythonAPI。Deeplearning4j与Hadoop和ApacheSpark集成,将AI带入业务环境,以便在分布式GPU和CPU上使用。Deeplearning4j实际上是一堆项目,旨在支持基于JVM的深度学习应用程序的所有需求。除了Deeplearning4j本身(高级API),它还包括ND4J(一般线性代数)、SameDiff(基于图的自动微分)、DataVec(ETL)、Arbiter(超参数搜索)和C++LibND4J(支持以上所有).LibND4J依次调用CPU和GPU支持的标准库,例如OpenBLAS、OneDNN(MKL-DNN)、cuDNN和cuBLAS。EclipseDeeplearning4j的目标是提供一组核心组件,用于构建包含AI的应用程序。企业内的AI产品通常比机器学习具有更广泛的范围。该发行版的总体目标是为构建深度学习应用程序提供智能默认值。Deeplearning4j在某种程度上与其他所有深度学习框架竞争。范围内最具可比性的项目是领先的端到端生产深度学习框架TensorFlow。TensorFlow目前有针对Python、C++和Java(实验性)的接口,以及针对JavaScript的单独实现。TensorFlow使用两种训练方法:基于图和即时模式(eagerexecution)。Deeplearning4j目前仅支持基于图的执行。PyTorch,可能是领先的深度学习研究框架,只支持即时模式;它具有与Python、C++和Java的接口。H2OSparklingWater将H2O开源分布式内存机器学习平台与Spark集成。H2O具有与Java和Scala、Python、R以及H2OFlownotebook的接口。可以从Konduit购买对Deeplearning4j的商业支持,它也支持从事该项目的许多开发人员。Deeplearning4j的工作原理Deeplearning4j将加载数据和训练算法的任务视为单独的进程。您使用DataVec库加载和转换数据,并使用张量和ND4J库训练模型。您通过RecordReader接口获取数据并使用RecordReaderDataSetIterator。您可以选择一个DataNormalization类作为您的DataSetIterator。当使用ImagePreProcessingScaler图像数据时,NormalizerMinMaxScaler如果沿输入数据的所有维度具有统一范围,则NormalizerStandardize用于大多数其他情况。如有必要,您可以实现自定义DataNormalization类。一个DataSet对象是数据特征和标签的容器,并保存几个INDArray实例中的值:一个用于示例的特征,一个用于标签,两个用于掩蔽(如果您处理的是时间序列数据).在特征的情况下,INDArray是大小为示例数x特征数的张量。通常,您会将数据分成小批量进行训练;INDArray中的示例数量足够小以适合内存,但足够大以获得良好的梯度。如果您查看用于定义模型的Deeplearning4j代码,例如下面的Java示例,您会发现它是一个非常高级的API,类似于Keras。事实上,Deeplearning4j计划的Python接口将使用Keras;现在,如果您有Keras模型,您可以将其导入Deeplearning4j。MultiLayerConfigurationconf=新的NeuralNetConfiguration。建设者()。优化算法(优化算法。STOCHASTIC_GRADIENT_DESCENT)。更新程序(新Nesterovs(学习率,0.9))。List(newDenseLayer.Generator().nin(numInputs).Nout(numHiddenNodes).Activation("RELU").Build(),newOutputLayer.Generator(LossFunction.NEGATIVELOGLIKELIHOOD).Activation("softmax").nIn(numHiddenNodes).nOut(numOutputs).Build())。反向传播(真)。建造();MultiLayerNetwork类在EclipseDeeplearning4j的API中可用,用于最简单的网络配置;对于DAG结构,请改用ComputationGraph。请注意,优化算法(在本例中为SGD)与更新器(在本例中为Nesterov)分开指定。这个非常简单的神经网络有一个具有ReLU激活函数的密集层和一个具有-log(likelihood)损失和softmax激活函数的输出层,并通过反向传播求解。更复杂的网络可能还有GravesLSTM、ConvolutionLayer、EmbeddingLayer和其他支持两打层类型和十六种空间类型的网络。训练模型的最简单方法是使用DataSetIterator的参数在模型配置上调用.fit()方法。您还可以重置迭代器并调用.fit()方法进行任意数量的迭代,或者使用EarlyStoppingTrainer。要测试模型性能,请使用评估类来查看训练模型与测试数据的拟合程度,这些数据不应与训练数据相同。Deeplearning4j提供了一个监听器工具来帮助您直观地监控网络的性能,它会在每个小批量之后被调用。最常用的侦听器之一是ScoreIterationListener。安装和测试Deeplearning4j目前,试用Deeplearning4j最简单的方法是使用官方快速入门。它需要相对较新版本的Java、Maven的安装、可用的Git以及IntelliJIDEA(首选)或Eclipse的副本。还有一些用户提供的快速入门。首先使用Git或GitHubDesktop将eclipse/deeplearning4j-examples存储库克隆到您自己的机器上。然后使用dl4j-examples文件夹中的Maven安装项目。martinheller@martins-retina-macbookdl4j-instance%mvncleaninstall[信息]扫描的项目...[警告][警告]部分在为组织构建有效模式时遇到问题。deeplearning4j:dl4j-instance:jars:1.0.0-beta7[警告]'build.plugins.plugin.(groupId:artifactId)'必须是唯一的,但发现了插件组织的重复声明。阿帕奇。专家。插件:maven-compile-plugins@line250,column21[WARNING][WARNING]强烈推荐,因为它们会威胁构建的稳定性,修复它们。[警告][警告]因此,Maven的未来版本可能不再支持构建此类格式错误的项目。[警告][信息][信息]----------------<组织。deeplearning4j:dl4j-examples>----------------[信息]DL4J1.0构建简介。0-beta7[信息]--------------------------------[罐子]-------------------------------从中央下载: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.5kBat4.4kB/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(11kBat137kB/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(22kBat396kB/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(12kBat283kB/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(46kBat924kB/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(19kBat430kB/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(106kBat1.6MB/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.a格罗纳收藏品。哈希[警告]-org。阿格罗纳收藏。Long2ObjectCache$ValueIterator[警告]-组织。阿格罗纳收藏。Int2ObjectHashMap$EntrySet[警告]-组织。阿格罗纳同时。SleepingIdleStrategy[警告]-org.阿格罗纳收藏。MutableInteger[警告]-组织。阿格罗纳收藏。Int2IntHashMap[警告]-org.阿格罗纳收藏。IntIntConsumer[警告]-组织。阿格罗纳同时。地位。StatusIndicator[警告]-175更多...[警告]javafx-base-14-mac。jar,javafx-graphics-14-mac。罐子,雅加达。XML。bindings-api-2.3.2.jar定义了1个重叠类:[warning]-module-info[WARNING]protobuf-1.0.0-beta7。罐子,guava-19.0。Jars定义了3个重叠的类:[WARNING]-COM。谷歌。第三者。公共后缀。TrieParser[警告]-com。谷歌。第三者。公共后缀。PublicSuffixPatterns[警告]-com。谷歌。第三者。公共后缀。PublicSuffixType[警告]JSR305-3.0.2.jar,guava-1.0.0-beta7。Jars定义了35个重叠的类:[警告]-javax.笔记。正则表达式[警告]-javax.comments。同时。不可变[警告]-javax.笔记。元。TypeQualifierDefault[警告]-javax.笔记。元。TypeQualifier[警告]-javax.笔记。语法[警告]-javax。笔记。检查返回值[警告]-javax.笔记。CheckForNull[警告]-javax.笔记。非空[警告]-javax.笔记。元。TypeQualifierNickname[警告]-javax.笔记。MatchesPattern[警告]-25更多...[警告]maven-shadow-plugin检测到某些类文件[警告]存在于两个或多个JAR中。发生这种情况时,只有一个[WARNING]单一版本类被复制到超级jar。[Warning]通常这不是有害的,可以跳过这些警告,[Warning],否则尝试手动排除falsebased[Warning]mvndependencies:tree-Ddetail=true和上面的输出。[警告]请参阅http://maven.apache.org/plugins/maven-shade-plugin/[INFO]。附加阴影工件。[信息][信息]---maven-install-plugins:2.4:install(default-install)@dl4j-instances---[INFO]安装/volume/data/repos/deeplearning4j-instances/dl4j-instances/target/dl4j-实例-1.0.0-beta7。jar到/Users/martinheller/。m2/存储库/组织/deeplearning4j/dl4j-instance/1.0.0-catenin-beta7/dl4j-instance-1.0.0-beta7。jar[信息]安装/volumes/data/repos/deeplearning4j-examples/dl4j-examples/pom.jarxml到/Users/martinheller/。m2/存储库/组织/deeplearning4j/dl4j-example/1.0.0-catenin-beta7/dl4j-example-1.0.0-beta7。POM[信息]安装/volumes/data/repos/deeplearning4j-instances/dl4j-instances/targets/dl4j-instances-1.0.0-beta7-shadow。jar到/Users/martinheller/。m2/repository/org/deeplearning4j/dl4j-examples/1.0.0-catenin-beta7/dl4j-examples-1.0.0-beta7的阴影。jar[信息]--------------------------------------------------------------------[INFO]构建成功[INFO]---------------------------------------------------------------------[INFO]总时间:05:07min[INFO]完成时间:2020-07-10T10:58:55-04:00[信息]--------------------------------------------------------------------martinheller@Martins-Retina-MacBookdl4j-examples%安装完成后,使用IntelliJIDEA打开dl4j-examples/目录,尝试运行一些示例。dl4j-examples下的README列出了所有示例并对其进行了简要描述。顺便说一句,您可以使用IntelliJIDEA首选项来安装新版本的JDK并将其应用到您的项目中。著名的鸢尾花数据集只有150个样本,通常很容易建模,尽管有些鸢尾花经常被错误分类。这里使用的模型是一个三层密集神经网络。运行上面显示的Iris分类器产生了相当好的拟合:准确性、精确度、召回率和F1分数都在98%左右。请注意,在混淆矩阵中,只有一个测试用例被错误分类。线性分类器演示可在几秒钟内运行并为训练和测试数据集生成概率图。数据是专门为线性可分为两类而生成的。MNIST手写数字数据集上的多层感知器(MLP)分类模型在约14K次迭代后产生约97%的准确度、精确度、召回率和F1分数。这不如卷积神经网络(如LeNet)在此数据集上的结果好或快。Deeplearning4j性能基准测试Java程序可能很棘手。特别是,您需要在计时之前预热您的代码以消除JIT编译器的开销,并且您需要确保JVM为被基准测试的程序配置了足够的RAM。Deeplearning4j社区为各种流行的模型和配置维护了一个基准代码存储库。根据开发人员的说法,Deeplearning4j在使用多个GPU的重要图像识别任务中的速度与Caffe一样快。要使用多台机器,您可以使用Spark通过Deeplearning4j运行Java应用程序的深度学习总的来说,Deeplearning4j是一个很有价值的库,用于加载和调节数据以及在JavaVM上执行深度学习。虽然还不如TensorFlow或PyTorch成熟,但Deeplearning4j将吸引希望将深度学习模型集成到基于Java的应用程序中的数据科学家。Deeplearning4j能够导入Keras模型,这应该可以简化那些想要从TensorFlow切换的人的过渡。Deeplearning4j支持创建图然后运行,就像TensorFlow1一样。它不支持TensorFlow2和PyTorch等即时模式训练。这对生产来说并不重要,但它可能会降低使用Deeplearning4j进行研究的吸引力。Deeplearning4j目前有两种分布式训练机制,参数平均和梯度共享。后者更可取,但它只是在1.0.0-beta3版本中才被添加到库中。Deeplearning4j还与Spark集成,有助于支持对一组机器的训练。在具有多个GPU的单个服务器上进行训练时,使用Spark并没有真正帮助。