DL4J实战之六:图形化展示训练过程
欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 本篇是《DL4J实战》系列的第六篇,咱们继续夯实基本功,这次学习的是如何更加形象完整的展示训练过程:图形化页面,效果如下图所示:
-
接下来选择一个已有的子工程,为其增加图形化界面的效果,我这里选的是《DL4J实战之三:经典卷积实例(LeNet-5)》一文中的<font color="blue">simple-convolution</font>子工程
-
总的来说本篇由以下内容构成:
- 基本的图形化功能
- 图形化数据的持续存储问题
- 图形化页面的端口配置问题
依赖库配置
-
首先是添加依赖库,一共需要两步:
-
打开父工程<font color="blue">dlfj-tutorials</font>的pom.xml,这是管理依赖库版本号的地方,在<font color="blue">dependencies</font>节点确保以下子节点是存在的,这里dl4j-master.version的值是<font color="blue">1.0.0-beta7</font>:
<dependency> <groupId>org.deeplearning4j</groupId> <artifactId>deeplearning4j-ui</artifactId> <version>${dl4j-master.version}</version> </dependency>
- 打开子工程<font color="blue">simple-convolution</font>的pom.xml,添加deeplearning4j-ui库的依赖:
<dependency> <groupId>org.deeplearning4j</groupId> <artifactId>deeplearning4j-ui</artifactId> </dependency>
- 如果您在用的是IDEA,建议执行下图中的操作,确保配置立即生效:
增加图形化相关代码
- 图形化相关的代码很少,只有寥寥几句,写在MultiLayerNetwork实例初始化之后的位置即可,如下图红框所示:
- 上图红框中的代码在此,方便您使用:
// 初始化用户界面后端 UIServer uiServer = UIServer.getInstance(); // 配置要存储网络信息(梯度、分数、时间等)的位置。这里:存储在内存中。 StatsStorage statsStorage = new InMemoryStatsStorage(); // 将StatsStorage实例附加到UI:这允许StatsStorage的内容可视化 uiServer.attach(statsStorage); //然后添加StatsListener来收集网络上的信息 net.setListeners(new StatsListener(statsStorage));
- 最后,为了避免进程过早结束导致无法继续查看图形化信息,在main方法的末尾动一点手脚,如等待输入或者延时,我这里加了个延时:
Thread.sleep(Integer.MAX_VALUE);
- 至此编码完成,运行起来,在浏览器输入<font color="blue">http://localhost:9000</font>,效果如下图:
- 还可以将页面语言换成中文,如下图:
- 点击下图红框中的菜单,还可以看到神经网络每一层的详情:
- 基本功能已经完成,接下来看看持久化问题
持久化存储页面展示的内容
-
前面的图形化功能有个明显的问题:一旦进程结束,web服务也就结束了,下次再启动,页面上展示的也是最新一次训练的数据,如果想保存页面上展现的内容以便后面再回放,应该如何做呢?接下来一起操作,改成可以持久化存储的
-
找到这一行代码:
StatsStorage statsStorage = new InMemoryStatsStorage();
- 把上面那行代码删除,换成下面这行,File对象的入参是数据存储位置,请按照您电脑的实际情况修改:
StatsStorage statsStorage = new FileStatsStorage(new File("E:\\temp\\202107\\11", "ui-stats.dl4j"));
- 把下面这行代码也删除,这样训练完成后进程会立即结束:
Thread.sleep(Integer.MAX_VALUE);
- 现在运行代码执行一次训练,完成后,在<font color="blue">E:\temp\202107\11</font>目录发现生成了名为<font color="red">ui-stats.dl4j</font>的文件:
- 上图看起来已经把数据保存硬盘,接下来试试能不能再次读取到,在<font color="blue">simple-convolution</font>工程中新增<font color="red">Test.java</font>,代码如下所示,寥寥几行,全是前面那点东西:
package com.bolingcavalry.convolution; import org.deeplearning4j.api.storage.StatsStorage; import org.deeplearning4j.ui.api.UIServer; import org.deeplearning4j.ui.storage.FileStatsStorage; import java.io.File; public class Test { public static void main(String[] args) throws Exception { UIServer uiServer = UIServer.getInstance(); StatsStorage statsStorage = new FileStatsStorage(new File("E:\\temp\\202107\\11", "ui-stats.dl4j")); // 将StatsStorage实例附加到UI:这允许StatsStorage的内容可视化 uiServer.attach(statsStorage); Thread.sleep(99999); } }
- 再次打开浏览器访问<font color="blue">http://localhost:9000</font>,曾经的数据再现:
-
聪明的您看了上面的Test.java代码,一定会对欣宸投来鄙视的眼光,就这水平?请容我解释一下,这里只是演示如何加载和展示数据,所以写的过于简陋,您可以将此代码段放在常用的web应用中,如SpringBoot,这样就能按需要加载和查看了
-
解决了存储问题,咱们再来看看web端口如何调整,因为端口冲突,或者一些端口管理,都有调整端口的需求,而不能固定在<font color="blue">9000</font>
关于图细化服务的web端口
-
图细化服务是通过浏览器访问的,默认端口为9000,如果您想改变端口,例如改为9001,该如何操作呢?
-
先看官方怎么说,如下图红框,地址:https://deeplearning4j.konduit.ai/tuning-and-training/visualization
- 听官方的,配置启动参数,操作如下图:
- 确保下图红框2中的菜单被选中:
- 在下图红框位置(VM options位置)填入官方推荐的内容,将端口指定为9001:
- 怕自己设置的参数有问题,我添加了下图红框中的两行代码,将参数打印出来:
- 再次运行Test.java,如下图,红框2证明我按照官方建议输入的参数是没有问题的,但是红框1显示服务还在监听9000端口:
-
去浏览器上试试,发现确实如此:9000端口服务正常,9001端口无法访问
-
这就郁闷了,我的操作有问题吗?若是有问题,<font color="blue">System.getProperty("org.deeplearning4j.ui.port")</font>的输出是<font color="red">9001</font>又怎么解释?
-
还是去看下源码吧,很容易就查到了设置端口值的代码,在<font color="blue">VertxUIServer</font>类中,如下图红框所示,真像大白了!获取端口的代码是<font color="red">System.getenv</font>,这是获取环境变量的方法,不能用前面那种方式去设置:
- 既然源码中是用<font color="blue">System.getenv</font>方法获取参数的,那咱们就按照环境变量的方法来输入吧,如下图所示,将之前的配置删除,再在红框2位置输入参数,注意参数的最前面不需要<font color="red">-D</font>:
-
改好后,再起运行Test.java,如下图,红框1显示web服务监听端口已经变成了9001,红框2中的值为null,这也正常,因为最初的system property参数已经删除了
-
浏览器访问<font color="red">http://localhost:9001</font>试试,可以正常访问了:
-
所以,最终通过修改环境变量,咱们成功的修改了web端口,此刻再回想一下,官方提到的system property和<font color="blue">-Dorg.deeplearning4j.ui.port=9001</font>是怎么回事呢,事实证明这样改是没用的...
-
我觉得,应该是欣宸才疏学浅不了解真像,聪明的您如果发现了问题原因,麻烦您在文章评论者指点一二,谢谢啦。
-
至此,图形化展示训练过程的实战就完成了,希望本文能给您提供一些参考,帮您顺利搭建图形化环境,以更好的观察和调整训练参数、优化网络
你不孤单,欣宸原创一路相伴
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界... https://github.com/zq2599/blog_demos
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
我的成长记1:手把手教你如何画出令人称赞的图(程序员必读)
画一张好图的意义? 作为程序员的你,你经常做的除了起给变量和类起名字、另一就是画图了。抛开起名字这个令人头疼的问题,画图对我们来说是一个表达想法非常不错的方法。 因为画图可以清晰的表述你的思维框架,帮你梳理逻辑,更好的传达信息。 有的人跟我说画图是一项费时费力的活,的确是这样。但是你要换一个思路想想,为什么会费时费力呢?因为你的大脑在组织你用语言所表达的东西,而且你要思考如何表达才能简单、清晰。如果你只是胡乱涂鸦,那肯定不会费事的,是不是? 那么,知道了这一点,其实你会发现,如果你画了几张高质量的图,能清晰的表达你的思想。无论在工作、面试与人交流都可以起到事半功倍的效果。 那你是不是应该在这个方面多留一些,多学习一点方法和表述手段。这样能对你的工作生活都很有帮助。 画好图的必备思想 **站在观众和新人的角度画图。**假设你就是第一次理解这个知识和技术,你接受了怎么样的表述才能理解。你就朝着这个方向去画图,肯定会有提升的。 这一点是非常重要的。我会尽量用如果我是读者或者观众我怎么能理解这张图。如果理解吃力,说明不太合适。是否要拆分更多的图,一步一步带着来解释。 是否要举例子,结合图来表述...
- 下一篇
props/$emit、v-model、.sync的适用场景 -- vue组件通信系列
vue组件的数据通信方式很多,本篇着重讲props/$emit,神助是v-model/.sync语法糖。 TL;DR props/$emit是父子组件最常用的通信方式,而v-model、.sync只是其语法糖 子组件只是单一的修改某个父组件值的话,表单类组件使用v-model语法糖 子组件只是单一的修改某个父组件值的话,非表单类组件使用sync语法糖 复杂逻辑还是老老实实props/$emit 其实语法糖只是在父组件用的时候更加方便,而子组件该咋样还是咋样。 props/$emit 子组件想要显示父组件的数据,就props。 子组件想要改变父组件的数据,就$emit。 留意的点: 子组件props里定义的属性名和父组件里的一一对应,注意父组件使用属性的时候用羊肉串格式 父组件的监听事件名和子组件的触发事件名必须一模一样 子组件触发事件的时候,传过来的参数,父组件可以用$event接收 v-model语法糖 v-model是属性value和事件input的语法糖。 没有语法糖的时候,这样写 用v-model的话,父组件就可以少了监听事件,用起来更加方便 v-model的语法糖有其局限性:...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题