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