[Deeplearning4j应用教程07]_Deeplearning4j内置数据迭代器的使用

一、简介

玩具数据集对于测试假设和开始任何神经网络训练过程至关重要。 Deeplearning4j带有用于常见数据集的内置数据集迭代器,包括但不限于:
• MNIST
• Iris
• TinyImageNet (subset of ImageNet)
• CIFAR-10
• Labelled Faces in the Wild
• Curve Fragment Ground-Truth Dataset
这些数据集还用作测试其他机器学习算法的基准。 请记住,请在其许可范围内正确使用这些数据集(例如,你必须获得特殊许可才能在商业项目中使用ImageNet)。
基于对MultiLayerNetwork和ComputationGraph的了解,我们将实例化几个数据迭代器,以将玩具数据集馈入神经网络进行训练。 本章节的重点是训练分类器(你也可以训练网络以进行回归,或通过自动编码器将其用于无监督的训练),并且还将学习如何在控制台中解释输出。

二、导包

import org.nd4j.linalg.activations.Activation
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator
import org.deeplearning4j.datasets.iterator.impl.MnistDataSetIterator
import org.nd4j.evaluation.classification.Evaluation
import org.deeplearning4j.nn.conf.MultiLayerConfiguration
import org.deeplearning4j.nn.conf.NeuralNetConfiguration
import org.nd4j.linalg.learning.config.Nesterovs
import org.deeplearning4j.nn.conf.layers.DenseLayer
import org.deeplearning4j.nn.conf.layers.OutputLayer
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork
import org.deeplearning4j.nn.weights.WeightInit
import org.deeplearning4j.optimize.listeners.ScoreIterationListener
import org.nd4j.linalg.api.ndarray.INDArray
import org.nd4j.linalg.dataset.DataSet
import org.nd4j.linalg.lossfunctions.LossFunctions.LossFunction
import org.slf4j.Logger
import org.slf4j.LoggerFactory

三、MNIST分类网络

MultiLayerNetwork可以对MNIST数字进行分类。 如果您不熟悉MNIST,则它是最初为识别手写数字而组装的数据集。 您可以在此处here阅读有关MNIST的更多信息。
导入所需内容后,按如下所示设置基本的MultiLayerNetwork。

//输入图片的行和列的大小
val numRows = 28
val numColumns = 28
val outputNum = 10 // 输出类别的数量
val batchSize = 128 // 每次迭代的BN
val rngSeed = 123 // 用于重现的随机数种子
val numEpochs = 15 // 迭代次数

val conf: MultiLayerConfiguration = new NeuralNetConfiguration.Builder()
    //使用随机数种子,用于重现
    .seed(rngSeed) 
//指定学习率和学习率的变化率。
.updater(new Nesterovs(0.006, 0.9))
    .l2(1e-4)
    .list()
    //创建第一层网络层,使用xavier初始化输入层
    .layer(0, new DenseLayer.Builder() 
            .nIn(numRows * numColumns)
            .nOut(1000)
            .activation(Activation.RELU)
            .weightInit(WeightInit.XAVIER)
            .build())
//创建隐藏层
    .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) 
            .nIn(1000)
            .nOut(outputNum)
            .activation(Activation.SOFTMAX)
            .weightInit(WeightInit.XAVIER)
            .build())
    .build()

val model = new MultiLayerNetwork(conf)
model.init()
//每10次迭代输出一次分数即损失
model.setListeners(new ScoreIterationListener(10))

四、使用MNIST内置数据迭代器

像Deeplearning4j的大多数内置迭代器一样,MNIST迭代器扩展了DataSetIterator类。 该API允许简单地实例化数据集并在后台自动下载数据。 MNIST数据迭代器API特别允许我们指定是使用训练数据集还是测试数据集,因此可以实例化两个不同的迭代器来评估你的网络。
代码如下:

//获取数据迭代器
val mnistTrain = new MnistDataSetIterator(batchSize, true, rngSeed)
val mnistTest = new MnistDataSetIterator(batchSize, false, rngSeed)

五、训练

现在,已经设置了网络配置并与我们的MNIST测试/训练迭代器一起实例化了,训练仅需几行代码。
之前我们使用setListeners()方法将ScoreIterationListener附加到模型。 根据用于运行此笔记本的浏览器,可以打开调试器/检查器以查看侦听器输出。 由于Deeplearning4j的内部使用SLF4J进行日志记录,因此此输出将重定向到控制台,并且Zeppelin会将输出重定向。 这是一件好事,因为它可以减少笔记本计算机的混乱情况。
随着精心调整的模型继续训练,其误差值将随着每次迭代而降低。 该错误或损失分数最终将收敛到接近零的值。 请注意,更复杂的网络和问题可能永远不会产生最佳分数。当我们掌握的足够多的时候,就可以继续微调和更改模型的配置。
训练代码如下:

