Deeplearning4J之前馈神经网络
一、简介
在之前的教程中,我们了解了一个非常简单的神经网络模型-Logistic回归模型。但,尽管我们可以使用这样的简单模型解决许多任务,但是大多数问题都需要非常复杂的网络配置。 典型的深度倾斜模型由输入和输出之间的许多层组成。 在本教程中,我们将学习其中一种配置,即前馈神经网络。
二、前馈网络
前馈网络是指网络层之间没有循环连接的网络。 在经过多个中间层之后,输入流向输出流。 一个典型的前馈网络如下所示:
Source: https://upload.wikimedia.org/wikipedia/en/5/54/Feed_forward_neural_net.gif
在这里,我们可以看到另一个名为隐藏层的层。输入和输出层之间的层称为隐藏层。 之所以称为“隐藏”,是因为我们不直接处理它们,因此不可见。网络中可以有多个隐藏层。
就像上一教程中输出层之后的softmax激活一样,网络的每一层之间也可以有激活功能。 他们负责允许(激活)或禁止我们的网络输出到下一层节点。同样,激活功能也有许多种,例如S形和Relu等。接下来,让我们看看,如何搭建一个前馈网络的吧!
三、导包
import org.deeplearning4j.nn.api.OptimizationAlgorithm
import org.deeplearning4j.nn.conf.graph.MergeVertex
import org.deeplearning4j.nn.conf.layers.{
DenseLayer, GravesLSTM, OutputLayer, RnnOutputLayer}
import org.deeplearning4j.nn.conf.{
ComputationGraphConfiguration, MultiLayerConfiguration, NeuralNetConfiguration, Updater}
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.AdaGrad
import org.nd4j.linalg.lossfunctions.LossFunctions
四、创建前馈网络配置
val conf = new NeuralNetConfiguration.Builder()
.seed(12345)//随机数种子
.weightInit(WeightInit.XAVIER) //权重初始化-使用Xavier
.updater(new AdaGrad(0.5)) //更新器-使用AdaGrad
.activation(Activation.RELU) //激活函数
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)//优化算法-随机梯度下降
.l2(0.0001)//L2正则化
.list()//配置网络
.layer(0, new DenseLayer.Builder().nIn(784).nOut(250).weightInit(WeightInit.XAVIER).activation(Activation.RELU) //第一层隐藏层
.build())
.layer(1, new OutputLayer.Builder().nIn(250).nOut(10).weightInit(WeightInit.XAVIER).activation(Activation.SOFTMAX) //输出层
.lossFunction(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)//损失函数-使用负对数似然
.build())
.build()
五、多层隐藏层配置
正如我们在上面看到的那样,我们已经进行了具有一个隐藏层的前馈网络配置。 我们在隐藏层和输出层之间使用了RELU激活。 RELU是最常用的激活功能之一。 激活函数还会在我们的网络中引入非线性,因此我们可以学习数据中存在的更复杂的特征。隐藏层可以从输入层学习特征,并且可以将这些特征发送给我们的输出层进行分析以获得相应的输出。 我们可以使用类似地方法给网络配置更多的隐藏层,如下所示:
//必须确保下一层的输入数量等于上一层的输出数量。
val conf = new NeuralNetConfiguration.Builder()
.seed(12345) //随机数种子
.weightInit(WeightInit.XAVIER) //权重初始化-Xavier
.updater(new AdaGrad(0.5)) //更新器
.activation(Activation.RELU) //激活函数-Relu
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) //优化算法-随机梯度下降
.learningRate(0.05) //学习率
.l2(0.0001) //L2正则
.list() //网络配置
//第一个隐藏层
.layer(0, new DenseLayer.Builder()
.nIn(784).nOut(250) //输入输出节点
.weightInit(WeightInit.XAVIER) //权重初始化-Xavier
.activation(Activation.RELU) //激活函数-Relu
.build())
//第二个隐藏层
.layer(1, new DenseLayer.Builder()
.nIn(250).nOut(100)
.weightInit(WeightInit.XAVIER)
.activation(Activation.RELU)
.build())
//第三个隐藏层
.layer(2, new DenseLayer.Builder()
.nIn(100).nOut(50)
.weightInit(WeightInit.XAVIER)
.activation(Activation.RELU)
.build())
//输出层
.layer(3, new OutputLayer.Builder()
.nIn(50).nOut(10)
.weightInit(WeightInit.XAVIER)
.activation(Activation.SOFTMAX)
.lossFunction(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) //损失函数-负对数似然
.build())
.build()