深度学习AI

DL4J中文文档/调优与训练/可视化

2018-11-19  本文已影响48人  hello风一样的男子

内容

用DL4J UI可视化网络训练

注意:这里的信息属于DL4J版本0.7.0和更高版本。

DL4J在浏览器中提供了一个用户界面来可视化当前的网络状态和训练过程。这个界面通常用于帮助调整神经网络,即选择超参数(例如学习速率)以获得网络的良好性能。

第1步:向项目中添加DL4J UI依赖项。

    <dependency>
        <groupId>org.deeplearning4j</groupId>
        <artifactId>deeplearning4j-ui_2.10</artifactId>
        <version>1.0.0-beta3</version>
    </dependency>

image.gif

请注意 _2.10后缀:这是Scala版本(由于使用了Play框架,一个Scala库,用于后端)。如果你没有使用其他Scala库,_2.10_2.11都可以。

第2步:启用项目中的用户界面

这是比较直截了当的:

    //初始化用户界面后端
    UIServer uiServer = UIServer.getInstance();

    //配置要存储网络信息(梯度、分数、时间等)的位置。这里:存储在内存中。
    StatsStorage statsStorage = new InMemoryStatsStorage(); //可选的: new FileStatsStorage(File), 保存用于稍后加载

    // 将StatsStorage实例附加到UI:这允许StatsStorage的内容可视化
    uiServer.attach(statsStorage);

    //然后添加StatsListener来收集网络上的信息
    net.setListeners(new StatsListener(statsStorage));

image.gif

要访问UI,请打开浏览器,转到http://localhost:9000/train。可以使用org.deeplearning4j.ui.port系统属性设置端口:即,使用端口9001,在启动时将下列内容传递给JVM:-Dorg.deeplearning4j.ui.port=9001

然后,当你在网络上调用fit()方法时,信息将被收集并路由到UI。

示例: 在这里查看UI示例

完整的UI示例集在这里是可用的。

DL4J UI: 概览页

Overview Page image.gif

概述页面(3个可用页面之一)包含以下信息:

请注意,对于下面两个图表,这些图表被显示为值的对数(底数为10)。因此,更新值为-3:参数比率图对应于10-3=0.001的比率。

