深度學(xué)習(xí)Java類庫deeplearning4j 學(xué)習(xí)筆記-MNIST手寫數(shù)字分類問題

deeplearning4j

這是一個用Java實(shí)現(xiàn)的深度學(xué)習(xí)類庫慰丛。
網(wǎng)址: https://deeplearning4j.org

問題和數(shù)據(jù)集

Minist是一個每個學(xué)過機(jī)器學(xué)習(xí)的童鞋都熟悉的類庫蚊夫。這個數(shù)據(jù)集包含70,000個手寫數(shù)字的圖片。每張圖片為28*28像素绅你。其中包含60,000個訓(xùn)練數(shù)據(jù)和10,000個測試數(shù)據(jù)。圖中給出了一些樣例圖片滞乙。

Paste_Image.png

每個數(shù)據(jù)都包含一張圖片蚓聘,以及這張圖片上的數(shù)字是幾。我們希望得到這樣一個工具氢伟,輸入是一張圖片榜轿,輸出是識別出的這個圖片的數(shù)字。

下面會用深度學(xué)習(xí)的方法對其進(jìn)行訓(xùn)練和測試朵锣。

深度學(xué)習(xí)網(wǎng)絡(luò)的結(jié)構(gòu)

我們知道一個深度神經(jīng)網(wǎng)絡(luò)是由多個層構(gòu)成的谬盐,這個案例中使用三層深度學(xué)習(xí)網(wǎng)絡(luò)。輸入層诚些,隱含層(Hidden layer)和輸出層飞傀。

輸入層的輸入為圖片的原始像素?cái)?shù)據(jù),輸入層的節(jié)點(diǎn)個數(shù)應(yīng)該與輸入數(shù)據(jù)的維度相關(guān)诬烹。在這個數(shù)據(jù)集中砸烦,每個圖片是2828的,所以輸入層也就有2828個節(jié)點(diǎn)绞吁。

輸出層為數(shù)據(jù)的識別結(jié)果幢痘。因?yàn)槭謱戄斎胗惺畟€,所以輸出層的結(jié)點(diǎn)個數(shù)應(yīng)該為10個家破。
隱含層有多少個節(jié)點(diǎn)是由我們根據(jù)經(jīng)驗(yàn)定義的颜说,本例中定義為1000個。

三層深度學(xué)習(xí)網(wǎng)絡(luò)

使用DL4J實(shí)現(xiàn)這個類庫

這個類庫提供一種簡便的方法來實(shí)現(xiàn)層的定義汰聋。它提供一個NeuralNetConfiguration.Builder類來配置整個神經(jīng)網(wǎng)絡(luò)门粪,使用DenseLayer.Builder來配置每個層的信息。

上面說的三層神經(jīng)網(wǎng)絡(luò)烹困,其實(shí)只有兩層玄妈。 第一層的輸入時原始數(shù)據(jù),輸出是隱含數(shù)據(jù),第二層輸入時隱含數(shù)據(jù)拟蜻,輸出是分類結(jié)果绎签。

創(chuàng)建這個層的核心代碼如下:

        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提供很多方法來配置各種參數(shù)。

它使用seed函數(shù)配置隨機(jī)數(shù)的種子酝锅。為什么要配置隨機(jī)數(shù)的種子呢辜御? 因?yàn)樯窠?jīng)網(wǎng)絡(luò)使用隨機(jī)數(shù)來初始化每個參數(shù)的值,如果隨機(jī)數(shù)種子不一樣屈张,那么初始的參數(shù)值就不確定擒权,那么每一次執(zhí)行得到的結(jié)果都可能有細(xì)微差別。設(shè)定了隨機(jī)數(shù)的種子阁谆,就能絲毫不差的重復(fù)每次執(zhí)行碳抄。(每次執(zhí)行得到的結(jié)果完全相同),使得實(shí)驗(yàn)結(jié)構(gòu)都是可驗(yàn)證的场绿。

它使用optimizationAlgo函數(shù)指定該層使用的最優(yōu)化算法剖效,這里使用SGD梯度下降法。

