[Deeplearning4j应用教程04]_基于DL4J的神经网络实现

article/2025/4/30 4:36:35

DL4J+Scala的神经网络实现

  • 一、内容简介
  • 二、准备工程与环境
  • 三、准备工作空间
  • 四、准备要加载的数据
  • 五、神经网络的搭建
  • 六、训练神经网络模型
  • 七、评估模型

一、内容简介

Deeplearning4j(也称为“ DL4J”)是一种高性能的特定领域语言,用于配置由多层构成的深度神经网络。 Deeplearning4j是开源的,使用C ++,Java,Scala和Python编写,并由Eclipse Foundation和社区贡献者维护。
通过本次内容的学习,我们将会掌握使用DL4J:
1、加载神经网络的数据集。
2、格式化EMNIST以进行图像识别。
3、创建一个深度神经网络。
4、训练模型。
5、评估模型的性能。

二、准备工程与环境

在本次教程当中,默认Maven已经安装好(若没有安装,可参考前面的环境搭建教程)。下面,开始配置Scala。
1、首先,我们需要在IDEA的插件上找到Scala。步骤为:File -> Settings(如果使用的是Mac版的IDEA,则是:IntelliJ IDEA -> Preferences)
在这里插入图片描述
2、在Plugins中搜索Scala。然后,点击Install进行安装。注意:安装完成后需要重启IDEA。
在这里插入图片描述
重启
在这里插入图片描述
3、新建带DL4J的Maven项目(若不熟悉如何创建,可参见此次:link),可参考的项目结构如下:
在这里插入图片描述
4、(可选)在项目下,新建文件夹“scala”(当然,也可以叫其他名字)用于放Scala文件。
在这里插入图片描述
5、(可选)修改工程结构,将scala文件夹变为源文件。步骤为:File -> Project Structure -> Modules,然后选中scala,选择Sources。最后点击OK完成修改。如下列图所示:
在这里插入图片描述
在这里插入图片描述
6、此时,我们还并不能直接创建“Scala Class”文件。因为,还需要导入Scala SDK。步骤为:File -> Project Structure -> Libraries,点击上方的“+”号进行添加。
在这里插入图片描述
选择相应的版本,进行添加,本教程中使用的是Scala2.11.8。
在这里插入图片描述

7、最后,我们就可以新建Scala Class文件了。接下来我们就可以正式去实行DL4J中的神经网络了。
在这里插入图片描述

三、准备工作空间

像大多数编程语言一样,我们需要将要使用的类显式地导入到作用域中。 在下面,我们将导入常见的Deeplearning4j类,这将帮助我们配置和训练神经网络。 下面的代码是用Scala编写的。
请注意,我们从Scala的JavaConversions类导入方法,因为这将使我们能够使用本机Scala集合,同时保持与Deeplearning4j的Java集合的兼容性。

import scala.collection.JavaConversions._import org.deeplearning4j.datasets.iterator._
import org.deeplearning4j.datasets.iterator.impl._
import org.deeplearning4j.nn.api._
import org.deeplearning4j.nn.multilayer._
import org.deeplearning4j.nn.graph._
import org.deeplearning4j.nn.conf._
import org.deeplearning4j.nn.conf.inputs._
import org.deeplearning4j.nn.conf.layers._
import org.deeplearning4j.nn.weights._
import org.deeplearning4j.optimize.listeners._
import org.deeplearning4j.datasets.datavec.RecordReaderMultiDataSetIterator
import org.nd4j.evaluation.classification._import org.nd4j.linalg.learning.config._ // 可设置不同的更新器,比如Adam, Nesterovs等
import org.nd4j.linalg.activations.Activation // 定义不同的激活函数,比如RELU, SOFTMAX等
import org.nd4j.linalg.lossfunctions.LossFunctions // 均方误差, 多分类交叉熵损失等

四、准备要加载的数据

数据集迭代器是重要的代码段,可帮助在整个数据集中进行批处理和迭代,以进行神经网络的训练和推断。 Deeplearning4j带有EMNIST的BaseDatasetIterator的内置实现,称为EmnistDataSetIterator。 该特定的迭代器是一种便利实用程序,可以处理数据的下载和准备。
请注意,我们在下面创建了两个不同的迭代器,一个用于训练数据,另一个用于在训练后评估模型的准确性。 构造函数中的最后一个布尔参数指示我们是否要实例化测试/训练。
在本教程中,我们并不需要它,如果想要了解有关为神经网络加载数据的更多信息,我们可以在DL4J基础中找到。 DL4J带有许多记录读取器,它们可以从CSV,图像,视频,音频和序列中加载数据并将其转换为ND阵列。

