From 9c2bfc9863baa3112d657bc7e7ceaddfc67a3a22 Mon Sep 17 00:00:00 2001 From: Alex Black Date: Thu, 22 Aug 2019 16:16:03 +1000 Subject: [PATCH] Various fixes (DL4J, ND4J) (#147) * Import fixes, IsMax dtype calc, small test fix Signed-off-by: AlexDBlack * SubsamplingLayer fix Signed-off-by: AlexDBlack * DL4J - SpaceToBatch layer updates Signed-off-by: AlexDBlack --- .../gradientcheck/CNNGradientCheckTest.java | 12 +++++----- .../nn/layers/convolution/SpaceToBatch.java | 22 ++++++++++++------- .../subsampling/SubsamplingLayer.java | 2 +- .../converters/ImportClassMapping.java | 13 ++++++----- .../api/ops/impl/transforms/any/IsMax.java | 6 +++++ .../opvalidation/TransformOpValidation.java | 2 +- 6 files changed, 36 insertions(+), 21 deletions(-) diff --git a/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/gradientcheck/CNNGradientCheckTest.java b/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/gradientcheck/CNNGradientCheckTest.java index 89293829a..c1a873dc8 100644 --- a/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/gradientcheck/CNNGradientCheckTest.java +++ b/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/gradientcheck/CNNGradientCheckTest.java @@ -298,7 +298,7 @@ public class CNNGradientCheckTest extends BaseDL4JTest { int inputDepth = 1; int[] kernel = {2, 2}; - int[] blocks = {1, 1}; + int[] blocks = {2, 2}; String[] activations = {"sigmoid", "tanh"}; SubsamplingLayer.PoolingType[] poolingTypes = @@ -309,8 +309,8 @@ public class CNNGradientCheckTest extends BaseDL4JTest { for (SubsamplingLayer.PoolingType poolingType : poolingTypes) { for (int minibatchSize : minibatchSizes) { INDArray input = Nd4j.rand(minibatchSize, width * height * inputDepth); - INDArray labels = Nd4j.zeros(minibatchSize, nOut); - for (int i = 0; i < minibatchSize; i++) { + INDArray labels = Nd4j.zeros(4 * minibatchSize, nOut); + for (int i = 0; i < 4 * minibatchSize; i++) { labels.putScalar(new int[]{i, i % nOut}, 1.0); } @@ -318,11 +318,11 @@ public class CNNGradientCheckTest extends BaseDL4JTest { new NeuralNetConfiguration.Builder() .dataType(DataType.DOUBLE) .updater(new NoOp()).weightInit(new NormalDistribution(0, 1)) - .list().layer(new ConvolutionLayer.Builder(kernel).nIn(inputDepth) - .nOut(3).build())//output: (5-2+0)/1+1 = 4 + .list() + .layer(new ConvolutionLayer.Builder(kernel).nIn(inputDepth).nOut(3).build()) .layer(new SpaceToBatchLayer.Builder(blocks).build()) //trivial space to batch .layer(new OutputLayer.Builder(LossFunctions.LossFunction.MCXENT) - .activation(Activation.SOFTMAX).nIn(4 * 4 * 3) + .activation(Activation.SOFTMAX) .nOut(nOut).build()) .setInputType(InputType.convolutionalFlat(height, width, inputDepth)) .build(); diff --git a/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/convolution/SpaceToBatch.java b/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/convolution/SpaceToBatch.java index c0770161d..eef8fcee7 100644 --- a/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/convolution/SpaceToBatch.java +++ b/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/convolution/SpaceToBatch.java @@ -100,12 +100,15 @@ public class SpaceToBatch extends AbstractLayer(gradient, outEpsilon); @@ -143,11 +146,14 @@ public class SpaceToBatch extends AbstractLayer doDiff(List f1) { return Collections.singletonList(f().zerosLike(arg())); } + + @Override + public List calculateOutputDataTypes(List inputDataTypes){ + //Also supports other types if say float array is provided as output array + return Collections.singletonList(DataType.BOOL); + } } diff --git a/nd4j/nd4j-backends/nd4j-tests/src/test/java/org/nd4j/autodiff/opvalidation/TransformOpValidation.java b/nd4j/nd4j-backends/nd4j-tests/src/test/java/org/nd4j/autodiff/opvalidation/TransformOpValidation.java index c266aa4bd..0d177027d 100644 --- a/nd4j/nd4j-backends/nd4j-tests/src/test/java/org/nd4j/autodiff/opvalidation/TransformOpValidation.java +++ b/nd4j/nd4j-backends/nd4j-tests/src/test/java/org/nd4j/autodiff/opvalidation/TransformOpValidation.java @@ -1249,7 +1249,7 @@ public class TransformOpValidation extends BaseOpValidation { case 2: //TODO: IsMax supports both bool and float out: https://github.com/deeplearning4j/deeplearning4j/issues/6872 inArr = Nd4j.create(new double[]{-3,5,0,2}); - exp = Nd4j.create(new boolean[]{false,true,false,false}).castTo(DataType.DOUBLE); + exp = Nd4j.create(new boolean[]{false,true,false,false}); out = sd.math().isMax(in); break; case 3: