一、简介
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();
转载:https://blog.csdn.net/weixin_33980484/article/details/112361050