使用 Eclipse Deeplearning4j 构建简单的神经网络

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(185)   2024-04-20 06:21:25

神经网络简介

深度学习包括深度神经网络和深度强化学习,它们是机器学习的子集,而机器学习本身是人工智能的子集。从广义上讲,深度神经网络执行机器感知,从原始数据中提取重要特征并对每个观察结果做出某种预测。示例包括识别图像中表示的对象、将模拟语音映射到书面转录、按情感对文本进行分类以及对时间序列数据进行预测。

尽管神经网络是上个世纪发明的,但直到最近才引起了更多的轰动。既然存在利用神经网络思想的计算能力,它们已被用于在计算机视觉、自然语言处理和强化学习等领域设定新的、最先进的结果。深度学习的一项众所周知的成就是由 DeepMind 的科学家实现的,他们创建了一个名为 AlphaGo 的计算机程序,该程序分别在 2016 年和 2017 年击败了前世界围棋冠军和现任围棋冠军。许多专家预测,这一成就要再过十年才会到来。

神经网络有很多种,但它们工作原理的基本概念很简单。它们大致以人脑为基础,由一层或多层“神经元”组成,这些神经元只是传递上一层信号的数学运算。在每一层,计算都应用于前一层神经元的输入,然后将输出中继到下一层。网络最后一层的输出将代表对输入数据的一些预测,具体取决于任务。构建成功的神经网络的挑战在于找到适用于每一层的正确计算。

神经网络可以处理高维数值和分类数据,并执行回归、分类、聚类和特征提取等任务。通过首先根据数据和任务配置其架构,然后调整其超参数以优化神经网络的性能来创建神经网络。一旦神经网络经过充分训练和调整,它就可以用于处理新数据集并返回合理可靠的预测。

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 维数组,一个张量库:“Eclipse January with C code and wider scope”。目标是为各种硬件平台提供张量运算和优化支持
  • DataVec:一个 ETL 库,可对数据进行矢量化和“张量化”。提取转换负载,支持连接各种数据源并通过一系列数据转换输出n维数组
  • libnd4j:用于张量操作的纯 C++ 库,它与开源库 JavaCPP 密切合作(JavaCPP 由 Skymind 工程师创建和维护,但它不是该项目的一部分) .
  • RL4J:JVM 上的强化学习,与 Deeplearning4j 集成。包括 AlphaGo 和 A3C 中使用的 Deep-Q 学习。
  • Jumpy:与 Numpy 集成的 ND4J 库的 Python 接口
  • Arbiter:通过超参数搜索自动调整神经网络。使用网格搜索、随机搜索和贝叶斯方法进行超参数优化。
  • 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和两个DataSetIteratorsRecordReaders 会将数据解析为记录格式,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 创建 DataSetsEvaluation 类将使用正确的标签和预测。最后,我们可以打印出结果。

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 编程指南
标签2: Java教程
地址:https://www.cundage.com/article/jcg-building-simple-neural-network-eclipse-deeplearning4j.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...