deeplearning4j
這是一個用Java實現的深度學習類庫。
網址: https://deeplearning4j.org
問題和數據集
Minist是一個每個學過機器學習的童鞋都熟悉的類庫。這個數據集包含70,000個手寫數字的圖片。每張圖片為28*28像素。其中包含60,000個訓練數據和10,000個測試數據。圖中給出了一些樣例圖片。
每個數據都包含一張圖片,以及這張圖片上的數字是幾。我們希望得到這樣一個工具,輸入是一張圖片,輸出是識別出的這個圖片的數字。
下面會用深度學習的方法對其進行訓練和測試。
深度學習網絡的結構
我們知道一個深度神經網絡是由多個層構成的,這個案例中使用三層深度學習網絡。輸入層,隱含層(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為批次大小。為了能高效的進行訓練,需要使用批次訓練的方法。就是說每次訓練時不適用所有數據,而是使用其中一小部分數據,下一次訓練在才有第二批數據,以此類推。
第二個參數應該是指定是否為訓練集。第三個參數是隨機數種子。
作者和版權
作者 楊同峰 ,作者保留所有權利, 允許該文章自由轉載,但請保留此版權信息。