Deeplearning4j(DL4J)是专门为JVM编写的一个开源深度学习框架,主要用于商业级需求。该框架完全使用Java编写,因此名称中包含了4j”。因为是使用流行的Java语言编写的,所以Deeplearning4j开始受到更多的人和从业者的欢迎。
该框架基本上是由Hadoop和Spark集成的分布式深度学习库组成的。在Hadoop和Spark的帮助下,我们可以轻松地分发模型和大数据集,并运行多个GPU和CPU来执行操作。Deep learning4j主要在图像、声音、文本、时间序列数据等的模型识别中取得了巨大成功。除此之外,它还可以用于各种客户用例,如面部识别、欺诈检测、业务分析、推荐引擎、图像和语音搜索,以及传感器数据的预测维护。下图显示了Deeplearning4j的通用高级框架图。
Deeplearning4j具有以下引人注目的功能,因而完全不同于现有的其他深度学习工具(如Theano、Torch等)
1.分布式架构。Deeplearning4j中的训练可以通过两种方式进行:一种是分布式的、多线程的深度学习,另一种是传统的、普通的单线程深度学习技术。训练是在商用节点的集群中进行的。因此,Deeplearning4j能够快速处理任意数量的数据。神经网络使用迭代Reduce方法进行并行训练,该方法适用于Hadoop YARN和Apache Spark。它还与Cuda内核集成,以进行纯GPU操作,并与分布式GPU配合使用。
Deeplearning4j操作可以在Hadoop YARN或Apache Spark中作为一项作业运行。在Hadoop中,迭代Reduce节点在HDFS的每个块上工作,同时并行处理数据。处理完成后,它们将变换后的参数推送到主节点,并在主节点获得参数的平均值,接着更新每个工作者的模型。
在Deeplearning4j中,分布式运行是可互换的,它们在一个庞大的模块化架构中充当目录角色,可以进行互换。
2.数据并行性。神经网络能够以两种方式进行分布式训练:一种是数据并行,另一种是模型并行。Deeplearning4j遵循数据并行训练。在数据并行时,可以将大型数据集拆分成较小的数据集,并将它们分布到在不同服务器上运行的并行模型上,可以将大型数据集拆分成较小的数据集,并将它们分布到在不同服务器上运行的并行模型上,以并行方式进行训练。
3.JVM的科学计算能力。对Java和Scala中的科学计算来说,Deeplearning4j包含了一个使用Java N维数组(N-Dimensional Arrays for Java,ND4J)的N维类。ND4J的功能比Numpy提供给Python的功能要快得多,而且主要是用C++编写的。在生产环境中,它基于一个矩阵操作和线性操作代数库。ND4J的大多数程序都被设计为以最低RAM需求来运行。
4.机器学习的矢量化工具。为了矢量话各种文件格式和数据类型,Canova已经与Deeplearning4j合并。Canova使用一个输入/输出系统执行矢量化,就像Hadoop使用Map-Reduce一样。Canova主要用于通过命令行界面(command line interface,CLI)来矢量化文本、CSV、图像、声音、视频等。
Deeplearning4j具有以下功能。
1.Deeplearning可谓是目前最完整的、可用于生产的开源深度学习库。
2.与基于Theano的工具相比,Deeplearning4j具有更多专门为深度网络设计的特性。
3.Deeplearning4j易于使用,即使非专业人士也可以应用其惯例来解决计算密集型问题。
4.这些工具具有广泛的适用性,因此网络对于图像、声音、文本、和时间序列同样适用。
5.Deeplearning是完全分布式的,而且可以并行运行多个GPU,这不同于非分布式的Theano,也不同于还没像DL4J一样执行自动化分配的Torch7。
Deeplearning4j主要作用于多层神经网络。想要使用Deeplearning4j,首先需要熟悉一些前提条件,以及如何安装所有相关软件。大部分文档都可以在Deeplearning4j的官方网站https://deeplearning4j.org/上找到。
本期将帮助你熟悉Deeplearning的代码。首先展示使用Deeplearning4j的多层神经网络的一个简单操作和实现。接着讨论Deeplearning4j库的分布式深度学习。deeplearning4j使用Apache Spark在多个分布式GPU上训练分布式深度神经网络。最后介绍如何为Deeplearning4j设置Apache Spark。
下面主要介绍使用了Deeplearning4j的“Hello World”程序。我们将借助两个简单的深度学习问题来解释Deeplearning4j库的基本功能。
在Deeplearning4j中,MultiLayerConfiguration是Deeplearning4j库的一个类,可以当作构建块的基础,负责组织神经网络的层和相应的超参数。可以认为这个类是神经网路的Deeplearning核心组件。我们将使用这个类来配置不同的多层神经网络。
超参数是确定神经网络学习过程的主要支柱,主要包括如何初始化模型的权值、应该更新多少次、模型的学习速率、使用的优化算法等。
第一个示例将展示如何使用Deeplearning4j对多层感知机分类器的数据模式进行分类。
以下是此程序中使用的训练数据集示例:
首先需要初始化网络的各种超参数。下面的代码将为程序设置ND4J环境:
Nd4j.ENFORCE_STABILITY = true;
int batchSize = 50;
int seed = 123;
double learningRate = 0.005;
将迭代次数设置为30:
int nEpochs = 30;
int numInputs = 2;
int numOutputs = 2;
int numHiddenNodes = 20;
下面的代码将训练数据加载到网络中:
RecordReader rr = new CSVRecordReader();
rr.inttialize (new FileSplit(new File(“saturn_data_train.csv”)));
DataSetIterator trainIter = new RecordReaderDataSetIterator
(rr,batchSize,0.2);
随着训练数据的加载,使用以下代码将测试数据加载到模型中:
RecordReader rrTest = new CSVRecordReader();
rrTest.initialize(new FileSplit(new File(“saturn_data_eval.csv”)));
DataSetIterator trainIter = new RecordReaderDataSetIterator
(rrTest,batchSize,0,2);
网络模型的所有层的组织结构以及超参数的设置都可以通过以下代码来完成:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed)
.iterations(l)
.opimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.learningRate(learningRate)
.updater(Updater.NESTEROVS).momentum(0.9)
.list()
.layer(0,new DenseLayer.Builder().nIn(numInputers).nOut(numHiddenNodes)
.weightInit(WeightInit.XAVIER)
.activation(“relu”)
.build())
.layer(1,new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD)
.weightInit(WrightInit.XAVIER)
.activation(“softmax”)
.nIn(numHiddenNodes).nOut(numOutputs).build())
.presrain(false)
.backprop(true)
.buile();
现在,训练集和测试集已经全部加载完成,可以调用init()方法来初始化模型。下面通过给定的输入对模型进行训练:
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
为了在一定时间间隔后检查输出,可以每更新5个参数就打印分数:
model.setListeners(new ScoreIterationListener(5));
for(int n = 0; n<nEpochs; n++)
最后,调用.fit()方法来训练网络:
{
model.fit(trainIter);
}
System.out.println(“Evaluating the model...”);
Evaluation eval = new Evaluation(numOutputs);
while(testIter.hasNext())
{
DataSet t = testIter.next();
INDArray features = t.getFeatureMatrix();
INDArray labels = t.getLabels();
INDArray predicted = model.output(features,false);
eval.eval(labels,predicted);
}
System.out.println(eval.stats));
至此,模型的训练就完成了。