具体代码如下:

import org.deeplearning4j.datasets.iterator.impl.EmnistDataSetIteratorobject dl4j_minist {def main(args:Array[String]) {
val batchSize = 128 // 确定网络中要同时训练多少个样本
val emnistSet = EmnistDataSetIterator.Set.BALANCED //准备数据集
val emnistTrain = new EmnistDataSetIterator(emnistSet, batchSize, true) //训练数据
val emnistTest = new EmnistDataSetIterator(emnistSet, batchSize, false) //测试数据}
}

五、神经网络的搭建

对于我们在Deeplearning4j中构建的任何神经网络,基础都是源于NeuralNetConfiguration类。 我们在这里配置超参数,定义网络体系结构的数量以及算法的学习方式。直观地讲,每个超参数就像做好一顿饭中的一种影响因素,比如:火候、时间等,影响着一顿饭是否能够做好。但幸运的是,如果超参数不能产生正确的结果,则可以对其进行调整。
list()方法指定网络中的层数; 此功能将我们的配置复制n次并构建分层配置。
我们都知道,什么网络整体上分为:输入层、输出层以及隐藏层。而其中,隐藏层是最为关键的地方。那么隐藏层到底是什么呢?首先,我们来看下基本的神经结构图:
在这里插入图片描述
隐藏层中的每个节点(圆圈)代表MNIST数据集中的手写数字特征。例如,假设我们输入的为手写数字6,那么一个节点可能代表圆形边缘特征,另一个节点可能代表卷曲线的交点特征,依此类推。 这些功能由模型系数按重要性进行加权,并在每个隐藏层中重新组合以帮助预测手写数字是否确实为6。节点的层数越多,它们可以捕获的复杂性和细微差别就越多,可以做出更好的预测。
我们可以将此层视为“隐藏”的层,因为尽管我们可以看到输入进入了网络,并且做出了决策,但人类很难理解神经网络如何在内部处理数据以及为什么在内部进行处理。 神经网络模型的参数只是机器可以读取的数字的长向量。了解完隐藏层后,我们就可以正式进行网络的搭建了。代码如下:

val outputNum = EmnistDataSetIterator.numLabels(emnistSet) // 总的输出类别
val rngSeed = 123 // 随机数种子,用于再现随机数
val numRows = 28 // 手写数字图片中每行的像素数量
val numColumns = 28 //手写数字图片中每列的像素数量//神经网络搭建
val conf = new NeuralNetConfiguration.Builder().seed(rngSeed).updater(new Adam()) //优化器使用Adam.l2(1e-4) // L2正则.list() //指定网络层数.layer(new DenseLayer.Builder().nIn(numRows * numColumns) // 输入数据点数。.nOut(1000) //输出数据点数。.activation(Activation.RELU) // 激活函数.weightInit(WeightInit.XAVIER) // 权重初始化方法,使用Xavier.build()).layer(new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) //损失函数,使用负对数似然.nIn(1000) //输入数据点数.nOut(outputNum) //输出对应数据中类别数量.activation(Activation.SOFTMAX) //激活函数,使用softMax.weightInit(WeightInit.XAVIER) //权重初始化方法,使用Xavier.build()).build()

训练过程截图如下:
在这里插入图片描述

六、训练神经网络模型

现在,我们已经建立了NeuralNetConfiguration,那么,就可以使用该配置实例化MultiLayerNetwork了。当我们在网络上调用init()方法时,它将在网络上应用选定的权重初始化,并允许我们传递数据进行训练。 如果我们想在训练过程中看到损失分数,我们还可以将监听器传递给网络。
实例化的模型具有fit()方法。该方法接受数据集迭代器(扩展BaseDatasetIterator的迭代器),单个DataSet或ND-Array(INDArray的实现)。 由于我们的EMNIST迭代器已经扩展了迭代器基类,因此,我们可以直接通过它进行fit。 如果要进行多次迭代训练,可以将总的迭代次数放入fit()方法的第二个参数中。本次教程当中,我们采用第三种方式,进行100次迭代(如果只是为了练习或者学习,建议迭代次数为10左右,不然需要很长时间才能训练完)。

代码如下:

// 创建神经网络
val network = new MultiLayerNetwork(conf)
network.init()// 调用训练监听器,该监听器每10次迭代报告一次得分
val eachIterations = 10
network.addListeners(new ScoreIterationListener(eachIterations))// fit 数据并进行一次迭代
// network.fit(emnistTrain)// 多次迭代
// val numEpochs = 2
// network.fit(emnistTrain, numEpochs)// 使用循环,灵活控制迭代次数
for(i <- 1 to 100) {println("Epoch " + i + " / " + 100)network.fit(emnistTrain)
}

执行训练的过程,如下图所示:
在这里插入图片描述

七、评估模型

Deeplearning4j提供了多种工具来评估模型的性能。我们可以执行基本评估并获得诸如精度和准确性之类的指标,也可以使用ROC(Receiver Operating Characteristic)。 请注意,一般的ROC类适用于二分类,而ROCMultiClass则适用于多分类,例如我们在此构建的模型。
MultiLayerNetwork方便地内置了一些方法来帮助我们执行评估。我们可以将带有测试/验证数据的数据集迭代器传递给validate()方法。
代码如下:

// 评估模型的基本性能
val eval = network.evaluate[Evaluation](emnistTest)
println(eval.accuracy())
println(eval.precision())
println(eval.recall())// 评估 ROC 以及计算AUC
val roc = network.evaluateROCMultiClass[ROCMultiClass](emnistTest, 0)
roc.calculateAUC(classIndex)// (可选)我们可以打印评估中的所有统计信息
print(eval.stats())
print(roc.stats())

OK,到这里,我们基本上已经学习了如何使用Deeplearning4j进行最基本多神经网络搭建方法了。接下来,我们就可以迎接更高的挑战了,比如人脸识别、目标检测、文本分类、构建数据集迭代器等等,是不是已经迫不及待了呢!

最终结果如下图所示:

最后附上完整代码:

import scala.collection.JavaConversions._import org.deeplearning4j.datasets.iterator._
import org.deeplearning4j.datasets.iterator.impl._
import org.deeplearning4j.nn.api._
import org.deeplearning4j.nn.multilayer._
import org.deeplearning4j.nn.graph._
import org.deeplearning4j.nn.conf._
import org.deeplearning4j.nn.conf.inputs._
import org.deeplearning4j.nn.conf.layers._
import org.deeplearning4j.nn.weights._
import org.deeplearning4j.optimize.listeners._
import org.deeplearning4j.datasets.datavec.RecordReaderMultiDataSetIterator
import org.nd4j.evaluation.classification._import org.nd4j.linalg.learning.config._ // // 设置不同的更新器,比如Adam, Nesterovs等
import org.nd4j.linalg.activations.Activation // 定义不同的激活函数,比如RELU, SOFTMAX等
import org.nd4j.linalg.lossfunctions.LossFunctions // 均方误差, 多分类交叉熵损失等object dl4j_minist{def main(args:Array[String]){val batchSize = 128 // 确定网络中要同时训练多少个样本val emnistSet = EmnistDataSetIterator.Set.BALANCED //准备数据集val emnistTrain = new EmnistDataSetIterator(emnistSet, batchSize, true) //训练数据val emnistTest = new EmnistDataSetIterator(emnistSet, batchSize, false) //测试数据val outputNum: Int = EmnistDataSetIterator.numLabels(emnistSet) // 总的输出类别val rngSeed = 123 // 随机数种子,用于再现随机数val numRows = 28 // 手写数字图片中每行的像素数量val numColumns = 28 //手写数字图片中每列的像素数量val conf: MultiLayerConfiguration = new NeuralNetConfiguration.Builder().seed(rngSeed).updater(new Adam(0.001)) //优化器使用Adam,学习率为0.001.l2(1e-4) // L2正则.list() //指定网络层数.layer(new DenseLayer.Builder().nIn(numRows * numColumns) // 输入数据点数。.nOut(1000) // 输出数据点数。.activation(Activation.RELU) // 激活函数.weightInit(WeightInit.XAVIER) // 权重初始化方法,使用Xavier.build()).layer(new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) //损失函数,使用负对数似然.nIn(1000) // 输入数据点数.nOut(outputNum) // 输出对应数据中类别数量.activation(Activation.SOFTMAX) // 激活函数,使用softMax.weightInit(WeightInit.XAVIER) // 权重初始化方法,使用Xavier.build()).build()// 创建神经网络val network = new MultiLayerNetwork(conf)network.init()// 调用训练监听器,该监听器每10次迭代报告一次得分val eachIterations = 10network.addListeners(new ScoreIterationListener(eachIterations))// fit 数据并进行一次迭代// network.fit(emnistTrain)// 多次迭代// val numEpochs = 2// network.fit(emnistTrain, numEpochs)// 使用循环,灵活控制迭代次数for(i <- 1 to 100) {println("Epoch " + i + " / " + 100)network.fit(emnistTrain)}// 评估模型的基本性能val eval = network.evaluate[Evaluation](emnistTest)println(eval.accuracy())println(eval.precision())println(eval.recall())// 评估 ROC 以及计算AUCval roc = network.evaluateROCMultiClass[ROCMultiClass](emnistTest, 0)roc.calculateAUC(0)//(可选)我们可以打印评估的所有统计信息print(eval.stats())print(roc.stats())}
}

