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

深度学习框架DeepLearning4J(DL4J)的安装及配置 本文主要介绍了如何在IDEA中,通过使用Maven安装和配置深度学习框架DeepLearning4J,同时文中也详细介绍了Maven的安装和配置过程,希望给小伙伴一些帮助。 阅读详情

文章首发于微信公众号《有三AI》

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

欢迎来到专栏《2小时玩转开源框架系列》,这是我们第九篇,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,chainer。

今天说Deeplearning4j(DL4J),本文所用到的数据,代码请参考我们官方git

https://github.com/longpeng2008/LongPeng_ML_Course

作者&编辑 | 胡郡郡 言有三  

 

1 Deeplearning4j(DL4J)是什么

不同于深度学习广泛应用的语言Python,DL4J是为java和jvm编写的开源深度学习库,支持各种深度学习模型。

DL4J最重要的特点是支持分布式,可以在Spark和Hadoop上运行,支持分布式CPU和GPU运行。DL4J是为商业环境,而非研究所设计的,因此更加贴近某些生产环境。

 

2 DL4J训练准备

2.1 DL4J安装

系统要求:

  • Java:开发者版7或更新版本(仅支持64位版本)

  • Apache Maven:Maven是针对Java的项目管理工具,兼容IntelliJ等IDE,可以让我们轻松安装DL4J项目库

  • IntelliJ IDEA (建议)或 Eclipse

  • Git

官方提供了很多DL4J的示例。可以通过以下命令下载安装:

$ git clone https://github.com/deeplearning4j/dl4j-examples.git
$ cd dl4j-examples/
 $ mvn clean install

mvn clean install 目的是为了安装所依赖的相关包。

然后将下载的dl4j-examples导入到IntelliJ IDEA中,点击自己想要试的例子进行运行。

2.2 数据准备

DL4J有自己的特殊的数据结构DataVec,所有的输入数据在进入神经网络之前要先经过向量化。向量化后的结果就是一个行数不限的单列矩阵。

熟悉Hadoop/MapReduce的朋友肯定知道它的输入用InputFormat来确定具体的InputSplit和RecordReader。DataVec也有自己FileSplit和RecordReader,并且对于不同的数据类型(文本、CSV、音频、图像、视频等),有不同的RecordReader,下面是一个图像的例子。

int height = 48;  // 输入图像高度
int width = 48;   // 输入图像宽度
int channels = 3; // 输入图像通道数
int outputNum = 2; // 2分类
int batchSize = 64;
int nEpochs = 100;  
int seed = 1234;
Random randNumGen = new Random(seed);

// 训练数据的向量化
File trainData = new File(inputDataDir + "/train");
FileSplit trainSplit = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator(); // parent path as the image label
ImageRecordReader trainRR = new ImageRecordReader(height, width, channels, labelMaker);
trainRR.initialize(trainSplit);
DataSetIterator trainIter = new RecordReaderDataSetIterator(trainRR, batchSize, 1, outputNum);

// 将像素从0-255缩放到0-1 (用min-max的方式进行缩放)
DataNormalization scaler = new ImagePreProcessingScaler(0, 1);
scaler.fit(trainIter);
trainIter.setPreProcessor(scaler);

// 测试数据的向量化
File testData = new File(inputDataDir + "/test");
FileSplit testSplit = new FileSplit(testData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
ImageRecordReader testRR = new ImageRecordReader(height, width, channels, labelMaker);
testRR.initialize(testSplit);
DataSetIterator testIter = new RecordReaderDataSetIterator(testRR, batchSize, 1, outputNum);
testIter.setPreProcessor(scaler); // same normalization for better results

数据准备的过程分成以下几个步骤:

1)通过FileSplit处理输入文件,FileSplit决定了文件的分布式的分发和处理。

2)ParentPathLabelGenerator通过父目录来直接生成标签,这个生成标签的接口非常方便,比如说如果是二分类,我们先将两个父目录设定为0和1,然后再分别在里面放置对应的图像就行。

