深度学习Java类库deeplearning4j 学习笔记-MNIST手写数字分类问题

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容