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

article/2025/4/30 6:20:50

文章首发于微信公众号《有三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


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

相关文章

深度学习框架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 附加…

2019年如何成为一名合格的数据分析师

我是CPDA数据分析师 我是CDA数据分析员 我从事数据分析相关工作 我是个数据分析的小白 我想转行做数据分析 今天我围绕如何成为合格的数据分析师跟大家分享三个小话题: 找到在数据分析领域的定位 数据分析思维的训练 数据分析领域发展方向 一、找准数据分析师的定位 …

感谢折磨你的人[三]

第38节 肯定自己才能看见成功 美国联合保险公司董事长克里蒙史东说&#xff1a;“真正的成功秘诀是‘肯定人生’四个字&#xff0c;如果你能以坚定而乐观的态度&#xff0c;去面对一切困难险阻&#xff0c;那么&#xff0c;你一定能从其中得到好处。” 不要抱怨周遭人、事、物对…

舒淇放下黎明战胜抑郁 自称没责任感且不会结婚q1h

舒淇入行至今&#xff0c;最令人印象深入的恋情&#xff0c;要数与黎明的7年情&#xff0c;有传二人当年因黎明父亲及影迷反对而分手&#xff0c;有一段时光&#xff0c;舒淇更患上抑郁症&#xff01;舒淇日前接收拜访时&#xff0c;被问到若心境愁闷会如何面对&#xff0c;她说…

PS4计算机模块试题,越玩越留恋的PS4独占大作,馋坏了PC玩家,纷纷加入主机行列...

PS4游戏主机是发烧级玩家必有的装备&#xff0c;它的游戏性能远远大于电脑&#xff0c;对于任何的游戏软件优化很强&#xff0c;几乎很少出现卡顿和缺陷&#xff0c;因为它就是为游戏而生&#xff0c;各种游戏也是为主机固件量身定做&#xff0c;那么这个强大的游戏平台&#x…

ES6 课堂笔记

ES6 第一章 ECMASript 相关介绍 1.1 什么是 ECMA ECMA&#xff08;European Computer Manufacturers Association&#xff09;中文名称为欧洲计算机制造商协会&#xff0c;这个组织的目标是评估、开发和认可电信和计算机标准。1994 年后该组织改名为 Ecma 国际。 1.2 什么是…

深度学习:智能时代的核心驱动力量

内容简介 科技巨头纷纷拥抱学习,自动驾驶、AI、语音识别、图像识别、智能翻译以及震惊世界的 AlphaGo,背后都是学习在发挥的作用。学习是人工智能从概念到繁荣得以实现的主流技术。经过学习训练的计算机,不再被动按照指令运转,而是像自然进化的生命那样,开始自主地从经验中…

林家栋这三十年:深获万梓良、刘德华赏识,靠配角成为影帝

https://www.toutiao.com/a6703796759279174155/ 文 | 王珍一 编辑 | 李小白 很少有演员在成为影帝之后&#xff0c;还能静心的做着配角&#xff0c;林家栋做到了。 从香港无线电视艺员训练班的艺员到成为影帝&#xff0c;林家栋用了30年。 在这漫长的30年里&#xff0c;他静…

新特效火爆抖音!各路神仙齐唱《蚂蚁呀嘿》,网友:短短几秒需一生来治愈

金磊 杨净 发自 凹非寺 量子位 报道 | 公众号 QbitAI 当互联网大佬们集体唱歌&#xff0c;会擦出怎样的火花&#xff1f; 现在&#xff0c;火爆抖音的AI特效&#xff0c;一键就可以实现梦幻联动。 瞧&#xff01;马云、马化腾、马斯克等大佬们&#xff0c;正在集体演唱神曲《蚂…

《猩球黎明》首曝海报

2019独角兽企业重金招聘Python工程师标准>>> 昨日刚刚宣布将档期提至2014年7月11日的《猩球黎明》(Dawn of the Planet of the Apes)&#xff0c;在今日发布了首批角色海报&#xff0c;四张各色的猩猩脸孔&#xff0c;像人类的军人一般在战前在脸上图油彩&#xff0…

知名演员从北大毕业!学位论文让网友直呼:请收下我的膝盖!

来源&#xff1a;广州日报 编辑&#xff1a;双一流高校 近日&#xff0c;49岁香港男艺人马浚伟发布微博称&#xff0c;自己已通过北京大学光华管理学院硕士研究生学位论文答辩&#xff0c;顺利毕业。 相关的一则话题达到了1200万的阅读量&#xff0c;超7000名网友参与讨论。 两…

【腾讯圣诞晚会TEG节目】这里的黎明静悄悄

2018腾讯圣诞晚会全新出发 梦里好成功 如果你什么都没有&#xff0c;至少得有点想象力。 我们今年的男主角郝成功&#xff0c;就是一直生活在想象的美好中。他每天乘坐价值上亿的交通工具&#xff08;地铁&#xff09;上下班&#xff0c;在五星级餐厅享用奢华早餐&#xff08;茶…

中国武打演员大全

1.李小龙&#xff0c;精湛的武功。发千斤于一点&#xff0c;冲极限于苦炼&#xff0c;集所有搏击武功之大成&#xff0c;创造截拳道&#xff0c;使无法为有法&#xff0c;以无限为有限。威震搏击界&#xff0c;并首次将“功夫”做为影片的中心构成因素&#xff0c;发中国功夫片…

Oracle 主外键约束

一 主键&#xff08;Primary Key&#xff09; 1 一个表只能有一个主键&#xff0c;作为主键的列具有唯一&#xff08;unique&#xff09;和非空约束(not null)&#xff1b; 2 对列创建了主键约束的同时&#xff0c;会自动对列创建一个索引&#xff1b; 3 创建表时创建主键两种…