3)通过ImageRecordReader读入输入图像。RecordReader是DataVec中的一个类,ImageRecordReader是RecordReader中的一个子类,这样就可以将输入图像转成向量化的带有索引的数据。

4)生成DataSetIterator,实现了对输入数据集的迭代。

2.3 网络定义

在Deeplearning4j中,添加一个层的方式是通过NeuralNetConfiguration.Builder()调用layer,指定其在所有层中的输入及输出节点数nIn和nOut,激活方式activation,层的类型如ConvolutionLayer等。

// 设置网络层及超参数
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
   .seed(seed)
   .l2(0.0005)
   .updater(new Adam(0.0001))
   .weightInit(WeightInit.XAVIER)
   .list()
   .layer(0, new ConvolutionLayer.Builder(3, 3)
       .nIn(channels)
       .stride(2, 2)
       .nOut(12)
       .activation(Activation.RELU)
       .weightInit(WeightInit.XAVIER)
       .build())
   .layer(1, new BatchNormalization.Builder()
       .nIn(12)
       .nOut(12)
       .build())
   .layer(2, new ConvolutionLayer.Builder(3, 3)
       .nIn(12)
       .stride(2, 2)
       .nOut(24)
       .activation(Activation.RELU)
       .weightInit(WeightInit.XAVIER)
       .build())
   .layer(3, new BatchNormalization.Builder()
       .nIn(24)
       .nOut(24)
       .build())
   .layer(4, new ConvolutionLayer.Builder(3, 3)
       .nIn(24)
       .stride(2, 2)
       .nOut(48)
       .activation(Activation.RELU)
       .weightInit(WeightInit.XAVIER)
       .build())
   .layer(5, new BatchNormalization.Builder()
       .nIn(48)
       .nOut(48)
       .build())
   .layer(6, new DenseLayer.Builder().activation(Activation.RELU)
       .nOut(128).build())
   .layer(7, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
       .nOut(outputNum)
       .activation(Activation.SOFTMAX)
       .build())
   .setInputType(InputType.convolutionalFlat(48, 48, 3)) // InputType.convolutional for normal image
   .backprop(true).pretrain(false).build();

这里的网络结构和之前的caffe、tensorflow、pytorch等框架采用的网络结构是一样的,都是一个3层的神经网络。

 

3 模型训练

数据准备好了,网络也建好了,接下来就可以训练了。

// 新建一个多层网络模型

MultiLayerNetwork net = new MultiLayerNetwork(conf);
net.init();

// 训练的过程中同时进行评估
for (int i = 0; i < nEpochs; i++) {
   net.fit(trainIter);
   log.info("Completed epoch " + i);
   Evaluation trainEval = net.evaluate(trainIter);
   Evaluation eval = net.evaluate(testIter);
   log.info("train: " + trainEval.precision());
   log.info("val: " + eval.precision());
   trainIter.reset();
   testIter.reset();
}

//保存模型

ModelSerializer.writeModel(net, new File(modelDir + "/mouth-model.zip"), true);

训练的过程非常简单直观,直接通过net.fit()加载trainIter就可以,其中trainIter在数据准备中已经定义好了。

通过net.evaluate(trainIter)和net.evaluate(testIter)的方式来评估训练和测试的表现,这里我们将每个epoch的准确率打印出来。

 

4 可视化

DL4J提供的用户界面可以在浏览器中看到实时的训练过程。

第一步:

将用户界面依赖项添加到pom文件中:

<dependency>
       <groupId>org.deeplearning4j</groupId>
       <artifactId>deeplearning4j-ui_2.10</artifactId>
       <version>${dl4j.version}</version>
   </dependency>

第二步:

在项目中启动用户界面

