Eclipse Deeplearning4j GitChat课程:https://gitbook.cn/gitchat/column/5bfb6741ae0e5f436e35cd9f
Eclipse Deeplearning4j 系列博客:https://blog.csdn.net/wangongxi
Eclipse Deeplearning4j Github:https://github.com/eclipse/deeplearning4j
在上一篇的博客中,我们介绍了如何利用Deeplearning4j/ND4j提供的自动微分工具SameDiff来实现线性回归模型。SameDiff的建模类似1.x版本的Tensorflow,是基于张量的OP操作来进行的。基于OP的建模并不像基于Layer那样对神经网络进行分层,甚至开发人员可以抛弃网络层次的概念只关注对张量进行各种计算变换即可。但当神经网络的结构逐渐复杂之后,这种方式可能更容易出错,因此大部分框架都支持对模型进行可视化,典型的是TensorBoard工具。Deeplearning4j同样为SameDiff提供了可视化的模块,主要用于记录在建模期间的Loss下降趋势、超参数值的变化率等。这里我们主要结合之前SameDiff进行线性回归建模的工作,介绍如何在建模期间使用SameDiff提供的UI Listener以及CheckPoint工具。
Deeplearning4j的UI模块是一个独立的项目,使用前我们可以直接引入相应的依赖:
<dependency>
<groupId>org.deeplearning4j</groupId>
<artifactId>deeplearning4j-ui_${scala.version}</artifactId>
<version>${dl4j.version}</version>
</dependency>
需要注意的是,deeplearning4j-ui需要JDK1.8及以上版本的支持,如果还在使用JDK1.7的开发人员需要进行升级。
UI模块的github地址:https://github.com/eclipse/deeplearning4j/tree/master/deeplearning4j/deeplearning4j-ui-parent
首先我们介绍下CheckpointListener
1. CheckpointListener
CheckPoint的作用在大部分算法框架中是记录一定阶段的模型状态,或者说某一时刻的模型拷贝。在部分大数据框架中(如:Spark Streaming和Flink),CheckPoint则是作为一种容错机制,具体实现方式可以是算子的分布式快照。我们先给出一个记录SameDiff CheckPoint的例子:
//checkpoint数据监听器
CheckpointListener checkPointerListener = new CheckpointListener.Builder(new File("save/directory"))
.saveEveryEpoch() //checkpoint保存频率:每一轮训练都保存
.deleteExisting(true) //删除之前的checkpoint保存记录
.build();
在上面的逻辑中,我们创建了一个CheckPoint实例,同时设置了两个属性。saveEveryEpoch方法可以保证在每一轮训练后将当时的模型参数保存下来。对于大多数开发人员来说,这是常见的属性设置。如果对于训练过程中模型的状态要有更为精细的掌握,可以通过saveEveryNIterations方法来进行更加个性化的设置。比如,我们可以每经过100次迭代就记录一下模型的快照,而不必等到该轮训练结束。deleteExisting方法意味着之前训练保存下来的CheckPoint记录会被删除。需要注意的是,在Builder静态类的构造方法中,我们设置的CheckPoint的保存路径。最后我们调用build方法创建CheckPoint监听实例,如果运行正确,我们在当前根路径下面可以看下截图的类似的信息。
可以看到在每一轮训练后,模型都被保存到一个bin文件中,开发人员可以根据需要,比如每一轮模型的评估情况或者Loss值,来选择实际部署的bin文件。
在CheckpointListener源码的注释里面给出了更多的实例以及使用说明,这里贴一下截图但不做详细的说明了,开发人员可以自行研读源码。
2. UIListener
SameDiff工具在建模期间的相关数据(如:计算流图结构、Loss趋势、超参数变化率)是通过UI Listener来进行设置并进行记录的。UI Listener在模型训练过程中将需要可视化展示的数据写到指定的日志文件中,开发人员可以通过Web页面加载该序列化的日志文件并生成相应的统计视图。我们先给出一个案例:
//ui可视化数据监听器
UIListener uiListener = UIListener.builder(new File("save/ui-samediff.bin"))
.plotLosses(1) //loss数据记录频率
.updateRatios(10) //每10次迭代记录超参更新的比率
.build();
UI Listener的设置和CheckPoint Listener的设置类似,开发人员需要指定日志文件的路径并且配置一些需要记录的数据。这里我们选择记录Loss值的变化以及超参数的变化率。最终的序列化日志文件会保存在项目根路径下的ui-samediff.bin文件中。在正常运行的情况下,我们会得到截图中的文件:
截图中红框选中的即为UI Listener记录的训练日志文件。为了加载该日志文件,我们需要声明一个Web UI实例:
UIServer uiServer = UIServer.getInstance();
在控制台我们可以看到上面截图的这段日志信息。这段日志说明Web UI已经启动,并且可以通过http://localhost:9000/samediff 进行访问。我们直接通过浏览器访问该页面,可以看到如下信息。注意:直接访问http://localhost:9000得到的是默认的DL4j的页面,并不是SameDiff的可视化数据页面。
类似于TensorBoard的页面,SameDiff的可视化页面默认展示的是计算流图结构,这里也就是我上一篇博客里构建的线性回归模型。在页面的左侧导航栏可以看到我们选择的文件信息、输入输出节点信息等等。Find Nodes是个搜索框。对于那些图结构非常复杂的神经网络模型,搜索节点的功能会非常有用,不过当前的结构很清晰,不需要借助这个搜索功能。
上面这两张截图是Plots Tab页面展示的训练过程中的数据变化折线图。在UI Listener实例的创建中,我们分别记录了Loss和超参数的变化率,并保存在日志文件中。通过Web页面加载ui-samediff.bin文件后生成了上面的折线图。
3. ScoreListener
Samediff的Score Listener作用和基于Layer建模方式的监听器是一样的。配置ScoreListener后,控制台会自动打印训练过程中的Loss变化日志。
sd.setListeners(new ScoreListener(1), uiListener, checkPointerListener); //设置监听器:loss监听、ui可视化数据监听/记录、checkpoint数据监听/记录
SameDiff实例可以接受多个监听实例的设置。这里我们将上面提及的三个监听器一并做下设置。正常执行完毕后,我们可以看到Score Listener会打印类似如下信息:
4. 小结
这篇博客我们主要介绍了SameDiff建模的一些辅助的可视化的工具。我们重点介绍了三种Listener,并且给出了具体的案例来说明使用方法。开发人员可以结合自身的场景来选择使用,包括一些具体的配置项。SameDiff的可视化工具目前应该说还不是特别完善,Skymind团队也在逐步地完善当中,最新进展可以关注项目的更新以及即将到来的1.0.0正式版本。