// 执行多次迭代的最简单方法是将它们传递给fit 
model.fit(mnistTrain, numEpochs)
//灵活控制迭代次数
for (i <- 1 to numEpochs) {
    
    
    println("Epoch " + i + " / " + numEpochs)
    model.fit(mnistTrain)
}

六、评估模型

“过拟合”是深度学习中的常见问题,在这种情况下,你的模型不能很好地解决你的实际问题。 当您在训练数据集上运行了太多时间的算法时,或者您没有使用Dropout等正则化技术,或者训练数据集不够大且未封装所有 描述您在现实世界中的课程。
Deeplearning4j随附了用于模型评估的内置工具。 最简单的方法是将测试迭代器传递给eval()并检索评估对象。 org.nd4j.evaluation.classification包中提供了更多内容,包括ROC绘图和回归评估。

代码如下:

//评估模型
val evaluation = model.evaluate[Evaluation](mnistTest)

// 输出评估结果
println("Accuracy: "+evaluation.accuracy())
println("Precision: "+evaluation.precision())
println("Recall: "+evaluation.recall())

// 输出关于最终分类结果的混淆矩阵
println(evaluation.confusionToString())

最终输出结果如下:
在这里插入图片描述
完整代码如下(注意:使用自己的对象名称):

import org.nd4j.linalg.activations.Activation
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator
import org.deeplearning4j.datasets.iterator.impl.MnistDataSetIterator
import org.nd4j.evaluation.classification.Evaluation
import org.deeplearning4j.nn.conf.MultiLayerConfiguration
import org.deeplearning4j.nn.conf.NeuralNetConfiguration
import org.nd4j.linalg.learning.config.Nesterovs
import org.deeplearning4j.nn.conf.layers.DenseLayer
import org.deeplearning4j.nn.conf.layers.OutputLayer
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork
import org.deeplearning4j.nn.weights.WeightInit
import org.deeplearning4j.optimize.listeners.ScoreIterationListener
import org.nd4j.linalg.api.ndarray.INDArray
import org.nd4j.linalg.dataset.DataSet
import org.nd4j.linalg.lossfunctions.LossFunctions.LossFunction
import org.slf4j.Logger
import org.slf4j.LoggerFactory

object xxxx{
    
    
    def main(args: Array[String]): Unit = {
    
    
//输入图片的行和列的大小
val numRows = 28
val numColumns = 28
val outputNum = 10 // 输出类别的数量
val batchSize = 128 // 每次迭代的BN
val rngSeed = 123 // 用于重现的随机数种子
val numEpochs = 15 // 迭代次数

val conf: MultiLayerConfiguration = new NeuralNetConfiguration.Builder()
    //使用随机数种子,用于重现
    .seed(rngSeed) 
//指定学习率和学习率的变化率。
.updater(new Nesterovs(0.006, 0.9))
    .l2(1e-4)
    .list()
    //创建第一层网络层,使用xavier初始化输入层
    .layer(0, new DenseLayer.Builder() 
            .nIn(numRows * numColumns)
            .nOut(1000)
            .activation(Activation.RELU)
            .weightInit(WeightInit.XAVIER)
            .build())
//创建隐藏层
    .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) 
            .nIn(1000)
            .nOut(outputNum)
            .activation(Activation.SOFTMAX)
            .weightInit(WeightInit.XAVIER)
            .build())
    .build()

val model = new MultiLayerNetwork(conf)
model.init()
//每10次迭代输出一次分数即损失
model.setListeners(new ScoreIterationListener(10))
//获取数据迭代器
val mnistTrain = new MnistDataSetIterator(batchSize, true, rngSeed)
val mnistTest = new MnistDataSetIterator(batchSize, false, rngSeed)

// 执行多次迭代的最简单方法是将它们传递给fit 
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.accuracy())
println("Precision: "+evaluation.precision())
println("Recall: "+evaluation.recall())

// 输出关于最终分类结果的混淆矩阵
println(evaluation.confusionToString())

}
}

猜你喜欢

转载自blog.csdn.net/weixin_33980484/article/details/112375280
今日推荐