[DL4J基础教程03]使用Deeplearning4J实现逻辑回归

[DL4J基础教程03]使用Deeplearning4J实现逻辑回归

一、简介

通过深度学习,我们可以组成一个深度神经网络来适应输入数据及其特征。目标是对网络进行数据训练以做出预测,这些预测与我们关心的结果相关;即该交易是否具有欺诈性,或者照片中包含哪些目标?可以使用不同的技术来配置神经网络,所有这些技术都可以在输入和输出之间建立关系层次结构。

在本教程中,我们将配置最简单的神经网络,即逻辑回归网络模型。

回归是一个有助于显示自变量(输入)和因变量(输出)之间关系的过程。在逻辑回归中因变量是分类变量而不是连续变量-这意味着它只能预测有限数量的类或类别,例如我们打开或关闭的开关。例如,它可以预测图像包含猫还是狗,或者可以将输入分类为十个类别,其整数为0到9。

一个简单的逻辑回归计算:x * w + b = y。其中x是输入数据的一个实例,w是变换该输入的权重或系数,b是偏差,y是输出或对该数据的预测。从生物学的角度进行抽象我们知道了人工神经元是如何映射到人脑中的神经元的。最重要的一点是数据如何流过该结构以及如何通过该结构进行转换。

通过本教程,我们将配置只有一个输入层和一个输出层的最简单的网络,以显示逻辑回归的工作原理。

二、导入需要的包

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}
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 outputLayer : OutputLayer = new OutputLayer.Builder()
  .nIn(784) //来自输入层的输入数据数量,即28 X 28
  .nOut(10) //输出层的输出神经元,对应数据集中的类别数量
  .weightInit(WeightInit.XAVIER) //T权重初始化算法
.activation(Activation.SOFTMAX) // Softmax激活函数将输出层的结果转换为概率分布
.build() //构建输出层
 
//由于这是一个具有一个隐藏层的简单网络,因此我们将配置一个MultiLayerNetwork
val logisticRegressionConf : MultiLayerConfiguration = new NeuralNetConfiguration.Builder()
//高级配置
.seed(123)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.updater(new Nesterovs(0.1, 0.9))
//调用list()方法去配置MultiLayerNetwork
.list()
.layer(0, outputLayer) // 输出层输入此处
.build() // 构建配置

你可能想知道为什么我们不编写任何代码来构建输入层。 输入层只是馈入网络的一组输入值。 它不执行计算。 只是进入网络的输入序列(原始或预处理的数据),即要接受训练或评估的数据。 接下来,我们将使用数据迭代器,这些迭代器以特定的模式将输入馈送到网络,并且可以将其视为网络的输入层。并且,在后续教程中,我们将详细介绍deeplearning4j的数据迭代器。

四、模型的训练

val batchSize = 128
val rngSeed = 123
val numEpochs = 15
//获取数据迭代器
val mnistTrain = new MnistDataSetIterator(batchSize, true, rngSeed)
val mnistTest = new MnistDataSetIterator(batchSize, false, rngSeed)
//调用网络模型
val model = new MultiLayerNetwork(logisticRegressionConf)
model.init() //进行模型初始化
model.setListeners(new ScoreIterationListener(10))// 每10次迭代输出分数
model.fit(mnistTrain, numEpochs) //传入数据与迭代次数
//进行训练
for (i <- 1 to numEpochs) {
  println("Epoch" + i + "/" + numEpochs)
  model.fit(mnistTrain)
}

模型的训练:

五、模型的评估

//模型评估
val evaluation = model.evaluate[Evaluation](mnistTest)
 
println("Accuracy:" + evaluation)
// 打印有关训练的分类器的基本统计信息
println("Accuracy: " + evaluation.accuracy())
println("Precision: " + evaluation.precision())
println("Recall: " + evaluation.recall())
 
// 在更复杂的情况下,混淆矩阵非常有帮助
println(evaluation.confusionToString())

最终评估结果如下:

最终,完整代码如下:

import org.deeplearning4j.datasets.iterator.impl.MnistDataSetIterator
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}
import org.deeplearning4j.nn.graph.ComputationGraph
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork
import org.deeplearning4j.nn.weights.WeightInit
import org.deeplearning4j.optimize.listeners.ScoreIterationListener
import org.nd4j.evaluation.classification.Evaluation
import org.nd4j.linalg.activations.Activation
import org.nd4j.linalg.learning.config.Nesterovs
import org.nd4j.linalg.lossfunctions.LossFunctions
 
object logistic_regression{
def main(array:Array[String]){
   //构建输出层
val outputLayer : OutputLayer = new OutputLayer.Builder()
   .nIn(784) //来自输入层的输入数据数量,即28 X 28
    .nOut(10) //输出层的输出神经元,对应数据集中的类别数量
  .weightInit(WeightInit.XAVIER) //T权重初始化算法
.activation(Activation.SOFTMAX) // Softmax激活函数将输出层的结果转换为概率分布
.build() //构建输出层
 
//由于这是一个具有一个隐藏层的简单网络,因此我们将配置一个MultiLayerNetwork
val logisticRegressionConf : MultiLayerConfiguration = new NeuralNetConfiguration.Builder()
//高级配置
.seed(123)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.updater(new Nesterovs(0.1, 0.9))
//调用list()方法去配置MultiLayerNetwork
.list()
.layer(0, outputLayer) // 输出层输入此处
.build() // 构建配置
   val batchSize = 128
val rngSeed = 123
val numEpochs = 15
//获取数据迭代器
val mnistTrain = new MnistDataSetIterator(batchSize, true, rngSeed)
val mnistTest = new MnistDataSetIterator(batchSize, false, rngSeed)
 
 
//调用网络模型
val model = new MultiLayerNetwork(logisticRegressionConf)
model.init() //进行模型初始化
model.setListeners(new ScoreIterationListener(10))// 每10次迭代输出分数
model.fit(mnistTrain, numEpochs) //传入数据与迭代次数
//进行训练
for (i <- 1 to numEpochs) {
   println("Epoch" + i + "/" + numEpochs)
    model.fit(mnistTrain)
}
   //模型评估
val evaluation = model.evaluate[Evaluation](mnistTest)
 
println("Accuracy:" + evaluation)
// 打印有关训练的分类器的基本统计信息
println("Accuracy: " + evaluation.accuracy())
println("Precision: " + evaluation.precision())
println("Recall: " + evaluation.recall())
 
// 在更复杂的情况下,混淆矩阵非常有帮助
println(evaluation.confusionToString())
  
}
 
}

发布于 2021-01-11 16:13