[Deeplearning4j应用教程05]_Deeplearning4j中的多层网络与计算图实现方法

楚良平
2023-12-01

一、简介

DL4J提供以下类来配置网络:
1、多层网络
2、计算图
MultiLayerNetwork由一个输入层和一个输出层组成,它们之间是一叠层。
ComputationGraph用于构建比MultiLayerNetwork拥有更复杂体系结构的网络。它可以具有多个输入层,多个输出层,并且它们之间的层可以通过直接的非循环图连接。
通过本教程,我们能够掌握在DL4J进行多层网络层与计算图搭建的方法。

二、网络配置

无论创建MultiLayerNetwork还是ComputationGraph,都必须通过NeuralNetConfiguration.Builder为其提供网络配置。 顾名思义,它提供了一个Builder模式来配置网络。 要创建MultiLayerNetwork,我们为ComputationGraph构建一个MultiLayerConfiguraionand,即ComputationGraphConfiguration。
模式如下所示:[高级配置]-> [配置层]-> [构建配置]

三、导入需要的包

import org.deeplearning4j.nn.conf.graph.MergeVertex
import org.deeplearning4j.nn.conf.layers.{DenseLayer, LSTM, OutputLayer, RnnOutputLayer}
import org.deeplearning4j.nn.conf.{ComputationGraphConfiguration, MultiLayerConfiguration, NeuralNetConfiguration}
import org.deeplearning4j.nn.graph.ComputationGraph
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork
import org.deeplearning4j.nn.weights.WeightInit
import org.nd4j.linalg.activations.Activation
import org.nd4j.linalg.learning.config.Nesterovs
import org.nd4j.linalg.lossfunctions.LossFunctions

四、构建一个多层配置

val multiLayerConf: MultiLayerConfiguration = new NeuralNetConfiguration.Builder()
  .seed(123)
  .updater(new Nesterovs(0.1, 0.9)) //优化器配置
  .list() //使用list()配置多层网络层
  .layer(0, new DenseLayer.Builder().nIn(784).nOut(100).weightInit(WeightInit.XAVIER).activation(Activation.RELU).build()) //配置网络层
  .layer(1, new OutputLayer.Builder(LossFunctions.LossFunction.XENT).nIn(100).nOut(10).weightInit(WeightInit.XAVIER).activation(Activation.SIGMOID).build())
  .build() //构建配置

4.1、高级配置

函数seed( ),通过随机数种子确保随机初始化的权重和其他随机产生的网络参数,能够确保运行期间的网络输出可重现;updater( )函数,用于更新参数的算法。第一个值是学习率,第二个值是Nesterov动量。

4.2、网络层的配置

在这里,我们调用list()获得ListBuilder。 它为我们提供了必要的api,以便通过layer(arg1,arg2)函数将层添加到网络。
• 第一个参数是需要添加网络层的位置的索引。
• 第二个参数是我们需要添加的网络层的类型。

要构建和添加层,我们使用类似的构建器模式:
• nln(),来自上一层的输入数量。 (在第一层中,它表示要从输入层获取的输入)
• nOut,发送到下一层的输出数量。(对于输出层,此处代表标签)
• weightInit,用于网络层参数的权重初始化方法。
• activation,层与层之间的激活函数

4.3、建立图

最后,调用build()为我们构建配置。

4.4、检查多层网络层的配置

我们可以将网络配置转换为String,JSON或YAML进行健全性检查。例如:对于JSON,我们可以使用toJson()函数。

println(multiLayerConf.toJson)

五、构建计算图的配置

