深度学习包括深度神经网络和深度强化学习,它们是机器学习的子集,而机器学习本身是人工智能的子集。从广义上讲,深度神经网络执行机器感知,从原始数据中提取重要特征并对每个观察结果做出某种预测。示例包括识别图像中表示的对象、将模拟语音映射到书面转录、按情感对文本进行分类以及对时间序列数据进行预测。
尽管神经网络是上个世纪发明的,但直到最近才引起了更多的轰动。既然存在利用神经网络思想的计算能力,它们已被用于在计算机视觉、自然语言处理和强化学习等领域设定新的、最先进的结果。深度学习的一项众所周知的成就是由 DeepMind 的科学家实现的,他们创建了一个名为 AlphaGo 的计算机程序,该程序分别在 2016 年和 2017 年击败了前世界围棋冠军和现任围棋冠军。许多专家预测,这一成就要再过十年才会到来。
神经网络有很多种,但它们工作原理的基本概念很简单。它们大致以人脑为基础,由一层或多层“神经元”组成,这些神经元只是传递上一层信号的数学运算。在每一层,计算都应用于前一层神经元的输入,然后将输出中继到下一层。网络最后一层的输出将代表对输入数据的一些预测,具体取决于任务。构建成功的神经网络的挑战在于找到适用于每一层的正确计算。
神经网络可以处理高维数值和分类数据,并执行回归、分类、聚类和特征提取等任务。通过首先根据数据和任务配置其架构,然后调整其超参数以优化神经网络的性能来创建神经网络。一旦神经网络经过充分训练和调整,它就可以用于处理新数据集并返回合理可靠的预测。
Eclipse Deeplearning4j (DL4J) 是一个基于 JVM 的开源工具包,用于构建、训练和部署神经网络。它是为 Java 和 Scala 社区服务而构建的,用户友好、稳定,并且与 Spark、CUDA 和 cuDNN 等技术很好地集成。 Deeplearning4j 还与 Keras 和 TensorFlow 等 Python 工具集成,以将其模型部署到 JVM 上的生产环境中。它还附带了一组开源库,Skymind 将这些库捆绑在一个名为 Skymind Intelligence Layer (SKIL) 的企业发行版中。这些库是:
以下是使用 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();
有一个包含 20 个节点的隐藏层和一个包含两个节点的输出层,使用 softmax 激活函数和负对数似然损失函数。我们还设置了神经网络的权重如何初始化以及神经网络如何优化权重。为了使结果可重现,我们还设置了它的种子;也就是说,我们使用随机初始化的权重,但我们保存它们的随机初始化,以防我们以后需要从同一点开始训练,以确认我们的结果。
要实际创建模型,使用先前设置的配置初始化 MultiLayerNetwork
。然后我们可以使用训练循环来拟合数据;或者,如果使用 MultipleEpochsIterator
,则只需调用 fit 函数一次即可使用设定的 epoch 数量训练数据。
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
创建简单的前馈神经网络的基础知识。
标签2: Java教程地址:https://www.cundage.com/article/jcg-building-simple-neural-network-eclipse-deeplearning4j.html