神经网络导论
深度学习既包含深度神经网络又包含深度强化学习,这是机器学习的子集,而机器学习本身就是人工智能的子集。 广义上讲,深度神经网络执行机器感知,该机器感知从原始数据中提取重要特征,并对每个观察结果做出某种预测。 示例包括识别图像中表示的对象,将模拟语音映射到书面转录,按情感对文本进行分类以及对时间序列数据进行预测。
尽管神经网络是上世纪发明的,但直到最近才引起人们更多的兴奋。 现在已经有了利用神经网络概念的计算能力,它们已被用于在计算机视觉,自然语言处理和强化学习等领域设置新的最新技术成果。 DeepMind的科学家实现了一项众所周知的深度学习成就,他创造了一个名为AlphaGo的计算机程序,该程序在2016年和2017年分别击败了前世界冠军Go选手和现任冠军。 许多专家预测,这一成就将再持续十年。
神经网络有许多种,但是它们如何工作的基本概念很简单。 它们大致基于人脑,由一层或多层“神经元”组成,它们只是传递来自上一层信号的数学运算。 在每一层,对来自上一层神经元的输入进行计算,然后将输出中继到下一层。 网络最后一层的输出将根据任务表示对输入数据的一些预测。 建立成功的神经网络所面临的挑战是找到适用于每一层的正确计算。
神经网络可以处理高维数值和分类数据,并执行诸如回归,分类,聚类和特征提取之类的任务。 通过首先基于数据和任务配置其体系结构,然后调整其超参数以优化神经网络的性能来创建神经网络。 一旦对神经网络进行了充分的训练和调整,就可以将其用于处理新的数据集并返回合理可靠的预测。
Eclipse DeepLearning4j适用的地方
Eclipse Deeplearning4j (DL4J)是一个基于JVM的开源工具包,用于构建,训练和部署神经网络。 它旨在为Java和Scala社区提供服务,并且用户友好,稳定并且与Spark,CUDA和cuDNN等技术很好地集成在一起。 Deeplearning4j还与Keras和TensorFlow等Python工具集成,以将其模型部署到JVM上的生产环境。 它还附带了一组开源库,Skymind将这些开源库捆绑在称为Skymind Intelligence Layer(SKIL)的企业发行版中。 这些库是:
- Deeplearning4j :神经网络DSL(有助于构建与数据管道和Spark集成的神经网络)
- ND4J :用于Java的N维数组,一个张量库:“具有C代码和更广泛范围的Eclipse January”。 目标是为各种硬件平台提供张量操作和优化的支持
- DataVec :ETL库,可矢量化和“张紧”数据。 提取转换负载,并支持通过一系列数据转换连接到各种数据源并输出n维数组
- libnd4j :用于张量操作的纯C ++库,该库与开源库JavaCPP紧密协作(JavaCPP是由Skymind工程师创建并维护的,但它不属于该项目)。
- RL4J :与Deeplearning4j集成的JVM上的强化学习。 包括在AlphaGo和A3C中使用的Deep-Q学习。
- Jumpy :与Numpy集成的ND4J库的Python接口
- 仲裁器 :通过超参数搜索自动调整神经网络。 使用网格搜索,随机搜索和贝叶斯方法进行超参数优化。
- ScalNet :Deeplearning4j的Scala API,在外观上类似于Torch或Keras。
- ND4S :基于ND4J的Scala N维数组。
这是使用DeepLearning4j的一些原因。
您是该领域的数据科学家,或者是Java,Scala或Python项目的学生,并且需要与JVM堆栈(Hadoop,Spark,Kafka,ElasticSearch,Cassandra)集成。 例如,您希望通过多GPU在Spark上扩展神经网络训练。 您需要探索数据,进行和监视将各种算法应用于数据的实验,并在集群上进行训练以快速获取该数据的准确模型。
您是企业环境中的数据工程师或软件开发人员,需要稳定,可重用的数据管道以及对数据的可伸缩且准确的预测。 这里的用例是使用简单易懂的API以编程方式自动处理和分析数据,以确定指定结果。
示例:建立前馈网络
前馈网络是神经网络的最简单形式,也是最早创建的网络之一。 在这里,我们将基于使用月亮数据的示例概述前馈神经网络的示例。 数据位于此处 。
原始数据由具有两个数字功能和两个标签的CSV文件组成。 训练集和测试集位于不同的CSV文件中,训练集中有2000个观察值,测试集中有1000个观察值。 该任务的目的是在给定两个输入特征的情况下预测标签。 因此,我们对分类感兴趣。
我们首先初始化构建前馈神经网络所需的变量。 我们设置了神经网络的超参数,例如学习率和批量大小,以及与它的体系结构相关的变量,例如隐藏节点的数量。
int seed = 123;
double learningRate = 0.005;
int batchSize = 50;
int nEpochs = 100;int numInputs = 2;
int numOutputs = 2;
int numHiddenNodes = 20;final String filenameTrain = new ClassPathResource("/classification/moon_data_train.csv").getFile().getPath();
final String filenameTest = new ClassPathResource("/classification/moon_data_eval.csv").getFile().getPath();
因为数据位于两个CSV文件中,所以我们总共初始化了两个CSVRecordReaders
和两个DataSetIterators
。 RecordReaders
会将数据解析为记录格式,而DataSetIterator
会将数据以其可以读取的格式馈入神经网络。
RecordReader rr = new CSVRecordReader();
rr.initialize(new FileSplit(new File(filenameTrain)));
DataSetIterator trainIter = new RecordReaderDataSetIterator(rr,batchSize,0,2);RecordReader rrTest = new CSVRecordReader();
rrTest.initialize(new FileSplit(new File(filenameTest)));
DataSetIterator testIter = new RecordReaderDataSetIterator(rrTest,batchSize,0,2);
建立前馈网络
现在已经准备好数据,我们可以使用MultiLayerConfiguration
设置神经网络的配置。
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder().seed(seed).iterations(1).optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).learningRate(learningRate).updater(Updater.NESTEROVS).list().layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(numHiddenNodes).weightInit(WeightInit.XAVIER).activation(Activation.RELU).build()).layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD).weightInit(WeightInit.XAVIER).activation(Activation.SOFTMAX).nIn(numHiddenNodes).nOut(numOutputs).build()).pretrain(false).backprop(true).build();
使用softmax激活函数和负对数似然损失函数,有一个包含20个节点的隐藏层和一个具有两个节点的输出层。 我们还设置了如何初始化神经网络的权重以及神经网络将如何优化权重。 为了使结果可重复,我们还设置了种子。 也就是说,我们使用随机初始化的权重,但是如果需要稍后从同一点开始训练以确认结果,则可以保存它们的随机初始化。
训练和评估前馈神经网络
为了实际创建模型,使用先前设置的配置初始化MultiLayerNetwork
。 然后,我们可以使用训练循环拟合数据; 或者,如果使用MultipleEpochsIterator
,则只需要调用一次fit函数即可训练具有设定时期数的数据。
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(new ScoreIterationListener(100)); for ( int n = 0; n < nEpochs; n++) {model.fit( trainIter );
}
数据完成训练后,我们将使用测试集评估模型。 请注意, testIter
根据先前设置的批次大小50创建DataSets
。 Evaluation
类将使用正确的标签和预测来计算准确性。 最后,我们可以打印出结果。
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());
该示例涵盖了使用MultiLayerNetwork
创建简单的前馈神经网络的基础。
- 要了解更多信息,请参阅我们的O'Reilly书: 深度学习:从业者的方法
- 并查看Deeplearning4j编程指南
翻译自: https://www.javacodegeeks.com/2017/11/building-simple-neural-network-eclipse-deeplearning4j.html