//初始化用户界面后端,获取一个UI实例
UIServer uiServer = UIServer.getInstance();
//设置网络信息(随时间变化的梯度、分值等)的存储位置。这里将其存储于内存。
StatsStorage statsStorage = new InMemoryStatsStorage(); 
//将StatsStorage实例连接至用户界面,让StatsStorage的内容能够被可视化
uiServer.attach(statsStorage);
//添加StatsListener来在网络定型时收集这些信息
net.setListeners(new StatsListener(statsStorage));

首先我们初始化一个用户界面后端,设置网络信息的存储位置。

这里将其存储于内存,也可以放入文件中,通过new FileStatsStorage(File)的方式实现。

再将StatsStorage实例连接至用户界面,让StatsStorage的内容能够被可视化。

最后添加StatsListener监听,在网络定型时收集这些信息。

默认的浏览器地址是:http://localhost:9000/train/overview

下面可视化一下损失函数值随迭代次数的变化曲线

模型页面中可以直观感受我们建立的模型

看一下最后的训练集和测试集的准确率

有一些过拟合,主要原因还是数据太少。

以上就是我们用自己的数据在DL4J框架上实践的内容,完整代码可以参考官方git。

 

总结

本文讲解了如何使用DL4J深度学习框架完成一个分类任务,虽然这个框架不是很热门,但是它是唯一集成java和大数据平台的,您在用吗?如果您在用,可以联系我们一起交流下!另外,还有想让我们介绍的框架吗?欢迎留言。

转载文章请后台联系

侵权必究

本系列完整文章:

第一篇:【caffe速成】caffe图像分类从模型自定义到测试

第二篇:【tensorflow速成】Tensorflow图像分类从模型自定义到测试

第三篇:【pytorch速成】Pytorch图像分类从模型自定义到测试

第四篇:【paddlepaddle速成】paddlepaddle图像分类从模型自定义到测试

第五篇:【Keras速成】Keras图像分类从模型自定义到测试

第六篇:【mxnet速成】mxnet图像分类从模型自定义到测试

第七篇:【cntk速成】cntk图像分类从模型自定义到测试

第八篇:【chainer速成】chainer图像分类从模型自定义到测试

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

第十篇:【MatConvnet速成】MatConvnet图像分类从模型自定义到测试

第十一篇:【Lasagne速成】Lasagne/Theano图像分类从模型自定义到测试

第十二篇:【darknet速成】Darknet图像分类从模型自定义到测试

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI!

DeepLearning4J入门——使用LSTM进行大盘回归 LSTM是递归神经网络(RNN)的一个变种,相较于RNN而言,解决了记忆消失的问题,用来处理序列问题是一个很好的选择。本文主要介绍如何使用DL4J中的LSTM来执行回归分析。如果不清楚RNN和LSTM,可以先阅读 LSTM和递归网络教程 以及 通过DL4J使用递归网络 ,特别是不熟悉RNN输入和预测方式的强烈建议先阅读这两个教程。如果不太会建立DL4J的工程,建议在其样例工程中进行本实验。 阅读详情

相关推荐

DeepLearning4J入门——让计算机阅读《天龙八部》

很早在实验室就看见钱宝宝用Google的Word2Vector来阅读《天龙八部》并找出与指定词最相关的几个词,最近正好学习新出的深度学习开源项目DeepLearning4J,于是就拿这个例子来练手吧。DL4J快速入门请看 http://deeplearning4j.org/quickstart.html 。 DeepLearning4J的Example中自带了很多应用实例,Word2Vector

Krse Lee的技术博客 1万+

【Deeplearning4j】小小的了解下深度学习

突然想试试看什么人工智能,机器学习,就开始了

Genmer的博客 4312

机器学习笔记 - Java学习框架Deeplearning4j初体验

Deeplearning4j 是一套用于在JVM上运行深度学习的工具。它是唯一一个允许您从 java 训练模型,同时通过我们的 cpython 绑定、模型导入支持以及其他运行时(如 tensorflow-java 和 onnxruntime)的互操作的混合执行与 python 生态系统互操作的框架。 用例包括导入和重新训练模型(Pytorch、Tensorflow、Keras)模型以及在 JVM 微服务环境、移动设备、物联网和 Apache Spark 中部署。