参数更新的比率具体地是这些值的平均幅度的比率(即,log10(mean(abs(updates))/mean(abs(parameters)) )。

请参阅本页后面的部分,说明如何在实践中使用这些值。

DL4J UI: 模型页面

Model Page image.gif

模型页面包含神经网络层的图形,其作为选择机制运行。点击一个图层来显示它的信息。

在右边,在选择图层之后可以得到以下图表:

注:参数标注如下:权重(W)和偏置(B)。对于循环神经网络,W是指连接层到下层的权重,RW指的是循环权重(即,时间步之间的权重)。

DL4J UI 与 Spark 训练

DL4J UI可以与Spark一起使用。然而,对于0.7.0版本,冲突依赖意味着在相同的JVM中运行UI和Spark可能是困难的。

有两种选择:

  1. 收集并保存相关的统计数据,以便在稍后的时间内可视化(离线)
  2. 在单独的服务器中运行UI,并使用远程UI功能将数据从Spark master上传到UI实例。

收集用于以后离线使用的统计信息

    SparkDl4jMultiLayer sparkNet = new SparkDl4jMultiLayer(sc, conf, tm);

    StatsStorage ss = new FileStatsStorage(new File("myNetworkTrainingStats.dl4j"));
    sparkNet.setListeners(ss, Collections.singletonList(new StatsListener(null)));

image.gif

然后,你可以使用以下方式加载和显示保存的信息:

    StatsStorage statsStorage = new FileStatsStorage(statsFile);//如果文件已经存在:从中加载数据
    UIServer uiServer = UIServer.getInstance();
    uiServer.attach(statsStorage);

image.gif

使用远程UI功能

首先,在JVM中用于UI(注意这是服务器):

    UIServer uiServer = UIServer.getInstance();
    uiServer.enableRemoteListener(); //必要:默认远程支持不启用
image.gif

这将需要deeplearning4j-ui_2.10deeplearning4j-ui_2.11依赖。(注意,这不是客户端,这是你的服务器-下面的客户端使用:deeplearning4j-ui-model)

第一,客户端(spark和独立神经网络都使用简单的deeplearning4j-nn)第二,对于你的神经网络(注意,这个例子是用于spark的,但是计算图和多层网络都具有相同的用法,setListeners方法,这里找到的示例):

    SparkDl4jMultiLayer sparkNet = new SparkDl4jMultiLayer(sc, conf, tm);

    StatsStorageRouter remoteUIRouter = new RemoteUIStatsStorageRouter("http://UI_MACHINE_IP:9000");
    sparkNet.setListeners(remoteUIRouter, Collections.singletonList(new StatsListener(null)));

image.gif

为了避免与Spark的依赖冲突,你应该使用deeplearning4j-ui-model依赖来获得StatsListener,而不是完整的deeplearning4j-ui_2.10 UI依赖。

Scala用户注意事项:

如果你在一个新的Scala版本上,你需要使用上面的方法。请参阅客户端的链接示例。

注意:你应该用运行用户界面实例的机器的IP地址替换UI_MACHINE_IP

使用UI调整网络

这是一个很好的网页,由Andrej Karpathy编写的关于可视化神经网络训练。第一页是值得阅读和理解的。

调整神经网络往往是一门艺术而不是一门科学。然而,这里有一些有用的想法:

概述页面-模型得分与迭代图

分数与迭代应该(总体)随着时间推移而下降。

概述页面和模型页面-使用更新:参数比率图表

模型页面:层激活(vs.时间)图

这个图表可以用于检测消失或爆炸的激活(由于恬当的权重初始化、太多的规则化、缺乏数据归一化或学习率太高)。

模型页:层参数直方图

仅在最近迭代中显示层参数直方图。

模型页:层更新直方图

只显示最近一次迭代的层更新直方图。

模型页:参数学习率图表

这个图表简单地显示了选定层随着时间的推移的参数的学习速率。

如果你不使用学习率调度,图表将是平的。如果你使用的是学习率调度,则可以使用这个图表来跟踪随着时间推移的学习率的当前值(对于每个参数)。

TSNE 与 Word2vec

我们依赖于TSNE,将单词特征向量的维数降到二维或三维空间。这里有一些使用TSNE与Word2Vec的代码:

log.info("Plot TSNE....");
BarnesHutTsne tsne = new BarnesHutTsne.Builder()
        .setMaxIter(1000)
        .stopLyingIteration(250)
        .learningRate(500)
        .useAdaGrad(false)
        .theta(0.5)
        .setMomentum(0.5)
        .normalize(true)
        .usePca(false)
        .build();
vec.lookupTable().plotVocab(tsne);

image.gif

修复问题: “No configuration setting” 异常

DL4J UI可能发生的异常如下:

com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'play.crypto.provider'
        at com.typesafe.config.impl.SimpleConfig.findKeyOrNull(SimpleConfig.java:152)
        at com.typesafe.config.impl.SimpleConfig.findOrNull(SimpleConfig.java:170)
        ...
        at play.server.Server.forRouter(Server.java:96)
        at org.deeplearning4j.ui.play.PlayUIServer.runMain(PlayUIServer.java:206)
        at org.deeplearning4j.ui.api.UIServer.getInstance(UIServer.java:27)

image.gif

这个异常不是直接由于DL4J造成的,而是由于缺少application.conf文件,这个文件是Play框架(DL4J的UI所基于的库)需要的。这最初存在于deeplearning4j-play依赖项中:但是,如果uber-jar(即,具有依赖项的JAR文件)(例如,通过mvn包)被构建,uber-jar则可能无法被正确地复制。例如,使用maven-assembly-plugin已经对一些用户造成了这个异常。

推荐的解决方案(对于Maven)是使用Maven Shade插件生成Uber jar,配置如下:

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>${exec-maven-plugin.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>java</executable>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${maven-shade-plugin.version}</version>
                <configuration>
                    <shadedArtifactAttached>true</shadedArtifactAttached>
                    <shadedClassifierName>${shadedClassifier}</shadedClassifierName>
                    <createDependencyReducedPom>true</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <!--<exclude>org/datanucleus/**</exclude>-->
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>

                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>reference.conf</resource>
                                </transformer>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" />
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        <plugins>
    <build>

image.gif

然后,用MVN包创建你的uber.jar,并通过cd 目标 和 java -cp dl4j-examples-0.9.1-bin.jar org.deeplearning4j.examples.userInterface.UIExample。 注意生成的JAR文件的“-bin”后缀:这包括所有依赖项。

还要注意,这个Maven Shade方法是为DL4J的示例库配置的。

翻译:风一样的男子

image

如果您觉得我的文章给了您帮助,请为我买一杯饮料吧!以下是我的支付宝,意思一下我将非常感激!

image
上一篇 下一篇

猜你喜欢

热点阅读