http://chatgpt.dhexx.cn/article/yT5IAoTJ.shtml

相关文章

从TensorFlow到DL4J——主流深度学习框架对比分析

从TensorFlow到DL4J——主流深度学习框架对比分析 2022年2月22日 极链AI云 官网地址 点击注册 更多AI小知识&#xff0c;关注《极链AI云》公众号 文章目录 从TensorFlow到DL4J——主流深度学习框架对比分析一、深度学习框架概述与深度学习技术的四大阵营二、主流开源深度学习框…

DL4J中文文档/ND4J/概述

本用户指南旨在解释&#xff08;并提供示例&#xff09;ND4J中的主要功能。 简介 NDArrays:它们在内存中是如何存储的&#xff1f;视图&#xff1a;当两个或更多NDArrays引用相同的数据创建NDArrays 0,1和标量值初始化数组随机数组从Java数组创建NDArrays从其它NDArrays创建ND…

DL4J实战之五:矩阵操作基本功

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 作为《DL4J实战》系列的第五篇&#xff0c;在前面对深度学习有一定的了解后&#xff0c;本篇会暂停深度学习相关的操作&#xff0c;转为基本功练习&…

DL4J实战之六:图形化展示训练过程

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本篇是《DL4J实战》系列的第六篇&#xff0c;咱们继续夯实基本功&#xff0c;这次学习的是如何更加形象完整的展示训练过程&#xff1a;图形化页面&…

