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ù)。圖中給出了一些樣例圖片滞乙。
每個數(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個。
使用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)信息既忆。