From 615a48f0cff8aab1d96d8dd9611a301b5ede5360 Mon Sep 17 00:00:00 2001 From: Alex Black Date: Tue, 5 May 2020 12:24:03 +1000 Subject: [PATCH] Fixes (#434) * #8901 Avoid unnecessary warning in SameDiffLoss Signed-off-by: Alex Black * Improved error messages for conv2d layers - NCHW vs. NHWC Signed-off-by: Alex Black --- .../convolution/ConvDataFormatTests.java | 62 +++++++++++++++++-- .../nn/conf/layers/Deconvolution2D.java | 5 +- .../layers/convolution/ConvolutionLayer.java | 16 ++++- .../convolution/Deconvolution2DLayer.java | 15 ++++- .../DepthwiseConvolution2DLayer.java | 14 ++++- .../SeparableConvolution2DLayer.java | 15 ++++- .../deeplearning4j/util/ConvolutionUtils.java | 7 +++ .../linalg/lossfunctions/SameDiffLoss.java | 7 ++- 8 files changed, 121 insertions(+), 20 deletions(-) diff --git a/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/nn/layers/convolution/ConvDataFormatTests.java b/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/nn/layers/convolution/ConvDataFormatTests.java index 5d540baa7..76d14d47d 100644 --- a/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/nn/layers/convolution/ConvDataFormatTests.java +++ b/deeplearning4j/deeplearning4j-core/src/test/java/org/deeplearning4j/nn/layers/convolution/ConvDataFormatTests.java @@ -18,11 +18,9 @@ package org.deeplearning4j.nn.layers.convolution; import lombok.*; import org.deeplearning4j.BaseDL4JTest; import org.deeplearning4j.TestUtils; +import org.deeplearning4j.exception.DL4JInvalidInputException; import org.deeplearning4j.nn.api.MaskState; -import org.deeplearning4j.nn.conf.CNN2DFormat; -import org.deeplearning4j.nn.conf.ConvolutionMode; -import org.deeplearning4j.nn.conf.InputPreProcessor; -import org.deeplearning4j.nn.conf.NeuralNetConfiguration; +import org.deeplearning4j.nn.conf.*; import org.deeplearning4j.nn.conf.inputs.InputType; import org.deeplearning4j.nn.conf.layers.*; import org.deeplearning4j.nn.conf.layers.CnnLossLayer; @@ -35,6 +33,7 @@ import org.deeplearning4j.nn.gradient.Gradient; import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; import org.deeplearning4j.nn.workspace.ArrayType; import org.deeplearning4j.nn.workspace.LayerWorkspaceMgr; +import org.deeplearning4j.util.ConvolutionUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -49,6 +48,7 @@ import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; @RunWith(Parameterized.class) public class ConvDataFormatTests extends BaseDL4JTest { @@ -971,4 +971,58 @@ public class ConvDataFormatTests extends BaseDL4JTest { return null; } } + + + @Test + public void testWrongFormatIn(){ + + for(CNN2DFormat df : CNN2DFormat.values()){ + + + for(int i=0; i<4; i++ ){ + + NeuralNetConfiguration.ListBuilder b = new NeuralNetConfiguration.Builder() + .list(); + switch (i){ + case 0: + b.layer(new ConvolutionLayer.Builder().kernelSize(2,2).nIn(3).nOut(3).dataFormat(df).build()); + break; + case 1: + b.layer(new DepthwiseConvolution2D.Builder().kernelSize(2,2).nIn(3).nOut(3).dataFormat(df).build()); + break; + case 2: + b.layer(new Deconvolution2D.Builder().dataFormat(df).kernelSize(2,2).nIn(3).nOut(3).build()); + break; + case 3: + b.layer(new SeparableConvolution2D.Builder().dataFormat(df).kernelSize(2,2).nIn(3).nOut(3).build()); + break; + } + + MultiLayerNetwork net = new MultiLayerNetwork(b.build()); + net.init(); + + INDArray in; + INDArray wrongFormatIn; + if(df == CNN2DFormat.NCHW){ + in = Nd4j.create(DataType.FLOAT, 5, 3, 12, 12); + wrongFormatIn = Nd4j.create(DataType.FLOAT, 5, 12, 12, 3); + } else { + in = Nd4j.create(DataType.FLOAT, 5, 12, 12, 3); + wrongFormatIn = Nd4j.create(DataType.FLOAT, 5, 3, 12, 12); + } + + net.output(in); + + try { + net.output(wrongFormatIn); + } catch (DL4JInvalidInputException e){ +// e.printStackTrace(); + String msg = e.getMessage(); + assertTrue(msg, msg.contains(ConvolutionUtils.NCHW_NHWC_ERROR_MSG)); + } + } + } + + + } } diff --git a/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/conf/layers/Deconvolution2D.java b/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/conf/layers/Deconvolution2D.java index 8daa947df..b2f64c894 100644 --- a/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/conf/layers/Deconvolution2D.java +++ b/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/conf/layers/Deconvolution2D.java @@ -63,6 +63,9 @@ public class Deconvolution2D extends ConvolutionLayer { protected Deconvolution2D(BaseConvBuilder builder) { super(builder); initializeConstraints(builder); + if(builder instanceof Builder){ + this.cnn2dDataFormat = ((Builder) builder).format; + } } public boolean hasBias() { @@ -136,7 +139,7 @@ public class Deconvolution2D extends ConvolutionLayer { private CNN2DFormat format = CNN2DFormat.NCHW; - public Builder format(CNN2DFormat format){ + public Builder dataFormat(CNN2DFormat format){ this.format = format; return this; } diff --git a/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/convolution/ConvolutionLayer.java b/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/convolution/ConvolutionLayer.java index b8b0c13a9..81804a31f 100644 --- a/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/convolution/ConvolutionLayer.java +++ b/deeplearning4j/deeplearning4j-nn/src/main/java/org/deeplearning4j/nn/layers/convolution/ConvolutionLayer.java @@ -310,11 +310,21 @@ public class ConvolutionLayer extends BaseLayer