使用tensorflow搭建深层神经网络

6在吴恩达老师的《深度学习》第二课第三周的课程中&#xff0c;提及到了多种深度学习框架&#xff0c;包括caffe/caffe2&#xff0c;CNTK&#xff0c;DL4J&#xff0c;Keras&#xff0c;Lasagne&#xff0c;mxnet&#xff0c;paddlepadle&#xff0c;tensorflow&#xff0c;The…

[Deeplearning4j应用教程02]_DL4J环境搭建教程-Windows版

Windows下DL4J环境搭建教程 一、DL4J简介二、Windows下DL4J环境搭建三、安装JDK1.1、JDK简介1.2、JDK下载安装1.3、安装JDK1.3.1、环境变量配置 四、安装Intellij idea五、Maven Apache安装六、在IDEA中配置Maven七、安装Git八、获取DL4J示例代码九、在IDEA中导入项目并运行 一…

DL4J源码分析

目录 源码目录&#xff08;部分&#xff09; NDArray 工作间 DL4J的层工作间管理器 沿维张量&#xff08;TAD&#xff09; 反向减法 源码目录&#xff08;部分&#xff09; DeepLearning4J: 包含用于既在单个机器上&#xff0c;又在分布式上学习神经网络的所有代码。 N…

DL4J实战之四:经典卷积实例(GPU版本)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 作为《DL4J实战》的第四篇&#xff0c;今天咱们不写代码&#xff0c;而是为今后的实战做些准备&#xff1a;在DL4J框架下用GPU加速深度学习的训练过…

DL4J实战之三:经典卷积实例(LeNet-5)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 作为《DL4J》实战的第三篇&#xff0c;目标是在DL4J框架下创建经典的LeNet-5卷积神经网络模型&#xff0c;对MNIST数据集进行训练和测试&#xff0…