val computationGraphConf : ComputationGraphConfiguration = new NeuralNetConfiguration.Builder()
      .seed(123)
      .updater(new Nesterovs(0.1, 0.9)) //高级配置
      .graphBuilder()  //调用graphBuilder()方法配置计算图
      .addInputs("input") //配置图层
      .addLayer("L1", new DenseLayer.Builder().nIn(3).nOut(4).build(), "input")
      .addLayer("out1", new OutputLayer.Builder().lossFunction(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nIn(4).nOut(3).build(), "L1")
      .addLayer("out2", new OutputLayer.Builder().lossFunction(LossFunctions.LossFunction.MSE).nIn(4).nOut(2).build(), "L1")
      .setOutputs("out1","out2")
      .build() //构建配置

此处,我们使用的是不一样的图层构建方式。与前面调用list()函数不同,我们调用graphBuilder()来获取用于构建ComputationGraphConfiguration的GraphBuilder。 下面,我们来看看GraphBuilder的每个功能。
• addInputs(),字符串列表,告诉网络将哪些层用作输入层
• addLayer(),第一个参数是图层名称,然后是图层对象,最后是先前定义的字符串列表,用于将该图层作为输入
• setOutputs(),字符串列表,告诉网络将哪些层用作输出层

此处定义的输出层使用另一个函数lossFunction定义要使用的损失函数。

5.1、检查计算图配置

我们可以将网络配置转换为String,JSON或YAML进行健全性检查。例如:对于JSON,我们可以使用toJson()函数。

println(computationGraphConf.toJson)

5.2、创建一个计算图

最后,要创建一个计算图,我们要将配置传递进行传递,如下所示:

val computationGraph : ComputationGraph = new ComputationGraph(computationGraphConf)

六、更多网络层的配置示例

1、正则化

//我们可以在网络的更高级别的配置中添加正则化
// 配置正则化算法:L1(),L2()等,如下图所示:
new NeuralNetConfiguration.Builder()
    .l2(1e-4)

2、Dropout

//创建图层时,可以使用'dropout(<dropOut_factor>)'
new NeuralNetConfiguration.Builder()
    .list() 
    .layer(0, new DenseLayer.Builder().dropOut(0.8).build())

3、偏置初始化

//我们可以使用'biasInit(<init_value>)'来初始化特定图层的偏差
new NeuralNetConfiguration.Builder()
    .list() 
    .layer(0, new DenseLayer.Builder().biasInit(0).build())

七、更多计算图配置示例

1、常用网络
例如LSTM:

val cgConf1 : ComputationGraphConfiguration = new NeuralNetConfiguration.Builder()
        .graphBuilder()
        .addInputs("input") //can use any label for this
        .addLayer("L1", new LSTM.Builder().nIn(5).nOut(5).build(), "input")
        .addLayer("L2",new RnnOutputLayer.Builder().nIn(5+5).nOut(5).build(), "input", "L1")
        .setOutputs("L2")
        .build();

2、多个输入合并相交

//在这里,MergeVertex()连接了图层输出
val cgConf2 : ComputationGraphConfiguration = new NeuralNetConfiguration.Builder()
        .graphBuilder()
        .addInputs("input1", "input2")
        .addLayer("L1", new DenseLayer.Builder().nIn(3).nOut(4).build(), "input1")
        .addLayer("L2", new DenseLayer.Builder().nIn(3).nOut(4).build(), "input2")
        .addVertex("merge", new MergeVertex(), "L1", "L2")
        .addLayer("out", new OutputLayer.Builder().nIn(4+4).nOut(3).build(), "merge")
        .setOutputs("out")
        .build();

3、多任务学习

多任务学习,简单来说,就是在输出层有多个神经元进行输出。

val cgConf3 : ComputationGraphConfiguration = new NeuralNetConfiguration.Builder()
        .graphBuilder()
        .addInputs("input")
        .addLayer("L1", new DenseLayer.Builder().nIn(3).nOut(4).build(), "input")
        .addLayer("out1", new OutputLayer.Builder()
                .lossFunction(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
                .nIn(4).nOut(3).build(), "L1")
        .addLayer("out2", new OutputLayer.Builder()
                .lossFunction(LossFunctions.LossFunction.MSE)
                .nIn(4).nOut(2).build(), "L1")
        .setOutputs("out1","out2")
        .build();
 类似资料: