美文网首页深度学习·神经网络·计算机视觉我爱编程
深度学习Java类库deeplearning4j 学习笔记-MN

深度学习Java类库deeplearning4j 学习笔记-MN

作者: taiji1985 | 来源:发表于2017-05-26 11:07 被阅读318次

    deeplearning4j

    这是一个用Java实现的深度学习类库。
    网址: https://deeplearning4j.org

    问题和数据集

    Minist是一个每个学过机器学习的童鞋都熟悉的类库。这个数据集包含70,000个手写数字的图片。每张图片为28*28像素。其中包含60,000个训练数据和10,000个测试数据。图中给出了一些样例图片。

    Paste_Image.png

    每个数据都包含一张图片,以及这张图片上的数字是几。我们希望得到这样一个工具,输入是一张图片,输出是识别出的这个图片的数字。

    下面会用深度学习的方法对其进行训练和测试。

    深度学习网络的结构

    我们知道一个深度神经网络是由多个层构成的,这个案例中使用三层深度学习网络。输入层,隐含层(Hidden layer)和输出层。

    输入层的输入为图片的原始像素数据,输入层的节点个数应该与输入数据的维度相关。在这个数据集中,每个图片是2828的,所以输入层也就有2828个节点。

    输出层为数据的识别结果。因为手写输入有十个,所以输出层的结点个数应该为10个。
    隐含层有多少个节点是由我们根据经验定义的,本例中定义为1000个。

    三层深度学习网络

    使用DL4J实现这个类库

    这个类库提供一种简便的方法来实现层的定义。它提供一个NeuralNetConfiguration.Builder类来配置整个神经网络,使用DenseLayer.Builder来配置每个层的信息。

    上面说的三层神经网络,其实只有两层。 第一层的输入时原始数据,输出是隐含数据,第二层输入时隐含数据,输出是分类结果。

    创建这个层的核心代码如下:

            MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
                    .seed(rngSeed) //include a random seed for reproducibility
                    // use stochastic gradient descent as an optimization algorithm
                    .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
                    .iterations(1)
                    .learningRate(0.006) //specify the learning rate
                    .updater(Updater.NESTEROVS).momentum(0.9) //specify the rate of change of the learning rate.
                    .regularization(true).l2(1e-4)
                    .list()
                    .layer(0, new DenseLayer.Builder() //create the first, input layer with xavier initialization
                            .nIn(numRows * numColumns)
                            .nOut(1000)
                            .activation(Activation.RELU)
                            .weightInit(WeightInit.XAVIER)
                            .build())
                    .layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) //create hidden layer
                            .nIn(1000)
                            .nOut(outputNum)
                            .activation(Activation.SOFTMAX)
                            .weightInit(WeightInit.XAVIER)
                            .build())
                    .pretrain(false).backprop(true) //use backpropagation to adjust weights
                    .build();
    
    

    其中NeuralNetConfiguration.Builder提供很多方法来配置各种参数。

    它使用seed函数配置随机数的种子。为什么要配置随机数的种子呢? 因为神经网络使用随机数来初始化每个参数的值,如果随机数种子不一样,那么初始的参数值就不确定,那么每一次执行得到的结果都可能有细微差别。设定了随机数的种子,就能丝毫不差的重复每次执行。(每次执行得到的结果完全相同),使得实验结构都是可验证的。

    它使用optimizationAlgo函数指定该层使用的最优化算法,这里使用SGD梯度下降法。

    iterations指定经过几次迭代,会将输出数据传递给下一层。

    learningRate是学习率。

    updater指定学习率的改变函数。

    regularization这个函数实现规则化,防止国际和的出现。

    list将上面的配置复制到每一层的配置中。

    DenseLayer.Builder指定每一层的配置。这个例子中使用了2层。第一层输入为原始新昂素数据,输出为隐含数据。其输入节点个数为28*28,使用nIn函数来设定这个值,输出由nOut指定为1000个。
    第二层输入为第一层的输出个数1000个,输出为10个。

    activation指定激活函数 为RELU。

    weightInit指定权重初始化方法。

    build函数使用上面配置的信息构建一个层。

    NeuralNetConfiguration.Builder的layer方法用来添加一个层。

    第二个层是输出层,所以采用了SOFTMAX的激活函数。

    pretrain设置预训练为不适用(false),设置backprop为使用。 最后的build根据上面的配置构建整个神经网络。

    样例程序中的数据集

    样例中给出了MnistDataSetIterator类用以提供数据。

            //Get the DataSetIterators:
            DataSetIterator mnistTrain = new MnistDataSetIterator(batchSize, true, rngSeed);
            DataSetIterator mnistTest = new MnistDataSetIterator(batchSize, false, rngSeed);
    
    

    其中 batchSize为批次大小。为了能高效的进行训练,需要使用批次训练的方法。就是说每次训练时不适用所有数据,而是使用其中一小部分数据,下一次训练在才有第二批数据,以此类推。

    第二个参数应该是指定是否为训练集。第三个参数是随机数种子。

    作者和版权

    作者 杨同峰 ,作者保留所有权利, 允许该文章自由转载,但请保留此版权信息。

    cite: https://deeplearning4j.org/mnist-for-beginners.html

    相关文章

      网友评论

        本文标题:深度学习Java类库deeplearning4j 学习笔记-MN

        本文链接:https://www.haomeiwen.com/subject/nmbtfxtx.html