DL4J实战之二:鸢尾花分类

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《DL4J》实战的第二篇&#xff0c;前面做好了准备工作&#xff0c;接下来进入正式实战&#xff0c;本篇内容是经典的入门例子&#xff1a;鸢…

DL4J实战之一:准备

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于DL4J DL4J是Deeplearning4j的简称&#xff0c;是基于Java虚拟机的深度学习框架&#xff0c;是用java和scala开发的&#xff0c;已开源&#xff0c;官网&…

【DL4J】基本操作_学习笔记(二)

DL4J基本操作 文章目录 DL4J基本操作1. 创建矩阵2. 矩阵元素读取3. 矩阵行元素读取4. 矩阵运算 导入依赖 <nd4j.version>1.0.0-beta2</nd4j.version><dependency><groupId>org.nd4j</groupId><artifactId>nd4j-native-platform</artifa…

【DL4J速成】Deeplearning4j图像分类从模型自定义到测试

文章首发于微信公众号《有三AI》 【DL4J速成】Deeplearning4j图像分类从模型自定义到测试 欢迎来到专栏《2小时玩转开源框架系列》&#xff0c;这是我们第九篇&#xff0c;前面已经说过了caffe&#xff0c;tensorflow&#xff0c;pytorch&#xff0c;mxnet&#xff0c;keras&…

深度学习框架DeepLearning4J(DL4J)的安装及配置

一、DeepLearning4J的简介和系统要求 1、DeepLearning4J简介 Deeplearning4J&#xff08;以下简称DL4J&#xff09;不是第一个开源的深度学习项目&#xff0c;但与此前的其他项目相比&#xff0c;DL4J在编程语言和宗旨两方面都独具特色。DL4J是基于JVM、聚焦行业应用且提供商…

适合中学生看的英文电影

怎样利用好丰富的资源来学习英语口语呢&#xff1f;其实其实看什么样的剧、如何看剧都是很讲究的。一起来解锁吧。 一、选剧要学会拆解自己学习目标&#xff0c;选定合适的类型&#xff0c;各取所需。 并不是所有类型的国外影视剧都适合作为学习的素材&#xff0c;主要依据自身…

springboot+mybatis实现简单的增、删、查、改

这篇文章主要针对java初学者&#xff0c;详细介绍怎么创建一个基本的springboot项目来对数据库进行crud操作。 目录 第一步&#xff1a;准备数据库 第二步&#xff1a;创建springboot项目 方法1&#xff1a;通过spring官网的spring initilizer创建springboot项目 方法2&am…

tk-mybatis使用介绍,springboot整合tk-mybatis、PageHelper实现分页查询

Mybatis-Plus极大简化了我们的开发&#xff0c;作为mybatis的增强版&#xff0c;Mybatis-Plus确实帮我们减少了很多SQL语句的编写&#xff0c;通过其提高的API&#xff0c;可以方便快捷第完成增删查改操作。但是&#xff0c;其实除了Mybatis-Plus以外&#xff0c;还有一个技术t…

SXSW 2022线下展回归,今年有哪些有趣的AR/VR内容?

如今海外的线下活动开始逐渐恢复&#xff0c;今年的SXSW活动也回归线下。与往年相比&#xff0c;这场艺术、音乐、电影的年度盛会在今年进一步融合新兴科技&#xff0c;比如将AR/VR与线下活动结合&#xff0c;带来了更多样化的娱乐应用场景。 那么今年活动上都有哪些看点&#…

UE4 Ultra Dynamic Sky 参数翻译及功能概述

Ultra Dynamic Sky的虚幻商城链接: Ultra Dynamic Sky Ultra_Dynamic_Sky翻译及功能概述 basic controls 基础控制 Refresh Settings 刷新设置 检查此布尔一次&#xff0c;以刷新所有设置&#xff1b; Time Of Day 一天中的时间 一天中天空模仿的时间&#xff0c;从0000到…

更新《鸿门宴传奇》黎明/冯绍峰/张涵予/刘亦菲1024x436 高清下载!1.25G 附加720P种子...

高清下载!1.25G 附加720P种子" title="更新《鸿门宴传奇》黎明/冯绍峰/张涵予/刘亦菲1024x436 高清下载!1.25G 附加720P种子"> 高清下载!1.25G 附加720P种子" title="更新《鸿门宴传奇》黎明/冯绍峰/张涵予/刘亦菲1024x436 高清下载!1.25G 附加…