From 66492c78dd8382a2a19dccfbc9868dc061f45370 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Wed, 9 Oct 2019 22:21:22 +0200 Subject: [PATCH 1/5] #BAEL-18260 Restructure ml and deeplearning4j modules --- deeplearning4j/README.md | 3 +- deeplearning4j/pom.xml | 18 ++++++- .../com/baeldung/logreg/MnistClassifier.java | 0 .../com/baeldung/logreg/MnistPrediction.java | 0 .../main/java/com/baeldung/logreg/Utils.java | 0 ml/README.md | 5 -- ml/pom.xml | 52 ------------------- ml/src/main/resources/logback.xml | 13 ----- pom.xml | 2 - 9 files changed, 19 insertions(+), 74 deletions(-) rename {ml => deeplearning4j}/src/main/java/com/baeldung/logreg/MnistClassifier.java (100%) rename {ml => deeplearning4j}/src/main/java/com/baeldung/logreg/MnistPrediction.java (100%) rename {ml => deeplearning4j}/src/main/java/com/baeldung/logreg/Utils.java (100%) delete mode 100644 ml/README.md delete mode 100644 ml/pom.xml delete mode 100644 ml/src/main/resources/logback.xml diff --git a/deeplearning4j/README.md b/deeplearning4j/README.md index 07954b1a11..47c2d8167d 100644 --- a/deeplearning4j/README.md +++ b/deeplearning4j/README.md @@ -1,6 +1,7 @@ ## Deeplearning4j -This module contains articles about Deeplearning4j +This module contains articles about Deeplearning4j. ### Relevant Articles: - [A Guide to Deeplearning4j](https://www.baeldung.com/deeplearning4j) +- [Logistic Regression in Java](https://www.baeldung.com/java-logistic-regression) diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml index 181dbc871c..64d365e188 100644 --- a/deeplearning4j/pom.xml +++ b/deeplearning4j/pom.xml @@ -24,10 +24,26 @@ deeplearning4j-core ${dl4j.version} + + org.deeplearning4j + deeplearning4j-nn + ${dl4j.version} + + + + org.datavec + datavec-api + ${dl4j.version} + + + org.apache.httpcomponents + httpclient + 4.3.5 + 0.9.1 - \ No newline at end of file + diff --git a/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java similarity index 100% rename from ml/src/main/java/com/baeldung/logreg/MnistClassifier.java rename to deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java diff --git a/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistPrediction.java similarity index 100% rename from ml/src/main/java/com/baeldung/logreg/MnistPrediction.java rename to deeplearning4j/src/main/java/com/baeldung/logreg/MnistPrediction.java diff --git a/ml/src/main/java/com/baeldung/logreg/Utils.java b/deeplearning4j/src/main/java/com/baeldung/logreg/Utils.java similarity index 100% rename from ml/src/main/java/com/baeldung/logreg/Utils.java rename to deeplearning4j/src/main/java/com/baeldung/logreg/Utils.java diff --git a/ml/README.md b/ml/README.md deleted file mode 100644 index 1362f2840c..0000000000 --- a/ml/README.md +++ /dev/null @@ -1,5 +0,0 @@ -### Logistic Regression in Java -This is a soft introduction to ML using [deeplearning4j](https://deeplearning4j.org) library - -### Relevant Articles: -- [Logistic Regression in Java](https://www.baeldung.com/) diff --git a/ml/pom.xml b/ml/pom.xml deleted file mode 100644 index 80afcc24f4..0000000000 --- a/ml/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - 4.0.0 - com.baeldung.deeplearning4j - ml - 1.0-SNAPSHOT - Machine Learning - jar - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.nd4j - nd4j-native-platform - ${dl4j.version} - - - org.deeplearning4j - deeplearning4j-core - ${dl4j.version} - - - org.deeplearning4j - deeplearning4j-nn - ${dl4j.version} - - - - org.datavec - datavec-api - ${dl4j.version} - - - org.apache.httpcomponents - httpclient - 4.3.5 - - - - - - - 1.0.0-beta4 - - - \ No newline at end of file diff --git a/ml/src/main/resources/logback.xml b/ml/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/ml/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index c5a9959573..743d36f641 100644 --- a/pom.xml +++ b/pom.xml @@ -559,7 +559,6 @@ metrics microprofile - ml msf4j mustache @@ -1302,7 +1301,6 @@ metrics microprofile - ml msf4j mustache From 3a7c2ac8cca374e14238e958a13be81e03170e4e Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Sun, 13 Oct 2019 09:38:38 +0200 Subject: [PATCH 2/5] #BAEL-18260 Try and update the nd4j dependency to fix the build --- deeplearning4j/pom.xml | 7 ++++++- .../src/main/java/com/baeldung/logreg/MnistClassifier.java | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml index 64d365e188..9a381c6967 100644 --- a/deeplearning4j/pom.xml +++ b/deeplearning4j/pom.xml @@ -14,6 +14,11 @@ + + org.nd4j + nd4j-api + ${dl4j.version} + org.nd4j nd4j-native-platform @@ -43,7 +48,7 @@ - 0.9.1 + 1.0.0-beta5 diff --git a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java index 1246de973f..e320c366bf 100644 --- a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java +++ b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java @@ -165,4 +165,4 @@ public class MnistClassifier { ModelSerializer.writeModel(model, modelPath, true); logger.info("The MINIST model has been saved in {}", modelPath.getPath()); } -} \ No newline at end of file +} From 104f935120710bd0d93051bd214236edd0f31a63 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Sun, 13 Oct 2019 21:30:33 +0200 Subject: [PATCH 3/5] #BAEL-18260 Attempt to update deeplearning4j version (the two examples used two different versions) --- .../baeldung/deeplearning4j/IrisClassifier.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java b/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java index bf341209e1..b9c794650e 100644 --- a/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java +++ b/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java @@ -3,15 +3,16 @@ package com.baeldung.deeplearning4j; import org.datavec.api.records.reader.RecordReader; import org.datavec.api.records.reader.impl.csv.CSVRecordReader; import org.datavec.api.split.FileSplit; -import org.datavec.api.util.ClassPathResource; import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator; -import org.deeplearning4j.eval.Evaluation; +import org.deeplearning4j.nn.conf.BackpropType; import org.deeplearning4j.nn.conf.MultiLayerConfiguration; import org.deeplearning4j.nn.conf.NeuralNetConfiguration; import org.deeplearning4j.nn.conf.layers.DenseLayer; import org.deeplearning4j.nn.conf.layers.OutputLayer; import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; import org.deeplearning4j.nn.weights.WeightInit; +import org.deeplearning4j.util.NetworkUtils; +import org.nd4j.evaluation.classification.Evaluation; import org.nd4j.linalg.activations.Activation; import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.dataset.DataSet; @@ -19,6 +20,7 @@ import org.nd4j.linalg.dataset.SplitTestAndTrain; import org.nd4j.linalg.dataset.api.iterator.DataSetIterator; import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization; import org.nd4j.linalg.dataset.api.preprocessor.NormalizerStandardize; +import org.nd4j.linalg.io.ClassPathResource; import org.nd4j.linalg.lossfunctions.LossFunctions; import java.io.IOException; @@ -49,11 +51,11 @@ public class IrisClassifier { DataSet testData = testAndTrain.getTest(); MultiLayerConfiguration configuration = new NeuralNetConfiguration.Builder() - .iterations(1000) + .maxNumLineSearchIterations(1000) .activation(Activation.TANH) .weightInit(WeightInit.XAVIER) - .learningRate(0.1) - .regularization(true).l2(0.0001) + //.regularization(true) + .l2(0.0001) .list() .layer(0, new DenseLayer.Builder().nIn(FEATURES_COUNT).nOut(3) .build()) @@ -62,14 +64,15 @@ public class IrisClassifier { .layer(2, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) .activation(Activation.SOFTMAX) .nIn(3).nOut(CLASSES_COUNT).build()) - .backprop(true).pretrain(false) + .backpropType(BackpropType.Standard)//.pretrain(false) .build(); MultiLayerNetwork model = new MultiLayerNetwork(configuration); model.init(); + NetworkUtils.setLearningRate(model, 0.1); model.fit(trainingData); - INDArray output = model.output(testData.getFeatureMatrix()); + INDArray output = model.output(testData.getFeatures()); Evaluation eval = new Evaluation(CLASSES_COUNT); eval.eval(testData.getLabels(), output); From 6018eb39e48a081d789a89ec5ad5b9550b32a8c5 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Mon, 14 Oct 2019 19:18:14 +0200 Subject: [PATCH 4/5] #BAEL-18260 Downgrade deeplearning4j to version 0.9.1, the latest non beta --- deeplearning4j/pom.xml | 2 +- .../deeplearning4j/IrisClassifier.java | 12 +++++------ .../com/baeldung/logreg/MnistClassifier.java | 21 ++++++++----------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml index 9a381c6967..a8663865e0 100644 --- a/deeplearning4j/pom.xml +++ b/deeplearning4j/pom.xml @@ -48,7 +48,7 @@ - 1.0.0-beta5 + 0.9.1 diff --git a/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java b/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java index b9c794650e..dcc81eda6e 100644 --- a/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java +++ b/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java @@ -4,6 +4,7 @@ import org.datavec.api.records.reader.RecordReader; import org.datavec.api.records.reader.impl.csv.CSVRecordReader; import org.datavec.api.split.FileSplit; import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator; +import org.deeplearning4j.eval.Evaluation; import org.deeplearning4j.nn.conf.BackpropType; import org.deeplearning4j.nn.conf.MultiLayerConfiguration; import org.deeplearning4j.nn.conf.NeuralNetConfiguration; @@ -11,8 +12,6 @@ import org.deeplearning4j.nn.conf.layers.DenseLayer; import org.deeplearning4j.nn.conf.layers.OutputLayer; import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; import org.deeplearning4j.nn.weights.WeightInit; -import org.deeplearning4j.util.NetworkUtils; -import org.nd4j.evaluation.classification.Evaluation; import org.nd4j.linalg.activations.Activation; import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.dataset.DataSet; @@ -51,11 +50,11 @@ public class IrisClassifier { DataSet testData = testAndTrain.getTest(); MultiLayerConfiguration configuration = new NeuralNetConfiguration.Builder() - .maxNumLineSearchIterations(1000) + .iterations(1000) .activation(Activation.TANH) .weightInit(WeightInit.XAVIER) - //.regularization(true) - .l2(0.0001) + .regularization(true) + .learningRate(0.1).l2(0.0001) .list() .layer(0, new DenseLayer.Builder().nIn(FEATURES_COUNT).nOut(3) .build()) @@ -64,12 +63,11 @@ public class IrisClassifier { .layer(2, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) .activation(Activation.SOFTMAX) .nIn(3).nOut(CLASSES_COUNT).build()) - .backpropType(BackpropType.Standard)//.pretrain(false) + .backpropType(BackpropType.Standard).pretrain(false) .build(); MultiLayerNetwork model = new MultiLayerNetwork(configuration); model.init(); - NetworkUtils.setLearningRate(model, 0.1); model.fit(trainingData); INDArray output = model.output(testData.getFeatures()); diff --git a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java index e320c366bf..ae705ffad7 100644 --- a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java +++ b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java @@ -10,6 +10,7 @@ import org.datavec.api.split.FileSplit; import org.datavec.image.loader.NativeImageLoader; import org.datavec.image.recordreader.ImageRecordReader; import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator; +import org.deeplearning4j.eval.Evaluation; import org.deeplearning4j.nn.conf.MultiLayerConfiguration; import org.deeplearning4j.nn.conf.NeuralNetConfiguration; import org.deeplearning4j.nn.conf.inputs.InputType; @@ -21,15 +22,12 @@ import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; import org.deeplearning4j.nn.weights.WeightInit; import org.deeplearning4j.optimize.listeners.ScoreIterationListener; import org.deeplearning4j.util.ModelSerializer; -import org.nd4j.evaluation.classification.Evaluation; import org.nd4j.linalg.activations.Activation; import org.nd4j.linalg.dataset.api.iterator.DataSetIterator; import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization; import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler; import org.nd4j.linalg.learning.config.Nesterovs; import org.nd4j.linalg.lossfunctions.LossFunctions; -import org.nd4j.linalg.schedule.MapSchedule; -import org.nd4j.linalg.schedule.ScheduleType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,8 +69,7 @@ public class MnistClassifier { String localFilePath = basePath + "mnist_png.tar.gz"; File file = new File(localFilePath); if (!file.exists()) { - file.getParentFile() - .mkdirs(); + file.getParentFile().mkdirs(); Utils.downloadAndSave(dataUrl, file); Utils.extractTarArchive(file, basePath); } @@ -135,15 +132,15 @@ public class MnistClassifier { .build(); final MultiLayerConfiguration config = new NeuralNetConfiguration.Builder().seed(seed) .l2(0.0005) // ridge regression value - .updater(new Nesterovs(new MapSchedule(ScheduleType.ITERATION, learningRateSchedule))) + .updater(new Nesterovs()) //TODO new MapSchedule(ScheduleType.ITERATION, learningRateSchedule) .weightInit(WeightInit.XAVIER) .list() - .layer(layer1) - .layer(layer2) - .layer(layer3) - .layer(layer2) - .layer(layer4) - .layer(layer5) + .layer(0, layer1) + .layer(1, layer2) + .layer(2, layer3) + .layer(3, layer2) + .layer(4, layer4) + .layer(5, layer5) .setInputType(InputType.convolutionalFlat(height, width, channels)) .build(); From 8956aee90fc24b6c7963e439f7663acaa213471e Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Mon, 14 Oct 2019 19:21:12 +0200 Subject: [PATCH 5/5] #BAEL-18260 Fix tmp directory path --- .../src/main/java/com/baeldung/logreg/MnistClassifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java index ae705ffad7..c8580b9c27 100644 --- a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java +++ b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java @@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory; public class MnistClassifier { private static final Logger logger = LoggerFactory.getLogger(MnistClassifier.class); - private static final String basePath = System.getProperty("java.io.tmpdir") + "mnist" + File.separator; + private static final String basePath = System.getProperty("java.io.tmpdir") + File.separator + "mnist" + File.separator; private static final File modelPath = new File(basePath + "mnist-model.zip"); private static final String dataUrl = "http://github.com/myleott/mnist_png/raw/master/mnist_png.tar.gz";