使用Eclipse Deeplearning4j构建简单的神经网络
神經網絡導論
深度學習既包含深度神經網絡又包含深度強化學習,這是機器學習的子集,而機器學習本身就是人工智能的子集。 廣義上講,深度神經網絡執行機器感知,該機器感知從原始數據中提取重要特征,并對每個觀察結果做出某種預測。 示例包括識別圖像中表示的對象,將模擬語音映射到書面轉錄,按情感對文本進行分類以及對時間序列數據進行預測。
盡管神經網絡是上世紀發明的,但直到最近才引起人們更多的興奮。 現在已經有了利用神經網絡概念的計算能力,它們已被用于在計算機視覺,自然語言處理和強化學習等領域設置新的最新技術成果。 DeepMind的科學家實現了一項眾所周知的深度學習成就,他創造了一個名為AlphaGo的計算機程序,該程序在2016年和2017年分別擊敗了前世界冠軍Go選手和現任冠軍。 許多專家預測,這一成就將再持續十年。
神經網絡有許多種,但是它們如何工作的基本概念很簡單。 它們大致基于人腦,由一層或多層“神經元”組成,它們只是傳遞來自上一層信號的數學運算。 在每一層,對來自上一層神經元的輸入進行計算,然后將輸出中繼到下一層。 網絡最后一層的輸出將根據任務表示對輸入數據的一些預測。 建立成功的神經網絡所面臨的挑戰是找到適用于每一層的正確計算。
神經網絡可以處理高維數值和分類數據,并執行諸如回歸,分類,聚類和特征提取之類的任務。 通過首先基于數據和任務配置其體系結構,然后調整其超參數以優化神經網絡的性能來創建神經網絡。 一旦對神經網絡進行了充分的訓練和調整,就可以將其用于處理新的數據集并返回合理可靠的預測。
Eclipse DeepLearning4j適用的地方
Eclipse Deeplearning4j (DL4J)是一個基于JVM的開源工具包,用于構建,訓練和部署神經網絡。 它旨在為Java和Scala社區提供服務,并且用戶友好,穩定并且與Spark,CUDA和cuDNN等技術很好地集成在一起。 Deeplearning4j還與Keras和TensorFlow等Python工具集成,以將其模型部署到JVM上的生產環境。 它還附帶了一組開源庫,Skymind將這些開源庫捆綁在稱為Skymind Intelligence Layer(SKIL)的企業發行版中。 這些庫是:
- Deeplearning4j :神經網絡DSL(有助于構建與數據管道和Spark集成的神經網絡)
- ND4J :用于Java的N維數組,一個張量庫:“具有C代碼和更廣泛范圍的Eclipse January”。 目標是為各種硬件平臺提供張量操作和優化的支持
- DataVec :ETL庫,可矢量化和“張緊”數據。 提取轉換負載,并支持通過一系列數據轉換連接到各種數據源并輸出n維數組
- libnd4j :用于張量操作的純C ++庫,該庫與開源庫JavaCPP緊密協作(JavaCPP是由Skymind工程師創建并維護的,但它不屬于該項目)。
- RL4J :與Deeplearning4j集成的JVM上的強化學習。 包括在AlphaGo和A3C中使用的Deep-Q學習。
- Jumpy :與Numpy集成的ND4J庫的Python接口
- 仲裁器 :通過超參數搜索自動調整神經網絡。 使用網格搜索,隨機搜索和貝葉斯方法進行超參數優化。
- ScalNet :Deeplearning4j的Scala API,在外觀上類似于Torch或Keras。
- ND4S :基于ND4J的Scala N維數組。
這是使用DeepLearning4j的一些原因。
您是該領域的數據科學家,或者是Java,Scala或Python項目的學生,并且需要與JVM堆棧(Hadoop,Spark,Kafka,ElasticSearch,Cassandra)集成。 例如,您希望通過多GPU在Spark上擴展神經網絡訓練。 您需要探索數據,進行和監視將各種算法應用于數據的實驗,并在集群上進行訓練以快速獲取該數據的準確模型。
您是企業環境中的數據工程師或軟件開發人員,需要穩定,可重用的數據管道以及對數據的可伸縮且準確的預測。 這里的用例是使用簡單易懂的API以編程方式自動處理和分析數據,以確定指定結果。
示例:建立前饋網絡
前饋網絡是神經網絡的最簡單形式,也是最早創建的網絡之一。 在這里,我們將基于使用月亮數據的示例概述前饋神經網絡的示例。 數據位于此處 。
原始數據由具有兩個數字功能和兩個標簽的CSV文件組成。 訓練集和測試集位于不同的CSV文件中,訓練集中有2000個觀察值,測試集中有1000個觀察值。 該任務的目的是在給定兩個輸入特征的情況下預測標簽。 因此,我們對分類感興趣。
我們首先初始化構建前饋神經網絡所需的變量。 我們設置了神經網絡的超參數,例如學習率和批量大小,以及與它的體系結構相關的變量,例如隱藏節點的數量。
int seed = 123; double learningRate = 0.005; int batchSize = 50; int nEpochs = 100;int numInputs = 2; int numOutputs = 2; int numHiddenNodes = 20;final String filenameTrain = new ClassPathResource("/classification/moon_data_train.csv").getFile().getPath(); final String filenameTest = new ClassPathResource("/classification/moon_data_eval.csv").getFile().getPath();因為數據位于兩個CSV文件中,所以我們總共初始化了兩個CSVRecordReaders和兩個DataSetIterators 。 RecordReaders會將數據解析為記錄格式,而DataSetIterator會將數據以其可以讀取的格式饋入神經網絡。
RecordReader rr = new CSVRecordReader(); rr.initialize(new FileSplit(new File(filenameTrain))); DataSetIterator trainIter = new RecordReaderDataSetIterator(rr,batchSize,0,2);RecordReader rrTest = new CSVRecordReader(); rrTest.initialize(new FileSplit(new File(filenameTest))); DataSetIterator testIter = new RecordReaderDataSetIterator(rrTest,batchSize,0,2);建立前饋網絡
現在已經準備好數據,我們可以使用MultiLayerConfiguration設置神經網絡的配置。
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder().seed(seed).iterations(1).optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).learningRate(learningRate).updater(Updater.NESTEROVS).list().layer(0, new DenseLayer.Builder().nIn(numInputs).nOut(numHiddenNodes).weightInit(WeightInit.XAVIER).activation(Activation.RELU).build()).layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD).weightInit(WeightInit.XAVIER).activation(Activation.SOFTMAX).nIn(numHiddenNodes).nOut(numOutputs).build()).pretrain(false).backprop(true).build();使用softmax激活函數和負對數似然損失函數,有一個包含20個節點的隱藏層和一個具有兩個節點的輸出層。 我們還設置了如何初始化神經網絡的權重以及神經網絡將如何優化權重。 為了使結果可重復,我們還設置了種子。 也就是說,我們使用隨機初始化的權重,但是如果需要稍后從同一點開始訓練以確認結果,則可以保存它們的隨機初始化。
訓練和評估前饋神經網絡
為了實際創建模型,使用先前設置的配置初始化MultiLayerNetwork 。 然后,我們可以使用訓練循環擬合數據; 或者,如果使用MultipleEpochsIterator ,則只需要調用一次fit函數即可訓練具有設定時期數的數據。
MultiLayerNetwork model = new MultiLayerNetwork(conf); model.init(); model.setListeners(new ScoreIterationListener(100)); for ( int n = 0; n < nEpochs; n++) {model.fit( trainIter ); }數據完成訓練后,我們將使用測試集評估模型。 請注意, testIter根據先前設置的批次大小50創建DataSets 。 Evaluation類將使用正確的標簽和預測來計算準確性。 最后,我們可以打印出結果。
Evaluation eval = new Evaluation(numOutputs); while(testIter.hasNext()){DataSet t = testIter.next();INDArray features = t.getFeatureMatrix();INDArray labels = t.getLabels();INDArray predicted = model.output(features,false);eval.eval(labels, predicted); }System.out.println(eval.stats());該示例涵蓋了使用MultiLayerNetwork創建簡單的前饋神經網絡的基礎。
- 要了解更多信息,請參閱我們的O'Reilly書: 深度學習:從業者的方法
- 并查看Deeplearning4j編程指南
翻譯自: https://www.javacodegeeks.com/2017/11/building-simple-neural-network-eclipse-deeplearning4j.html
總結
以上是生活随笔為你收集整理的使用Eclipse Deeplearning4j构建简单的神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装安卓管家安全吗(安装安卓管家)
- 下一篇: linux服务器同步命令(linux服务