学以致用 知行合一 6298

基于DeepLearning4J框架实现人脸检测

使用Java代码基于DeepLearning4J框架实现人脸检测功能,并集成到Springboot中。

weixin_39876866的博客 4229

DL4J深度学习框架:简介、安装、使用攻略

DL4J(又称为Deeplearning4j)是一种基于Java语言的深度学习框架,它提供了一整套用于构建、训练和调节深度神经网络的工具和算法。DL4J框架简单易用,支持多种JVM语言,不仅可以用于构建深度神经网络,还可以进行数据处理和多种机器学习算法的实现。它在Java领域内形成了强大的社区,为Java开发人员提供了一套强大、灵活的工具,帮助他们更好地应对深度学习应用的挑战。DL4J深度学习框架:简介、安装、使用攻略。

BUG?不存在的! 2087

Java Deeplearning4j:实现图像分类

本文介绍了如何使用 DeepLearning4J 进行图像分类任务。我们首先介绍了相关的 Maven 依赖,然后详细介绍了数据集准备、模型构建、模型训练和评估等关键步骤。通过实际的例子,我们展示了如何使用 DL4J 构建、训练和评估图像分类模型。最后,我们介绍了一些调整模型和参数的方法,以提高模型的性能。希望本文能够帮助读者更好地理解和使用 DeepLearning4J 进行图像分类任务。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 4379

图像进行切割分成两个左右两个图像就行显示出来_【DL4J速成】Deeplearning4j图像分类从模型自定义到测试...

欢迎来到专栏《2小时玩转开源框架系列》,这是我们第九篇,前面已经说过了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,chainer。今天说Deeplearning4j(DL4J),本文所用到的数据,代码请参考我们官方githttps://github.com/longpeng2008/LongPeng_ML_Course作者...

weixin_39957805的博客 176

【深度学习】Java DL4J基于 CNN 构建车辆识别与跟踪模型

DL4J是一个开源的深度学习库,用于在Java和Scala中进行深度学习。它提供了丰富的神经网络架构,如多层感知机MLP)、卷积神经网络CNN)、循环神经网络RNN)及其变体长短期记忆网络LSTM)等。在本案例中,我们选择卷积神经网络(CNN)来实现车辆识别与跟踪模型。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 5683

图像分类——基于Deeplearning4j

本节将讨论如何使用Deeplearning4j库实现一些神经网络结构。

weixin_55987175的博客 2358

【深度学习】Java DL4J基于 RNN 构建智能停车管理模型

Java DL4J是一个开源的、分布式的深度学习库,用于在Java和Scala中进行深度学习。易于使用:提供了简单的API,方便开发者快速搭建和训练深度学习模型。高性能:支持多线程和分布式计算,能够充分利用计算资源,提高模型训练速度。丰富的模型支持:支持多种深度学习模型,如多层感知机(MLP)、卷积神经网络(CNN)、循环神经网络(RNN)等。在本案例中,我们使用RNN构建智能停车管理模型。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 6041

【深度学习】Java DL4J基于 CNN 构建农作物病虫害检测模型

