From 8843c7377ac6b07b31950ffb0e2c15cb72935fe9 Mon Sep 17 00:00:00 2001 From: Alex Black Date: Tue, 26 Nov 2019 19:24:38 +1100 Subject: [PATCH] Update shaded Jackson version to 2.10.1 (#82) * Update shaded Jackson version to 2.10.1 Signed-off-by: AlexDBlack * Remove no longer needed scala compiler plugin from UI Signed-off-by: AlexDBlack * Fix op name for BitwiseAnd op Signed-off-by: AlexDBlack * TimeDistributedLayer mask array fix + test Signed-off-by: AlexDBlack --- .../gradientcheck/RnnGradientChecks.java | 64 +++++++++++++++++++ .../deeplearning4j/nn/dtypes/DTypeTests.java | 4 +- .../recurrent/TimeDistributedLayer.java | 28 ++++++++ .../deeplearning4j-ui-parent/pom.xml | 30 --------- .../impl/transforms/custom/BitwiseAnd.java | 5 +- pom.xml | 6 +- 6 files changed, 101 insertions(+), 36 deletions(-) diff --git a/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/gradientcheck/RnnGradientChecks.java b/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/gradientcheck/RnnGradientChecks.java index 551624175..98385de17 100644 --- a/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/gradientcheck/RnnGradientChecks.java +++ b/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/gradientcheck/RnnGradientChecks.java @@ -21,12 +21,14 @@ import org.deeplearning4j.TestUtils; import org.deeplearning4j.nn.conf.MultiLayerConfiguration; import org.deeplearning4j.nn.conf.NeuralNetConfiguration; import org.deeplearning4j.nn.conf.inputs.InputType; +import org.deeplearning4j.nn.conf.layers.DenseLayer; import org.deeplearning4j.nn.conf.layers.LSTM; import org.deeplearning4j.nn.conf.layers.OutputLayer; import org.deeplearning4j.nn.conf.layers.RnnOutputLayer; import org.deeplearning4j.nn.conf.layers.recurrent.Bidirectional; import org.deeplearning4j.nn.conf.layers.recurrent.LastTimeStep; import org.deeplearning4j.nn.conf.layers.recurrent.SimpleRnn; +import org.deeplearning4j.nn.conf.layers.recurrent.TimeDistributed; import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; import org.deeplearning4j.nn.weights.WeightInit; import org.junit.Ignore; @@ -289,4 +291,66 @@ public class RnnGradientChecks extends BaseDL4JTest { } } } + + + + + @Test + public void testTimeDistributedDense() { + int nIn = 3; + int nOut = 5; + int tsLength = 4; + int layerSize = 8; + + Random r = new Random(12345); + for (int mb : new int[]{1, 3}) { + for (boolean inputMask : new boolean[]{false, true}) { + + + INDArray in = Nd4j.rand(new int[]{mb, nIn, tsLength}); + INDArray labels = TestUtils.randomOneHotTimeSeries(mb, nOut, tsLength); + String maskType = (inputMask ? "inputMask" : "none"); + + INDArray inMask = null; + if (inputMask) { + inMask = Nd4j.ones(mb, tsLength); + for (int i = 0; i < mb; i++) { + int firstMaskedStep = tsLength - 1 - i; + if (firstMaskedStep == 0) { + firstMaskedStep = tsLength; + } + for (int j = firstMaskedStep; j < tsLength; j++) { + inMask.putScalar(i, j, 0.0); + } + } + } + + String name = "testLastTimeStepLayer() - mb=" + mb + ", tsLength = " + tsLength + ", maskType=" + maskType; + if (PRINT_RESULTS) { + System.out.println("Starting test: " + name); + } + + MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() + .dataType(DataType.DOUBLE) + .activation(Activation.TANH) + .updater(new NoOp()) + .weightInit(WeightInit.XAVIER) + .list() + .layer(new LSTM.Builder().nOut(layerSize).build()) + .layer(new TimeDistributed(new DenseLayer.Builder().nOut(layerSize).activation(Activation.SOFTMAX).build(), 2)) + .layer(new RnnOutputLayer.Builder().nOut(nOut).activation(Activation.SOFTMAX) + .lossFunction(LossFunctions.LossFunction.MCXENT).build()) + .setInputType(InputType.recurrent(nIn)) + .build(); + + MultiLayerNetwork net = new MultiLayerNetwork(conf); + net.init(); + + boolean gradOK = GradientCheckUtil.checkGradients(net, DEFAULT_EPS, DEFAULT_MAX_REL_ERROR, + DEFAULT_MIN_ABS_ERROR, PRINT_RESULTS, RETURN_ON_FIRST_FAILURE, in, labels, inMask, null, true, 16); + assertTrue(name, gradOK); + TestUtils.testModelSerialization(net); + } + } + } } diff --git a/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/nn/dtypes/DTypeTests.java b/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/nn/dtypes/DTypeTests.java index 52d3b0774..013738476 100644 --- a/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/nn/dtypes/DTypeTests.java +++ b/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/nn/dtypes/DTypeTests.java @@ -16,6 +16,7 @@ package org.deeplearning4j.nn.dtypes; +import org.deeplearning4j.nn.conf.layers.recurrent.TimeDistributed; import org.nd4j.shade.guava.collect.ImmutableSet; import org.nd4j.shade.guava.reflect.ClassPath; import lombok.extern.slf4j.Slf4j; @@ -811,7 +812,8 @@ public class DTypeTests extends BaseDL4JTest { .layer(new DenseLayer.Builder().nOut(5).build()) .layer(new GravesBidirectionalLSTM.Builder().nIn(5).nOut(5).activation(Activation.TANH).build()) .layer(new Bidirectional(new LSTM.Builder().nIn(5).nOut(5).activation(Activation.TANH).build())) - .layer(new SimpleRnn.Builder().nIn(10).nOut(5).build()) + .layer(new TimeDistributed(new DenseLayer.Builder().nIn(10).nOut(5).activation(Activation.TANH).build(), 2)) + .layer(new SimpleRnn.Builder().nIn(5).nOut(5).build()) .layer(new MaskZeroLayer.Builder().underlying(new SimpleRnn.Builder().nIn(5).nOut(5).build()).maskValue(0.0).build()) .layer(secondLast) .layer(ol) diff --git a/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/recurrent/TimeDistributedLayer.java b/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/recurrent/TimeDistributedLayer.java index 874fb136f..727d19eae 100644 --- a/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/recurrent/TimeDistributedLayer.java +++ b/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/recurrent/TimeDistributedLayer.java @@ -1,10 +1,12 @@ package org.deeplearning4j.nn.layers.recurrent; import org.deeplearning4j.nn.api.Layer; +import org.deeplearning4j.nn.api.MaskState; import org.deeplearning4j.nn.gradient.Gradient; import org.deeplearning4j.nn.layers.wrapper.BaseWrapperLayer; import org.deeplearning4j.nn.workspace.ArrayType; import org.deeplearning4j.nn.workspace.LayerWorkspaceMgr; +import org.deeplearning4j.util.TimeSeriesUtils; import org.nd4j.linalg.api.ndarray.INDArray; import org.nd4j.linalg.primitives.Pair; import org.nd4j.linalg.util.ArrayUtil; @@ -107,4 +109,30 @@ public class TimeDistributedLayer extends BaseWrapperLayer { INDArray permuted = reshaped.permute(permute); return permuted; } + + @Override + public void setMaskArray(INDArray maskArray) { + if(maskArray == null){ + underlying.setMaskArray(null); + } else { + INDArray reshaped = TimeSeriesUtils.reshapeTimeSeriesMaskToVector(maskArray, LayerWorkspaceMgr.noWorkspaces(), ArrayType.ACTIVATIONS); + underlying.setMaskArray(reshaped); + } + } + + @Override + public Pair feedForwardMaskArray(INDArray maskArray, MaskState currentMaskState, int minibatchSize) { + if(maskArray == null){ + return underlying.feedForwardMaskArray(null, currentMaskState, minibatchSize); + } else { + INDArray reshaped = TimeSeriesUtils.reshapeTimeSeriesMaskToVector(maskArray, LayerWorkspaceMgr.noWorkspaces(), ArrayType.ACTIVATIONS); + Pair p = underlying.feedForwardMaskArray(reshaped, currentMaskState, minibatchSize); + if(p == null || p.getFirst() == null){ + return p; + } + INDArray reshaped2 = TimeSeriesUtils.reshapeVectorToTimeSeriesMask(p.getFirst(), (int)maskArray.size(0)); + p.setFirst(reshaped2); + return p; + } + } } diff --git a/deeplearning4j/deeplearning4j-ui-parent/pom.xml b/deeplearning4j/deeplearning4j-ui-parent/pom.xml index 678b1c318..087261f0c 100644 --- a/deeplearning4j/deeplearning4j-ui-parent/pom.xml +++ b/deeplearning4j/deeplearning4j-ui-parent/pom.xml @@ -34,36 +34,6 @@ org.apache.maven.plugins maven-compiler-plugin - - net.alchim31.maven - scala-maven-plugin - ${maven-scala-plugin.version} - - - -deprecation - -explaintypes - -nobootcp - - - - - scala-compile-first - process-resources - - add-source - compile - - - - scala-test-compile - process-test-resources - - add-source - testCompile - - - - diff --git a/nd4j/nd4j-backends/nd4j-api-parent/nd4j-api/src/main/java/org/nd4j/linalg/api/ops/impl/transforms/custom/BitwiseAnd.java b/nd4j/nd4j-backends/nd4j-api-parent/nd4j-api/src/main/java/org/nd4j/linalg/api/ops/impl/transforms/custom/BitwiseAnd.java index 1f4ee0107..df972ff4b 100644 --- a/nd4j/nd4j-backends/nd4j-api-parent/nd4j-api/src/main/java/org/nd4j/linalg/api/ops/impl/transforms/custom/BitwiseAnd.java +++ b/nd4j/nd4j-backends/nd4j-api-parent/nd4j-api/src/main/java/org/nd4j/linalg/api/ops/impl/transforms/custom/BitwiseAnd.java @@ -1,5 +1,6 @@ -/******************************************************************************* +/* ****************************************************************************** * Copyright (c) 2015-2018 Skymind, Inc. + * Copyright (c) 2019 Konduit K.K. * * This program and the accompanying materials are made available under the * terms of the Apache License, Version 2.0 which is available at @@ -50,7 +51,7 @@ public class BitwiseAnd extends BaseDynamicTransformOp { @Override public String opName() { - return "BitwiseAnd"; + return "bitwise_and"; } diff --git a/pom.xml b/pom.xml index 4a0992979..35ef4bcab 100644 --- a/pom.xml +++ b/pom.xml @@ -328,9 +328,9 @@ 1.7.21 4.12 1.2.3 - 2.9.9 - 2.9.9.3 - 1.23 + 2.10.1 + 2.10.1 + 1.24 2.8.7 1.18.2 2.0.0