iterations指定經(jīng)過幾次迭代焰盗,會將輸出數(shù)據(jù)傳遞給下一層璧尸。

learningRate是學(xué)習(xí)率。

updater指定學(xué)習(xí)率的改變函數(shù)熬拒。

regularization這個函數(shù)實(shí)現(xiàn)規(guī)則化爷光,防止國際和的出現(xiàn)。

list將上面的配置復(fù)制到每一層的配置中澎粟。

DenseLayer.Builder指定每一層的配置蛀序。這個例子中使用了2層。第一層輸入為原始新昂素?cái)?shù)據(jù)活烙,輸出為隱含數(shù)據(jù)徐裸。其輸入節(jié)點(diǎn)個數(shù)為28*28,使用nIn函數(shù)來設(shè)定這個值啸盏,輸出由nOut指定為1000個重贺。
第二層輸入為第一層的輸出個數(shù)1000個,輸出為10個回懦。

activation指定激活函數(shù) 為RELU气笙。

weightInit指定權(quán)重初始化方法。

build函數(shù)使用上面配置的信息構(gòu)建一個層粉怕。

NeuralNetConfiguration.Builder的layer方法用來添加一個層健民。

第二個層是輸出層抒巢,所以采用了SOFTMAX的激活函數(shù)贫贝。

pretrain設(shè)置預(yù)訓(xùn)練為不適用(false),設(shè)置backprop為使用。 最后的build根據(jù)上面的配置構(gòu)建整個神經(jīng)網(wǎng)絡(luò)稚晚。

樣例程序中的數(shù)據(jù)集

樣例中給出了MnistDataSetIterator類用以提供數(shù)據(jù)崇堵。

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

其中 batchSize為批次大小。為了能高效的進(jìn)行訓(xùn)練客燕,需要使用批次訓(xùn)練的方法鸳劳。就是說每次訓(xùn)練時不適用所有數(shù)據(jù),而是使用其中一小部分?jǐn)?shù)據(jù)也搓,下一次訓(xùn)練在才有第二批數(shù)據(jù)赏廓,以此類推。

第二個參數(shù)應(yīng)該是指定是否為訓(xùn)練集傍妒。第三個參數(shù)是隨機(jī)數(shù)種子幔摸。

作者和版權(quán)

作者 楊同峰 ,作者保留所有權(quán)利, 允許該文章自由轉(zhuǎn)載颤练,但請保留此版權(quán)信息既忆。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嗦玖,隨后出現(xiàn)的幾起案子患雇,更是在濱河造成了極大的恐慌,老刑警劉巖宇挫,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苛吱,死亡現(xiàn)場離奇詭異,居然都是意外死亡器瘪,警方通過查閱死者的電腦和手機(jī)又谋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娱局,“玉大人彰亥,你說我怎么就攤上這事∷テ耄” “怎么了任斋?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耻涛。 經(jīng)常有香客問我废酷,道長,這世上最難降的妖魔是什么抹缕? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任澈蟆,我火速辦了婚禮,結(jié)果婚禮上卓研,老公的妹妹穿的比我還像新娘趴俘。我一直安慰自己睹簇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布寥闪。 她就那樣靜靜地躺著太惠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疲憋。 梳的紋絲不亂的頭發(fā)上凿渊,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天,我揣著相機(jī)與錄音缚柳,去河邊找鬼埃脏。 笑死,一個胖子當(dāng)著我的面吹牛秋忙,可吹牛的內(nèi)容都是我干的剂癌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼翰绊,長吁一口氣:“原來是場噩夢啊……” “哼佩谷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起监嗜,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤谐檀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后裁奇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桐猬,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年刽肠,在試婚紗的時候發(fā)現(xiàn)自己被綠了溃肪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡音五,死狀恐怖惫撰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躺涝,我是刑警寧澤厨钻,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站坚嗜,受9級特大地震影響夯膀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苍蔬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一诱建、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碟绑,春花似錦俺猿、人聲如沸茎匠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抓狭,卻和暖如春伯病,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背否过。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工午笛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苗桂。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓药磺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親煤伟。 傳聞我的和親對象是個殘疾皇子癌佩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容