Deeplearning4j是一个开源的深度学习库,它提供了一系列用于构建、训练和部署深度学习模型的工具和API。易于使用:Deeplearning4j提供了简单易用的API,使得开发者可以快速构建和训练深度学习模型,无需深入了解复杂的数学和算法原理。分布式计算支持:支持在多台机器上进行分布式计算,提高模型训练的效率和速度。多种神经网络支持:支持多种常见的神经网络结构,如卷积神经网络(CNN)、循环神经网络(RNN)等。与其他框架集成:可以与其他流行的深度学习框架(如TensorFlow。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 5367

Java Deeplearning4j:实现文本分类

在本文中,我们介绍了如何使用 DeepLearning4J 构建、训练和评估文本分类模型。我们首先准备了数据集,并进行了数据预处理和向量化。然后,我们构建了一个 RNN 模型,并配置了训练参数。最后,我们使用训练数据训练模型,并使用测试数据评估模型的性能。通过调整模型和参数,我们可以提高模型的性能。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 4797

【深度学习】利用Java DL4J 训练金融投资组合模型

深度学习是机器学习的一个分支领域,它通过构建具有多个层次的神经网络模型来自动学习数据的特征表示。在本案例中,我们将使用多层感知机(MLP)神经网络。多层感知机是一种前馈神经网络,它由输入层多个隐藏层和输出层组成。选择 MLP 的原因在于它具有强大的函数逼近能力,能够处理复杂的非线性关系。在金融投资组合优化问题中,资产价格与各种影响因素之间的关系往往是非线性的,MLP可以有效地学习这些复杂关系并进行预测。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 7539

[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简介 Deeplearning4J(简称DL4J)不是第一个开源的深度学习项目,但与此前的其他项目相比,DL4J在编程语言和宗旨两方面都独具特色。DL

Skymind中国 1958

【深度学习】Java DL4J基于 LSTM 构建新能源预测模型

Deeplearning4j是一个基于Java的开源深度学习框架,它提供了丰富的工具和类库,用于构建、训练和部署深度学习模型。易于使用:提供了简单直观的API,使得开发者可以快速上手,构建各种深度学习模型。分布式训练:支持在多台机器上进行分布式训练,提高训练效率。与其他Java库集成:可以方便地与其他Java库如Hadoop、Spark等集成,实现大规模数据的处理和分析。本文介绍了如何使用Java Deeplearning4j框架在能源领域构建新能源预测模型。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 6388

【深度学习】Java DL4J 基于MLP构建农业数据分析模型

Deeplearning4j是一个基于Java的开源深度学习框架,旨在为Java和Scala开发者提供构建、训练和部署深度学习模型的工具。它构建在ND4J(用于Java的数值运算库)之上,提供了丰富的神经网络架构和算法实现。Deeplearning4j支持多种类型的神经网络,如多层感知机(MLP)、卷积神经网络(CNN)、循环神经网络(RNN)及其变体(如LSTM、GRU)等。这使得开发者可以根据具体的问题和数据特点选择最合适的网络结构。通过以上详细的步骤和代码示例,我们成功地利用。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 5127

【深度学习】利用Java DL4J 构建和训练医疗影像分析模型

深度学习是机器学习的一个分支,它通过构建具有多个层次的神经网络模型来自动学习数据中的特征表示。在医疗影像分析中,常用的神经网络包括卷积神经网络(CNN卷积神经网络之所以适用于医疗影像分析,主要是因为其独特的卷积层结构。卷积层能够自动提取影像中的局部特征,例如边缘、纹理等信息,这些特征对于病变区域的识别非常关键。与全连接网络相比,CNN大大减少了模型的参数数量,降低了计算复杂度,同时提高了模型的泛化能力。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 6113

Springboot 整合 Java DL4J 构建股票预测系统

在金融投资领域,股票价格走势的预测一直是投资者和金融分析师们关注的焦点。准确地预测股票价格变化趋势,能够为投资者提供极具价值的决策参考,帮助他们在风云变幻的股票市场中获取更高的收益,同时降低风险。随着科技的不断发展,数据驱动的方法在金融预测中占据了重要地位。 传统的股票分析方法往往基于基本面分析和技术分析。基本面分析侧重于研究公司的财务状况、行业前景等因素;技术分析则是通过分析股票价格和成交量的历史数据来预测未来走势。然而,这些方法在处理复杂的市场动态和海量数据时,存在一定的局限性。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 6587
上一篇: 【技术综述】基于弱监督深度学习的图像分割方法综述​
下一篇: 【杂谈】那些酷炫的深度学习网络图怎么画出来的?
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值