From 207a473940a3492099f6deb4494c6a199e20cbb9 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 14:59:02 +0200 Subject: [PATCH 01/92] creates the 3DConvolution class and adds the name of the 3DConv layer to the AllPredefinedLayers class --- .../cnnarch/predefined/3DConvolution.java | 71 +++++++++++++++++++ .../predefined/AllPredefinedLayers.java | 1 + 2 files changed, 72 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java new file mode 100644 index 0000000..f11695f --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java @@ -0,0 +1,71 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class 3DConvolution extends PredefinedLayerDeclaration { + + private 3DConvolution() { + super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + // TODO check here + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + errorIfInputSmallerThanKernel(inputTypes, layer); + } + + public static 3DConvolution create(){ + 3DConvolution declaration = new 3DConvolution(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.PADDING_NAME) + .constraints(Constraints.PADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index eed303f..3d336b1 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -57,6 +57,7 @@ public class AllPredefinedLayers { public static final String RESHAPE_NAME = "Reshape"; public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; + public static final String ThreeDConvolution_Name = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 43f2d2c99edfef39d7129d0e4da65461cd6e5603 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:03:40 +0200 Subject: [PATCH 02/92] Renames 3DConvolution to ThreeDConvolution --- .../cnnarch/predefined/AllPredefinedLayers.java | 5 +++-- .../{3DConvolution.java => ThreeDConvolution.java} | 10 +++++----- 2 files changed, 8 insertions(+), 7 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{3DConvolution.java => ThreeDConvolution.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 3d336b1..7972497 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -57,7 +57,7 @@ public class AllPredefinedLayers { public static final String RESHAPE_NAME = "Reshape"; public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; - public static final String ThreeDConvolution_Name = "3DConvolution"; + public static final String THREED_CONVOLUTION_Name = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -194,7 +194,8 @@ public class AllPredefinedLayers { LoadNetwork.create(), DotProductSelfAttention.create(), LargeMemory.create(), - EpisodicMemory.create()); + EpisodicMemory.create(), + ThreeDConvolution.create()); } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java index f11695f..9d68770 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class 3DConvolution extends PredefinedLayerDeclaration { +public class ThreeDConvolution extends PredefinedLayerDeclaration { - private 3DConvolution() { - super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + private ThreeDConvolution() { + super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); } @Override @@ -34,8 +34,8 @@ public class 3DConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static 3DConvolution create(){ - 3DConvolution declaration = new 3DConvolution(); + public static ThreeDConvolution create(){ + ThreeDConvolution declaration = new ThreeDConvolution(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From 91b8eaa333d737e09670ef1a4fc5ef40cc1eb383 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:36:49 +0200 Subject: [PATCH 03/92] Renames ThreeDConvolution to Convolution3D --- .../cnnarch/predefined/AllPredefinedLayers.java | 4 ++-- .../{ThreeDConvolution.java => Convolution3D.java} | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{ThreeDConvolution.java => Convolution3D.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 7972497..12ad2f5 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -57,7 +57,7 @@ public class AllPredefinedLayers { public static final String RESHAPE_NAME = "Reshape"; public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; - public static final String THREED_CONVOLUTION_Name = "3DConvolution"; + public static final String CONVOLUTION3D_Name = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -195,7 +195,7 @@ public class AllPredefinedLayers { DotProductSelfAttention.create(), LargeMemory.create(), EpisodicMemory.create(), - ThreeDConvolution.create()); + Convolution3D.create()); } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 9d68770..af18fbe 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class ThreeDConvolution extends PredefinedLayerDeclaration { +public class Convolution3D extends PredefinedLayerDeclaration { - private ThreeDConvolution() { - super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); + private Convolution3D() { + super(AllPredefinedLayers.CONVOLUTION3D_NAME); } @Override @@ -34,8 +34,8 @@ public class ThreeDConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static ThreeDConvolution create(){ - ThreeDConvolution declaration = new ThreeDConvolution(); + public static Convolution3D create(){ + Convolution3D declaration = new Convolution3D(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From 9ccff95846414e94ff78b3f387edb36f6d99508d Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:11:40 +0200 Subject: [PATCH 04/92] Adds the 3D up convolution layer class and name in predefinedLayers --- .../predefined/AllPredefinedLayers.java | 4 +- .../cnnarch/predefined/UpConvolution3D.java | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 12ad2f5..fd35bc8 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -58,6 +58,7 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CONVOLUTION3D_Name = "3DConvolution"; + public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -195,7 +196,8 @@ public class AllPredefinedLayers { DotProductSelfAttention.create(), LargeMemory.create(), EpisodicMemory.create(), - Convolution3D.create()); + Convolution3D.create() + UpConvolution3D.create()); } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java new file mode 100644 index 0000000..6e0d7d3 --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -0,0 +1,68 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class UpConvolution3D extends PredefinedLayerDeclaration { + + private UpConvolution3D() { + super(AllPredefinedLayers.UP_CONVOLUTION3D_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + return computeUpConvOutputShape(inputTypes.get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + } + + public static UpConvolution3D create(){ + UpConvolution3D declaration = new UpConvolution3D(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.TRANSPADDING_NAME) + .constraints(Constraints.TRANSPADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 4773b7b079006bf50117d5d192714d578c38a5ff Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:12:14 +0200 Subject: [PATCH 05/92] Fix small syntax bug --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index fd35bc8..3837565 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -196,7 +196,7 @@ public class AllPredefinedLayers { DotProductSelfAttention.create(), LargeMemory.create(), EpisodicMemory.create(), - Convolution3D.create() + Convolution3D.create(), UpConvolution3D.create()); } -- GitLab From 3ff5ea0fabea1b4010add357be4f94ffceecfb81 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 4 May 2021 09:03:08 +0200 Subject: [PATCH 06/92] Fix bug --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 3837565..6c207a0 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -57,8 +57,8 @@ public class AllPredefinedLayers { public static final String RESHAPE_NAME = "Reshape"; public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; - public static final String CONVOLUTION3D_Name = "3DConvolution"; - public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; + public static final String CONVOLUTION3D_NAME = "3DConvolution"; + public static final String UP_CONVOLUTION3D_NAME = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 027376107f30cee78f8e2975ca693612de5b4410 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 14 May 2021 17:28:03 +0200 Subject: [PATCH 07/92] I dont exactly know whats in here --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4f6569c..5c32923 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ de.monticore.lang.monticar cnn-arch - 0.4.4-SNAPSHOT + 0.4.7-SNAPSHOT -- GitLab From 26f0a483d8f7f853cd31cb7793d14ce327f69bbe Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 14:59:02 +0200 Subject: [PATCH 08/92] creates the 3DConvolution class and adds the name of the 3DConv layer to the AllPredefinedLayers class --- .../cnnarch/predefined/3DConvolution.java | 71 +++++++++++++++++++ .../predefined/AllPredefinedLayers.java | 1 + 2 files changed, 72 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java new file mode 100644 index 0000000..f11695f --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java @@ -0,0 +1,71 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class 3DConvolution extends PredefinedLayerDeclaration { + + private 3DConvolution() { + super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + // TODO check here + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + errorIfInputSmallerThanKernel(inputTypes, layer); + } + + public static 3DConvolution create(){ + 3DConvolution declaration = new 3DConvolution(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.PADDING_NAME) + .constraints(Constraints.PADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index ff0a2e3..5383b9f 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,6 +60,7 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; + public static final String ThreeDConvolution_Name = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 62aead61ff82b19cf1b8175cbf36c34db3061744 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:03:40 +0200 Subject: [PATCH 09/92] Renames 3DConvolution to ThreeDConvolution --- .../cnnarch/predefined/AllPredefinedLayers.java | 6 ++++++ .../{3DConvolution.java => ThreeDConvolution.java} | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{3DConvolution.java => ThreeDConvolution.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 5383b9f..30f7c04 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -61,6 +61,7 @@ public class AllPredefinedLayers { public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; public static final String ThreeDConvolution_Name = "3DConvolution"; + public static final String THREED_CONVOLUTION_Name = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -199,8 +200,13 @@ public class AllPredefinedLayers { LoadNetwork.create(), DotProductSelfAttention.create(), LargeMemory.create(), +<<<<<<< HEAD EpisodicMemory.create()); +======= + EpisodicMemory.create(), + ThreeDConvolution.create()); +>>>>>>> Renames 3DConvolution to ThreeDConvolution } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java index f11695f..9d68770 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class 3DConvolution extends PredefinedLayerDeclaration { +public class ThreeDConvolution extends PredefinedLayerDeclaration { - private 3DConvolution() { - super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + private ThreeDConvolution() { + super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); } @Override @@ -34,8 +34,8 @@ public class 3DConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static 3DConvolution create(){ - 3DConvolution declaration = new 3DConvolution(); + public static ThreeDConvolution create(){ + ThreeDConvolution declaration = new ThreeDConvolution(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From 096c04b57c923a97f770b9347e2a55648a95ddcd Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:36:49 +0200 Subject: [PATCH 10/92] Renames ThreeDConvolution to Convolution3D --- .../cnnarch/predefined/AllPredefinedLayers.java | 5 +++++ .../{ThreeDConvolution.java => Convolution3D.java} | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{ThreeDConvolution.java => Convolution3D.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 30f7c04..7d29baf 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -62,6 +62,7 @@ public class AllPredefinedLayers { public static final String CUSTOM_LAYER = "CustomLayer"; public static final String ThreeDConvolution_Name = "3DConvolution"; public static final String THREED_CONVOLUTION_Name = "3DConvolution"; + public static final String CONVOLUTION3D_Name = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -205,8 +206,12 @@ public class AllPredefinedLayers { ======= EpisodicMemory.create(), +<<<<<<< HEAD ThreeDConvolution.create()); >>>>>>> Renames 3DConvolution to ThreeDConvolution +======= + Convolution3D.create()); +>>>>>>> Renames ThreeDConvolution to Convolution3D } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 9d68770..af18fbe 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class ThreeDConvolution extends PredefinedLayerDeclaration { +public class Convolution3D extends PredefinedLayerDeclaration { - private ThreeDConvolution() { - super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); + private Convolution3D() { + super(AllPredefinedLayers.CONVOLUTION3D_NAME); } @Override @@ -34,8 +34,8 @@ public class ThreeDConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static ThreeDConvolution create(){ - ThreeDConvolution declaration = new ThreeDConvolution(); + public static Convolution3D create(){ + Convolution3D declaration = new Convolution3D(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From bf62a573204d1d1f8526659077ebe3d5652f01d1 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:11:40 +0200 Subject: [PATCH 11/92] Adds the 3D up convolution layer class and name in predefinedLayers --- .../predefined/AllPredefinedLayers.java | 13 +--- .../cnnarch/predefined/UpConvolution3D.java | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 7d29baf..df92ce4 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -63,6 +63,7 @@ public class AllPredefinedLayers { public static final String ThreeDConvolution_Name = "3DConvolution"; public static final String THREED_CONVOLUTION_Name = "3DConvolution"; public static final String CONVOLUTION3D_Name = "3DConvolution"; + public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -201,17 +202,9 @@ public class AllPredefinedLayers { LoadNetwork.create(), DotProductSelfAttention.create(), LargeMemory.create(), -<<<<<<< HEAD - EpisodicMemory.create()); - -======= EpisodicMemory.create(), -<<<<<<< HEAD - ThreeDConvolution.create()); ->>>>>>> Renames 3DConvolution to ThreeDConvolution -======= - Convolution3D.create()); ->>>>>>> Renames ThreeDConvolution to Convolution3D + Convolution3D.create() + UpConvolution3D.create()); } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java new file mode 100644 index 0000000..6e0d7d3 --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -0,0 +1,68 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class UpConvolution3D extends PredefinedLayerDeclaration { + + private UpConvolution3D() { + super(AllPredefinedLayers.UP_CONVOLUTION3D_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + return computeUpConvOutputShape(inputTypes.get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + } + + public static UpConvolution3D create(){ + UpConvolution3D declaration = new UpConvolution3D(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.TRANSPADDING_NAME) + .constraints(Constraints.TRANSPADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 24d89fff0e55cc2bc0c4e634f0981488552164fd Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:12:14 +0200 Subject: [PATCH 12/92] Fix small syntax bug --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index df92ce4..df69d22 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -203,7 +203,7 @@ public class AllPredefinedLayers { DotProductSelfAttention.create(), LargeMemory.create(), EpisodicMemory.create(), - Convolution3D.create() + Convolution3D.create(), UpConvolution3D.create()); } -- GitLab From 5c904bae3083aa94ef6e1ee0da58ff0833e78a7d Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 4 May 2021 09:03:08 +0200 Subject: [PATCH 13/92] Fix bug --- .../monticar/cnnarch/predefined/AllPredefinedLayers.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index df69d22..c5216c6 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,10 +60,8 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; - public static final String ThreeDConvolution_Name = "3DConvolution"; - public static final String THREED_CONVOLUTION_Name = "3DConvolution"; - public static final String CONVOLUTION3D_Name = "3DConvolution"; - public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; + public static final String CONVOLUTION3D_NAME = "3DConvolution"; + public static final String UP_CONVOLUTION3D_NAME = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From f31b7e067805e60e78409351c555fe95fde237b7 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 14 May 2021 17:28:03 +0200 Subject: [PATCH 14/92] I dont exactly know whats in here --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8f382a0..a1ffdff 100644 --- a/pom.xml +++ b/pom.xml @@ -19,8 +19,7 @@ de.monticore.lang.monticar cnn-arch - 0.4.6-SNAPSHOT - + 0.4.7-SNAPSHOT -- GitLab From 56c7eaca1d3a2fa4f55addc8fefa9369f3746c52 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 15 May 2021 19:21:23 +0200 Subject: [PATCH 15/92] Fixes --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index c5216c6..ed77fa8 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,8 +60,8 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; - public static final String CONVOLUTION3D_NAME = "3DConvolution"; - public static final String UP_CONVOLUTION3D_NAME = "3DConvolution"; + public static final String CONVOLUTION3D_NAME = "Convolution3D"; + public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 27016996472420c3048f23af40167b3c8fd512e2 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 26 May 2021 15:35:23 +0200 Subject: [PATCH 16/92] Adds the depth dimension for 3d data --- .../cnnarch/_symboltable/ArchTypeSymbol.java | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index 908fe20..ee90bd4 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -28,6 +28,7 @@ public class ArchTypeSymbol extends CommonSymbol { private int channelIndex = -1; private int heightIndex = -1; private int widthIndex = -1; + private int depthIndex = -1; private List dimensions = new ArrayList<>(); public ArchTypeSymbol() { @@ -88,7 +89,15 @@ public class ArchTypeSymbol extends CommonSymbol { public void setChannelIndex(int channelIndex) { this.channelIndex = channelIndex; } - +//NEW + public int getDepthIndex(){ + return depthIndex; + } + + public void setDepthIndex(int depthIndex){ + this.depthIndex = depthIndex; + } +//END NEW public ArchSimpleExpressionSymbol getHeightSymbol() { if (getHeightIndex() == -1){ return ArchSimpleExpressionSymbol.of(1); @@ -110,6 +119,19 @@ public class ArchTypeSymbol extends CommonSymbol { return getDimensionSymbols().get(getChannelIndex()); } +//NEW + public ArchSimpleExpressionSymbol getDepthSymbol() { + if (getDepthIndex() == -1){ + return ArchSimpleExpressionSymbol.of(1); + } + return getDimensionSymbols().get(getDepthIndex()); + } + + public Integer getDepth(){ + return getDepthSymbol().getIntValue().get(); + } +//END NEW + public Integer getWidth(){ return getWidthSymbol().getIntValue().get(); } @@ -139,7 +161,7 @@ public class ArchTypeSymbol extends CommonSymbol { } public List getDimensions(){ - List dimensionList = new ArrayList<>(3); + List dimensionList = new ArrayList<>(4); for (ArchSimpleExpressionSymbol exp : getDimensionSymbols()){ dimensionList.add(exp.getIntValue().get()); } @@ -232,6 +254,7 @@ public class ArchTypeSymbol extends CommonSymbol { private int height = 1; private int width = 1; private int channels = 1; + private int depth = 0; private ASTElementType domain = null; public Builder height(int height){ @@ -246,6 +269,10 @@ public class ArchTypeSymbol extends CommonSymbol { this.channels = channels; return this; } + public Builder depth(int depth){ + this.depth = depth; + return this; + } public Builder elementType(ASTElementType domain){ this.domain = domain; return this; @@ -274,7 +301,8 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setChannelIndex(0); sym.setHeightIndex(1); sym.setWidthIndex(2); - sym.setDimensions(Arrays.asList(channels, height, width)); + sym.setDepthIndex(3); + sym.setDimensions(Arrays.asList(channels, height, width, depth)); if (domain == null){ domain = new ASTElementType(); -- GitLab From a5acf395da6daca79b2dd3d67b94d0bf083935c6 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 28 May 2021 11:31:54 +0200 Subject: [PATCH 17/92] Adds computeOutputShapewithPadding for 3d Data --- .../cnnarch/_symboltable/Constraints.java | 4 +- .../PredefinedLayerDeclaration.java | 132 ++++++++++++++++++ .../predefined/AllPredefinedLayers.java | 2 + 3 files changed, 137 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java index 41d487d..ff33f8c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java @@ -193,7 +193,9 @@ public enum Constraints { if (optString.isPresent()){ if (optString.get().equals(AllPredefinedLayers.PADDING_VALID) || optString.get().equals(AllPredefinedLayers.PADDING_SAME) - || optString.get().equals(AllPredefinedLayers.PADDING_NO_LOSS)){ + || optString.get().equals(AllPredefinedLayers.PADDING_NO_LOSS) + || optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D)){ return true; } } diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index 355ad37..ff8be0c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -165,6 +165,10 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol return computeOutputShapeWithValidPadding(inputType, method, channels); } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_NO_LOSS)) { return computeOutputShapeWithNoLossPadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES + return computeOutputShapeWithSamePadding3D(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ + return computeOutputShapeWithValidPadding3D (inputType, method, channels); } else { throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); } @@ -177,6 +181,10 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol return computeUpConvOutputShapeWithSamePadding(inputType, method, channels); } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID)) { return computeUpConvOutputShapeWithValidPadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES + return computeUpConvOutputShapeWithSamePadding3D(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ + return computeUpConvOutputShapeWithValidPadding3D (inputType, method, channels); } else { throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); } @@ -190,6 +198,130 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } layer.setIntValue(AllPredefinedLayers.SIZE_NAME, outputChannels); } +//NEW + private static List computeOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { + outputWidth = 0; + outputHeight = 0; + outputDepth = 0; + } else { + outputWidth = (inputWidth + strideWidth - 1) / strideWidth; + outputHeight = (inputHeight + strideWidth - 1) / strideHeight; + outputDepth = (inputDepth + strideDepth - 1) / strideDepth; + } + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels) { + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { + outputWidth = 0; + outputHeight = 0; + outputDepth = 0; + } else { + outputWidth = 1 + (inputWidth - kernelWidth) / strideWidth; + outputHeight = 1 + (inputHeight - kernelHeight) / strideHeight; + outputDepth = 1 + (inputDepth - kernelDepth) / strideDepth; + } + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeUpConvOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + + outputWidth = inputWidth * strideWidth; + outputHeight = inputHeight * strideHeight; + outputDepth = inputDepth * strideDepth; + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeUpConvOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + + outputWidth = (inputWidth - 1) * strideWidth + kernelWidth; + outputHeight = (inputHeight - 1) * strideHeight + kernelHeight; + outputDepth = (inputDepth - 1) * strideDepth + kernelDepth; + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + +//END NEW //padding with border_mode=valid, no padding diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index ed77fa8..7913d26 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -146,6 +146,8 @@ public class AllPredefinedLayers { public static final String PADDING_VALID = "valid"; public static final String PADDING_SAME = "same"; public static final String PADDING_NO_LOSS = "no_loss"; + public static final String PADDING_VALID3D = "valid3d"; + public static final String PADDING_SAME3D = "same3d"; public static final String POOL_MAX = "max"; public static final String POOL_AVG = "avg"; public static final String RANDOM = "random"; -- GitLab From 267821720d81aca97e77064ef4e0cfafd022fdc2 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 12:17:19 +0200 Subject: [PATCH 18/92] Fixes Stride and Padding being incorrect --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 4 ++-- .../lang/monticar/cnnarch/predefined/UpConvolution3D.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index af18fbe..3603736 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -48,7 +48,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.STRIDE_NAME) .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) + .defaultValue(Arrays.asList(1, 1, 1)) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.NOBIAS_NAME) @@ -58,7 +58,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.PADDING_NAME) .constraints(Constraints.PADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) + .defaultValue(AllPredefinedLayers.PADDING_SAME3D) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.GROUPS_NAME) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java index 6e0d7d3..01460ff 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -45,7 +45,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.STRIDE_NAME) .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) + .defaultValue(Arrays.asList(1, 1, 1)) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.NOBIAS_NAME) @@ -55,7 +55,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.TRANSPADDING_NAME) .constraints(Constraints.TRANSPADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) + .defaultValue(AllPredefinedLayers.PADDING_SAME3D) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.GROUPS_NAME) -- GitLab From 56fae6fa049e8dc6aec13668a2141ddaeb1deeb1 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 13:49:50 +0200 Subject: [PATCH 19/92] Adds Reshape3D layer --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 7913d26..1042c84 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -62,6 +62,7 @@ public class AllPredefinedLayers { public static final String CUSTOM_LAYER = "CustomLayer"; public static final String CONVOLUTION3D_NAME = "Convolution3D"; public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; + public static final String RESHAPE3D_NAME = "Reshape3D"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -204,7 +205,8 @@ public class AllPredefinedLayers { LargeMemory.create(), EpisodicMemory.create(), Convolution3D.create(), - UpConvolution3D.create()); + UpConvolution3D.create(), + Reshape3D.create()); } public static List createUnrollList(){ -- GitLab From 794f19cd7f4f40b8fb70bc4d3b918b55aefaf87e Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 13:58:43 +0200 Subject: [PATCH 20/92] Fix bugs in Reshape3d --- .../cnnarch/predefined/Reshape3D.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java new file mode 100644 index 0000000..e49cae0 --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java @@ -0,0 +1,115 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; +import de.monticore.lang.monticar.cnnarch.helper.ErrorCodes; +import de.se_rwth.commons.logging.Log; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Reshape3D extends PredefinedLayerDeclaration { + + private Reshape3D() { + super(AllPredefinedLayers.RESHAPE3D_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + + List shape = layer.getIntTupleValue(AllPredefinedLayers.SHAPE_NAME).get(); + + int channels = -1; + int height = -1; + int width = -1; + int depth = -1; + + if (shape.size() >= 4) { + width = shape.get(3); + } + + if (shape.size() >= 3) { + height = shape.get(2); + } + + if (shape.size() >=2) { + depth = shape.get(1); + } + + if (shape.size() >= 1) { + channels = shape.get(0); + } else { + Log.error("0" + ErrorCodes.ILLEGAL_PARAMETER_VALUE + "\"Shape\" argument needs to contain at least one entry" + , layer.getSourcePosition()); + } + + int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); + int newTotalSize = shape.stream().reduce(1, (x, y, z) -> x * y * z); + + if (totalSize != newTotalSize && newTotalSize != 0) { + Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + "The input of Reshape layer cannot be reshaped to the given shape. " + + "Source and target shape have a different amount of total values", layer.getSourcePosition()); + } + + if (newTotalSize != 0) { + + if (width != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .height(height) + .width(width) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } else if (height != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .height(height) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } else if (depth != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } + else{ + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } + } + return Collections.emptyList(); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + } + + public static Reshape3D create(){ + Reshape3D declaration = new Reshape3D(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.SHAPE_NAME) + .constraints(Constraints.INTEGER_TUPLE) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From e33ff07a43ed275d23cdae404705555aeda6ff04 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 5 Jun 2021 11:57:08 +0200 Subject: [PATCH 21/92] Change checks for 3d values --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 3603736..0bd876a 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -23,7 +23,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { // TODO check here - return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + return computeConvAndPoolOutputShape3D(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } @@ -31,7 +31,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { errorIfInputSizeIsNotOne(inputTypes, layer); - errorIfInputSmallerThanKernel(inputTypes, layer); + errorIfInputSmallerThanKernel3D(inputTypes, layer); } public static Convolution3D create(){ -- GitLab From 644e0e6654654b98b103f2d3a1d397b2ea57d849 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 5 Jun 2021 11:58:20 +0200 Subject: [PATCH 22/92] Remake a change --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 0bd876a..5a0dd73 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -23,7 +23,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { // TODO check here - return computeConvAndPoolOutputShape3D(layer.getInputTypes().get(0), + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } -- GitLab From 9286fce065fa9bc0240928f6319a3d318228d88a Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 15 Jun 2021 18:33:35 +0200 Subject: [PATCH 23/92] Makes RelU and Sigmoid able to handle 3d data --- .../cnnarch/_symboltable/ArchTypeSymbol.java | 34 ++++- .../CNNArchSymbolTableCreator.java | 16 ++- .../cnnarch/_symboltable/Constraints.java | 15 ++- .../PredefinedLayerDeclaration.java | 119 ++++++++++++------ .../cnnarch/predefined/LeakyRelu.java | 28 +++-- .../monticar/cnnarch/predefined/Relu.java | 26 ++-- .../monticar/cnnarch/predefined/Reshape.java | 2 +- .../cnnarch/predefined/Reshape3D.java | 7 +- .../monticar/cnnarch/predefined/Sigmoid.java | 28 +++-- .../cnnarch/predefined/UpConvolution3D.java | 2 +- 10 files changed, 199 insertions(+), 78 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index ee90bd4..b737c89 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -94,8 +94,8 @@ public class ArchTypeSymbol extends CommonSymbol { return depthIndex; } - public void setDepthIndex(int depthIndex){ - this.depthIndex = depthIndex; + public void setDepthIndex(int depthIndexi){ + this.depthIndex = depthIndexi; } //END NEW public ArchSimpleExpressionSymbol getHeightSymbol() { @@ -122,6 +122,7 @@ public class ArchTypeSymbol extends CommonSymbol { //NEW public ArchSimpleExpressionSymbol getDepthSymbol() { if (getDepthIndex() == -1){ + java.lang.System.out.println("Depth Index is -1"); return ArchSimpleExpressionSymbol.of(1); } return getDimensionSymbols().get(getDepthIndex()); @@ -161,7 +162,7 @@ public class ArchTypeSymbol extends CommonSymbol { } public List getDimensions(){ - List dimensionList = new ArrayList<>(4); + List dimensionList = new ArrayList<>(); for (ArchSimpleExpressionSymbol exp : getDimensionSymbols()){ dimensionList.add(exp.getIntValue().get()); } @@ -241,6 +242,7 @@ public class ArchTypeSymbol extends CommonSymbol { copy.setWidthIndex(getWidthIndex()); copy.setChannelIndex(getChannelIndex()); copy.setHeightIndex(getHeightIndex()); + copy.setDepthIndex(getDepthIndex()); List dimensionCopies = new ArrayList<>(); for (ArchSimpleExpressionSymbol dimension : getDimensionSymbols()){ dimensionCopies.add(dimension.preResolveDeepCopy()); @@ -250,11 +252,17 @@ public class ArchTypeSymbol extends CommonSymbol { return copy; } + public void printDimensions(){ + for (ArchSimpleExpressionSymbol dimension : getDimensionSymbols()){ + System.out.println("From Dimension list: " + dimension.getTextualRepresentation()); + } + } + public static class Builder{ private int height = 1; private int width = 1; private int channels = 1; - private int depth = 0; + private int depth = 1; private ASTElementType domain = null; public Builder height(int height){ @@ -301,8 +309,21 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setChannelIndex(0); sym.setHeightIndex(1); sym.setWidthIndex(2); - sym.setDepthIndex(3); - sym.setDimensions(Arrays.asList(channels, height, width, depth)); + + Integer test = new Integer(this.depth); + Integer test2 = new Integer(sym.getDepth()); + System.out.println("Depth in builder is: " + test.toString() + " and depth is: " + test2.toString()); + if (this.depth != 1){ + sym.setHeightIndex(2); + sym.setWidthIndex(3); + sym.setDepthIndex(1); + sym.setDimensions(Arrays.asList(channels, depth, height, width)); //Dimensions are in this order for mxnet + sym.printDimensions(); + } + + else { + sym.setDimensions(Arrays.asList(channels, height, width)); + } if (domain == null){ domain = new ASTElementType(); @@ -311,5 +332,6 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setDomain(domain); return sym; } + } } diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java index 22815b0..365f297 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java @@ -285,29 +285,37 @@ public class CNNArchSymbolTableCreator extends de.monticore.symboltable.CommonSy ArchTypeSymbol sym = new ArchTypeSymbol(); addToScopeAndLinkWithNode(sym, ast); } - +//NEW @Override public void endVisit(ASTArchType node) { ArchTypeSymbol sym = (ArchTypeSymbol) node.getSymbolOpt().get(); List astDimensions = node.getShape().getDimensionsList(); - + Integer size = new Integer(astDimensions.size()); + java.lang.System.out.println("Size of astDimension is: " + size.toString()); if (astDimensions.size() >= 1){ sym.setChannelIndex(0); } if (astDimensions.size() >= 2){ + java.lang.System.out.println("Setting Height Index in CNNArchSymbolTable"); sym.setHeightIndex(1); } if (astDimensions.size() >= 3){ sym.setWidthIndex(2); } - List dimensionList = new ArrayList<>(3); + if (astDimensions.size() >= 4){ + java.lang.System.out.println("Setting Depth Index to 1 in CNNArchSymbolTable"); + sym.setDepthIndex(1); + sym.setHeightIndex(2); + sym.setWidthIndex(3); + } + List dimensionList = new ArrayList<>(4); for (ASTArchSimpleExpression astExp : astDimensions){ dimensionList.add((ArchSimpleExpressionSymbol) astExp.getSymbolOpt().get()); } sym.setDimensionSymbols(dimensionList); sym.setDomain(node.getElementType()); } - +//END NEW @Override public void visit(ASTLayerDeclaration ast) { LayerDeclarationSymbol layerDeclaration = new LayerDeclarationSymbol(ast.getName()); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java index ff33f8c..6ba58ae 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java @@ -204,8 +204,9 @@ public enum Constraints { @Override protected String msgString() { return AllPredefinedLayers.PADDING_VALID + ", " - + AllPredefinedLayers.PADDING_SAME + " or " - + AllPredefinedLayers.PADDING_NO_LOSS; + + AllPredefinedLayers.PADDING_SAME + ", " + + AllPredefinedLayers.PADDING_NO_LOSS + " or " + + AllPredefinedLayers.PADDING_SAME3D; } }, TRANSPADDING_TYPE { @@ -214,7 +215,9 @@ public enum Constraints { Optional optString= exp.getStringValue(); if (optString.isPresent()){ if (optString.get().equals(AllPredefinedLayers.PADDING_VALID) - || optString.get().equals(AllPredefinedLayers.PADDING_SAME)) { + || optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D)) { return true; } } @@ -222,8 +225,10 @@ public enum Constraints { } @Override protected String msgString() { - return AllPredefinedLayers.PADDING_VALID + "or " - + AllPredefinedLayers.PADDING_SAME; + return AllPredefinedLayers.PADDING_VALID + ", " + + AllPredefinedLayers.PADDING_SAME + " or " + + AllPredefinedLayers.PADDING_SAME3D + " or " + + AllPredefinedLayers.PADDING_VALID3D; } }, POOL_TYPE { diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index ff8be0c..4261000 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -130,12 +130,57 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } } } +//NEW + protected void errorIfInputDepthIsInvalid(List inputTypes, LayerSymbol layer, int depth){ + for (ArchTypeSymbol inputType : inputTypes) { + if (inputType.getDepth() != depth){ + Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + " Invalid layer input. Input depth is " + + inputType.getDepth() + " but needs to be " + depth + ".", layer.getSourcePosition()); + } + } + } + + protected static void errorIfInputSmallerThanKernel3D(List inputTypes, LayerSymbol layer){ + if (!inputTypes.isEmpty()) { + int inputHeight = inputTypes.get(0).getHeight(); + int inputWidth = inputTypes.get(0).getWidth(); + int inputDepth = inputTypes.get(0).getDepth(); + Integer depthI = new Integer(inputTypes.get(0).getDepthIndex()); + //System.out.println("Depth Index is: " + depthI.toString() + " in PredefinedLayerDecl"); + + int kernelHeight = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + + if (kernelHeight > inputHeight || kernelWidth > inputWidth || kernelDepth > inputDepth) { + if (layer.getStringValue(AllPredefinedLayers.PADDING_NAME).equals(AllPredefinedLayers.PADDING_VALID3D)) { + Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + " Invalid layer input. " + + "The input resolution is smaller than the kernel and the padding mode is 'valid'." + + "This would result in an output resolution of 0x0." + , layer.getSourcePosition()); + } else { + Integer height = new Integer(kernelHeight); + Integer width = new Integer(kernelWidth); + Integer depth = new Integer(kernelDepth); + Integer iheight = new Integer(inputHeight); + Integer iwidth = new Integer(inputWidth); + Integer idepth = new Integer(inputDepth); + Log.warn("The input resolution is smaller than the kernel. " + height.toString() + " " + width.toString() + " " + depth.toString() + " " + iheight.toString() + " " + iwidth.toString() + " " + idepth.toString() + " " + + "This results in an output resolution of 1x1. " + "Depth Index is: " + depthI.toString() + " " + + "If this warning appears multiple times, consider changing your architecture" + , layer.getSourcePosition()); + } + } + } + } +//END NEW //check input for convolution and pooling protected static void errorIfInputSmallerThanKernel(List inputTypes, LayerSymbol layer) { if (!inputTypes.isEmpty()) { int inputHeight = inputTypes.get(0).getHeight(); int inputWidth = inputTypes.get(0).getWidth(); + int kernelHeight = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int kernelWidth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); @@ -146,12 +191,16 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol "This would result in an output resolution of 0x0." , layer.getSourcePosition()); } else { - Log.warn("The input resolution is smaller than the kernel. " + + Integer height = new Integer(kernelHeight); + Integer width = new Integer(kernelWidth); + Integer iheight = new Integer(inputHeight); + Integer iwidth = new Integer(inputWidth); + Log.warn("The input resolution is smaller than the kernel. " + height.toString() + " " + width.toString() + " " + iheight.toString() + " " + iwidth.toString() + " " + "This results in an output resolution of 1x1. " + "If this warning appears multiple times, consider changing your architecture" , layer.getSourcePosition()); } - } + } } } @@ -200,28 +249,19 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } //NEW private static List computeOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); - int outputWidth; - int outputHeight; - int outputDepth; - if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { - outputWidth = 0; - outputHeight = 0; - outputDepth = 0; - } else { - outputWidth = (inputWidth + strideWidth - 1) / strideWidth; - outputHeight = (inputHeight + strideWidth - 1) / strideHeight; - outputDepth = (inputDepth + strideDepth - 1) / strideDepth; - } + int outputWidth = (inputWidth + strideWidth - 1) / strideWidth; + int outputHeight = (inputHeight + strideWidth - 1) / strideHeight; + int outputDepth = (inputDepth + strideDepth - 1) / strideDepth; return Collections.singletonList(new ArchTypeSymbol.Builder() .height(outputHeight) @@ -233,12 +273,12 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels) { - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); @@ -266,12 +306,9 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeUpConvOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); @@ -280,10 +317,16 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int outputHeight; int outputDepth; + //Integer iDepth = new Integer(inputDepth); + //Integer stride = new Integer(strideDepth); + outputWidth = inputWidth * strideWidth; outputHeight = inputHeight * strideHeight; outputDepth = inputDepth * strideDepth; + //Integer oDepth = new Integer(outputDepth); + //System.out.println("In computeUpConvShape: " + iDepth.toString() + " " + stride.toString() + " " + oDepth.toString()); + return Collections.singletonList(new ArchTypeSymbol.Builder() .height(outputHeight) .width(outputWidth) @@ -294,12 +337,12 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeUpConvOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java index abd1d0c..34a7f91 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java @@ -22,13 +22,27 @@ public class LeakyRelu extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(layer.getInputTypes().get(0).getChannels()) - .height(layer.getInputTypes().get(0).getHeight()) - .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "oo") - .build()); + Integer test = new Integer(inputTypes.get(0).getDepthIndex()); + System.out.println("Depth Index in LeakyRelu is: " + test.toString()); + if (inputTypes.get(0).getDepthIndex() == -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .elementType("0", "oo") + .build()); + } + else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType("0", "oo") + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java index 321c886..2954e04 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java @@ -25,13 +25,25 @@ public class Relu extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(layer.getInputTypes().get(0).getChannels()) - .height(layer.getInputTypes().get(0).getHeight()) - .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "oo") - .build()); + if (inputTypes.get(0).getDepthIndex() == -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .elementType("0", "oo") + .build()); + } + else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType("0", "oo") + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java index 83eea2d..79d286b 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java @@ -30,7 +30,7 @@ public class Reshape extends PredefinedLayerDeclaration { int channels = -1; int height = -1; int width = -1; - + int depth = -1; if (shape.size() >= 3) { width = shape.get(2); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java index e49cae0..4469fa7 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java @@ -52,11 +52,14 @@ public class Reshape3D extends PredefinedLayerDeclaration { } int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); - int newTotalSize = shape.stream().reduce(1, (x, y, z) -> x * y * z); + int newTotalSize = shape.stream().reduce(1, (x, y) -> x * y); if (totalSize != newTotalSize && newTotalSize != 0) { + Integer nts = new Integer(newTotalSize); + Integer ts = new Integer(totalSize); Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + "The input of Reshape layer cannot be reshaped to the given shape. " - + "Source and target shape have a different amount of total values", layer.getSourcePosition()); + + "Source and target shape have a different amount of total values " + + " newTotalSize = " + nts.toString() + " and totalSize = " + ts.toString(), layer.getSourcePosition()); } if (newTotalSize != 0) { diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java index 8bd782e..8350b2c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java @@ -25,13 +25,27 @@ public class Sigmoid extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(layer.getInputTypes().get(0).getChannels()) - .height(layer.getInputTypes().get(0).getHeight()) - .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "1") - .build()); + Integer test = new Integer(inputTypes.get(0).getDepthIndex()); + System.out.println("Depth Index in Sigmoid is: " + test.toString()); + if (inputTypes.get(0).getDepthIndex() == -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .elementType("0", "oo") + .build()); + } + else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType("0", "oo") + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java index 01460ff..5b39378 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -21,7 +21,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return computeUpConvOutputShape(inputTypes.get(0), + return computeUpConvOutputShape(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } -- GitLab From c670c7ba4bd33513219104d3259763c37ee0c39f Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 14:59:02 +0200 Subject: [PATCH 24/92] creates the 3DConvolution class and adds the name of the 3DConv layer to the AllPredefinedLayers class --- .../cnnarch/predefined/3DConvolution.java | 71 +++++++++++++++++++ .../predefined/AllPredefinedLayers.java | 1 + 2 files changed, 72 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java new file mode 100644 index 0000000..f11695f --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java @@ -0,0 +1,71 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class 3DConvolution extends PredefinedLayerDeclaration { + + private 3DConvolution() { + super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + // TODO check here + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + errorIfInputSmallerThanKernel(inputTypes, layer); + } + + public static 3DConvolution create(){ + 3DConvolution declaration = new 3DConvolution(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.PADDING_NAME) + .constraints(Constraints.PADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index ff0a2e3..5383b9f 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,6 +60,7 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; + public static final String ThreeDConvolution_Name = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 6c11bcab287a54f742e39e2d53bf2ea6eeb4ffa7 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:03:40 +0200 Subject: [PATCH 25/92] Renames 3DConvolution to ThreeDConvolution --- .../cnnarch/predefined/AllPredefinedLayers.java | 5 +++++ .../{3DConvolution.java => ThreeDConvolution.java} | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{3DConvolution.java => ThreeDConvolution.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 5383b9f..03beb88 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -199,8 +199,13 @@ public class AllPredefinedLayers { LoadNetwork.create(), DotProductSelfAttention.create(), LargeMemory.create(), +<<<<<<< HEAD EpisodicMemory.create()); +======= + EpisodicMemory.create(), + ThreeDConvolution.create()); +>>>>>>> Renames 3DConvolution to ThreeDConvolution } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java index f11695f..9d68770 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class 3DConvolution extends PredefinedLayerDeclaration { +public class ThreeDConvolution extends PredefinedLayerDeclaration { - private 3DConvolution() { - super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + private ThreeDConvolution() { + super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); } @Override @@ -34,8 +34,8 @@ public class 3DConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static 3DConvolution create(){ - 3DConvolution declaration = new 3DConvolution(); + public static ThreeDConvolution create(){ + ThreeDConvolution declaration = new ThreeDConvolution(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From ce1e419949b63a7b97c3068a512d04a65d207e81 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:36:49 +0200 Subject: [PATCH 26/92] Renames ThreeDConvolution to Convolution3D --- .../cnnarch/predefined/AllPredefinedLayers.java | 7 ++++++- .../{ThreeDConvolution.java => Convolution3D.java} | 10 +++++----- 2 files changed, 11 insertions(+), 6 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{ThreeDConvolution.java => Convolution3D.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 03beb88..61c5c70 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,7 +60,8 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; - public static final String ThreeDConvolution_Name = "3DConvolution"; + public static final String CONVOLUTION3D_Name = "3DConvolution"; + //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -204,8 +205,12 @@ public class AllPredefinedLayers { ======= EpisodicMemory.create(), +<<<<<<< HEAD ThreeDConvolution.create()); >>>>>>> Renames 3DConvolution to ThreeDConvolution +======= + Convolution3D.create()); +>>>>>>> Renames ThreeDConvolution to Convolution3D } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 9d68770..af18fbe 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class ThreeDConvolution extends PredefinedLayerDeclaration { +public class Convolution3D extends PredefinedLayerDeclaration { - private ThreeDConvolution() { - super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); + private Convolution3D() { + super(AllPredefinedLayers.CONVOLUTION3D_NAME); } @Override @@ -34,8 +34,8 @@ public class ThreeDConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static ThreeDConvolution create(){ - ThreeDConvolution declaration = new ThreeDConvolution(); + public static Convolution3D create(){ + Convolution3D declaration = new Convolution3D(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From 7738e29d9dc9688777ae018a53bd2a65f2a0e000 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:11:40 +0200 Subject: [PATCH 27/92] Adds the 3D up convolution layer class and name in predefinedLayers --- .../predefined/AllPredefinedLayers.java | 13 +--- .../cnnarch/predefined/UpConvolution3D.java | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 61c5c70..d01e605 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -61,6 +61,7 @@ public class AllPredefinedLayers { public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; public static final String CONVOLUTION3D_Name = "3DConvolution"; + public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; //replay layers @@ -200,17 +201,9 @@ public class AllPredefinedLayers { LoadNetwork.create(), DotProductSelfAttention.create(), LargeMemory.create(), -<<<<<<< HEAD - EpisodicMemory.create()); - -======= EpisodicMemory.create(), -<<<<<<< HEAD - ThreeDConvolution.create()); ->>>>>>> Renames 3DConvolution to ThreeDConvolution -======= - Convolution3D.create()); ->>>>>>> Renames ThreeDConvolution to Convolution3D + Convolution3D.create() + UpConvolution3D.create()); } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java new file mode 100644 index 0000000..6e0d7d3 --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -0,0 +1,68 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class UpConvolution3D extends PredefinedLayerDeclaration { + + private UpConvolution3D() { + super(AllPredefinedLayers.UP_CONVOLUTION3D_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + return computeUpConvOutputShape(inputTypes.get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + } + + public static UpConvolution3D create(){ + UpConvolution3D declaration = new UpConvolution3D(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.TRANSPADDING_NAME) + .constraints(Constraints.TRANSPADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 645e364e28dd2141e1c81b7e1f7c7d6b3f00007b Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:12:14 +0200 Subject: [PATCH 28/92] Fix small syntax bug --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index d01e605..97a7328 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -202,7 +202,7 @@ public class AllPredefinedLayers { DotProductSelfAttention.create(), LargeMemory.create(), EpisodicMemory.create(), - Convolution3D.create() + Convolution3D.create(), UpConvolution3D.create()); } -- GitLab From b434f8991a8b7a8f1672b31f8cf22c668e19c432 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 14 May 2021 17:28:03 +0200 Subject: [PATCH 29/92] I dont exactly know whats in here --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8f382a0..302eb8a 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,8 @@ de.monticore.lang.monticar cnn-arch - 0.4.6-SNAPSHOT + 0.4.7-SNAPSHOT + -- GitLab From efec99b3fdd1f881bba2a3849157a70c2529b0ef Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 14:59:02 +0200 Subject: [PATCH 30/92] creates the 3DConvolution class and adds the name of the 3DConv layer to the AllPredefinedLayers class --- .../cnnarch/predefined/3DConvolution.java | 71 +++++++++++++++++++ .../predefined/AllPredefinedLayers.java | 1 - 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java new file mode 100644 index 0000000..f11695f --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java @@ -0,0 +1,71 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class 3DConvolution extends PredefinedLayerDeclaration { + + private 3DConvolution() { + super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + // TODO check here + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + errorIfInputSmallerThanKernel(inputTypes, layer); + } + + public static 3DConvolution create(){ + 3DConvolution declaration = new 3DConvolution(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.PADDING_NAME) + .constraints(Constraints.PADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 97a7328..a510452 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -63,7 +63,6 @@ public class AllPredefinedLayers { public static final String CONVOLUTION3D_Name = "3DConvolution"; public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; - //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; public static final String EPISODIC_MEMORY_NAME = "EpisodicMemory"; -- GitLab From 303f93f277562009c484b5337e1b319a09690176 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:03:40 +0200 Subject: [PATCH 31/92] Renames 3DConvolution to ThreeDConvolution --- .../cnnarch/predefined/AllPredefinedLayers.java | 2 ++ .../{3DConvolution.java => ThreeDConvolution.java} | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{3DConvolution.java => ThreeDConvolution.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index a510452..635609c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -63,6 +63,7 @@ public class AllPredefinedLayers { public static final String CONVOLUTION3D_Name = "3DConvolution"; public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; + //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; public static final String EPISODIC_MEMORY_NAME = "EpisodicMemory"; @@ -203,6 +204,7 @@ public class AllPredefinedLayers { EpisodicMemory.create(), Convolution3D.create(), UpConvolution3D.create()); + } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java index f11695f..9d68770 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class 3DConvolution extends PredefinedLayerDeclaration { +public class ThreeDConvolution extends PredefinedLayerDeclaration { - private 3DConvolution() { - super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + private ThreeDConvolution() { + super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); } @Override @@ -34,8 +34,8 @@ public class 3DConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static 3DConvolution create(){ - 3DConvolution declaration = new 3DConvolution(); + public static ThreeDConvolution create(){ + ThreeDConvolution declaration = new ThreeDConvolution(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From 9886032868126207f31e4da150816c024ab60587 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:36:49 +0200 Subject: [PATCH 32/92] Renames ThreeDConvolution to Convolution3D --- .../cnnarch/predefined/ThreeDConvolution.java | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java deleted file mode 100644 index 9d68770..0000000 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * - * (c) https://github.com/MontiCore/monticore - * - * The license generally applicable for this project - * can be found under https://github.com/MontiCore/monticore. - */ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.lang.monticar.cnnarch.predefined; - -import de.monticore.lang.monticar.cnnarch._symboltable.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ThreeDConvolution extends PredefinedLayerDeclaration { - - private ThreeDConvolution() { - super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); - } - - @Override - public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - // TODO check here - return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), - layer, - layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); - } - - @Override - public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - errorIfInputSizeIsNotOne(inputTypes, layer); - errorIfInputSmallerThanKernel(inputTypes, layer); - } - - public static ThreeDConvolution create(){ - ThreeDConvolution declaration = new ThreeDConvolution(); - List parameters = new ArrayList<>(Arrays.asList( - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.KERNEL_NAME) - .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.CHANNELS_NAME) - .constraints(Constraints.INTEGER, Constraints.POSITIVE) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.STRIDE_NAME) - .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.NOBIAS_NAME) - .constraints(Constraints.BOOLEAN) - .defaultValue(false) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.PADDING_NAME) - .constraints(Constraints.PADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.GROUPS_NAME) - .constraints(Constraints.INTEGER, Constraints.POSITIVE) - .defaultValue(1) - .build())); - declaration.setParameters(parameters); - return declaration; - } -} -- GitLab From b8cada1768bd70145e44c3e752c4c9a83269b8f7 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 14 May 2021 17:28:03 +0200 Subject: [PATCH 33/92] I dont exactly know whats in here --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 302eb8a..d20c11b 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,6 @@ 0.4.7-SNAPSHOT - -- GitLab From d09b12e549026295e05bbee53f20674b35b5b19e Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 15 May 2021 19:21:23 +0200 Subject: [PATCH 34/92] Fixes --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 635609c..ae865c9 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,8 +60,8 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; - public static final String CONVOLUTION3D_Name = "3DConvolution"; - public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; + public static final String CONVOLUTION3D_NAME = "Convolution3D"; + public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; //replay layers -- GitLab From b09e66ce945f5a5f73270d9988f0d8a4e4435743 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 26 May 2021 15:35:23 +0200 Subject: [PATCH 35/92] Adds the depth dimension for 3d data --- .../cnnarch/_symboltable/ArchTypeSymbol.java | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index 908fe20..ee90bd4 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -28,6 +28,7 @@ public class ArchTypeSymbol extends CommonSymbol { private int channelIndex = -1; private int heightIndex = -1; private int widthIndex = -1; + private int depthIndex = -1; private List dimensions = new ArrayList<>(); public ArchTypeSymbol() { @@ -88,7 +89,15 @@ public class ArchTypeSymbol extends CommonSymbol { public void setChannelIndex(int channelIndex) { this.channelIndex = channelIndex; } - +//NEW + public int getDepthIndex(){ + return depthIndex; + } + + public void setDepthIndex(int depthIndex){ + this.depthIndex = depthIndex; + } +//END NEW public ArchSimpleExpressionSymbol getHeightSymbol() { if (getHeightIndex() == -1){ return ArchSimpleExpressionSymbol.of(1); @@ -110,6 +119,19 @@ public class ArchTypeSymbol extends CommonSymbol { return getDimensionSymbols().get(getChannelIndex()); } +//NEW + public ArchSimpleExpressionSymbol getDepthSymbol() { + if (getDepthIndex() == -1){ + return ArchSimpleExpressionSymbol.of(1); + } + return getDimensionSymbols().get(getDepthIndex()); + } + + public Integer getDepth(){ + return getDepthSymbol().getIntValue().get(); + } +//END NEW + public Integer getWidth(){ return getWidthSymbol().getIntValue().get(); } @@ -139,7 +161,7 @@ public class ArchTypeSymbol extends CommonSymbol { } public List getDimensions(){ - List dimensionList = new ArrayList<>(3); + List dimensionList = new ArrayList<>(4); for (ArchSimpleExpressionSymbol exp : getDimensionSymbols()){ dimensionList.add(exp.getIntValue().get()); } @@ -232,6 +254,7 @@ public class ArchTypeSymbol extends CommonSymbol { private int height = 1; private int width = 1; private int channels = 1; + private int depth = 0; private ASTElementType domain = null; public Builder height(int height){ @@ -246,6 +269,10 @@ public class ArchTypeSymbol extends CommonSymbol { this.channels = channels; return this; } + public Builder depth(int depth){ + this.depth = depth; + return this; + } public Builder elementType(ASTElementType domain){ this.domain = domain; return this; @@ -274,7 +301,8 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setChannelIndex(0); sym.setHeightIndex(1); sym.setWidthIndex(2); - sym.setDimensions(Arrays.asList(channels, height, width)); + sym.setDepthIndex(3); + sym.setDimensions(Arrays.asList(channels, height, width, depth)); if (domain == null){ domain = new ASTElementType(); -- GitLab From 2d682997540ea5c35b02c2949927055d79d80509 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 28 May 2021 11:31:54 +0200 Subject: [PATCH 36/92] Adds computeOutputShapewithPadding for 3d Data --- .../cnnarch/_symboltable/Constraints.java | 4 +- .../PredefinedLayerDeclaration.java | 132 ++++++++++++++++++ .../predefined/AllPredefinedLayers.java | 2 + 3 files changed, 137 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java index 41d487d..ff33f8c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java @@ -193,7 +193,9 @@ public enum Constraints { if (optString.isPresent()){ if (optString.get().equals(AllPredefinedLayers.PADDING_VALID) || optString.get().equals(AllPredefinedLayers.PADDING_SAME) - || optString.get().equals(AllPredefinedLayers.PADDING_NO_LOSS)){ + || optString.get().equals(AllPredefinedLayers.PADDING_NO_LOSS) + || optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D)){ return true; } } diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index 355ad37..ff8be0c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -165,6 +165,10 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol return computeOutputShapeWithValidPadding(inputType, method, channels); } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_NO_LOSS)) { return computeOutputShapeWithNoLossPadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES + return computeOutputShapeWithSamePadding3D(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ + return computeOutputShapeWithValidPadding3D (inputType, method, channels); } else { throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); } @@ -177,6 +181,10 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol return computeUpConvOutputShapeWithSamePadding(inputType, method, channels); } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID)) { return computeUpConvOutputShapeWithValidPadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES + return computeUpConvOutputShapeWithSamePadding3D(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ + return computeUpConvOutputShapeWithValidPadding3D (inputType, method, channels); } else { throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); } @@ -190,6 +198,130 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } layer.setIntValue(AllPredefinedLayers.SIZE_NAME, outputChannels); } +//NEW + private static List computeOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { + outputWidth = 0; + outputHeight = 0; + outputDepth = 0; + } else { + outputWidth = (inputWidth + strideWidth - 1) / strideWidth; + outputHeight = (inputHeight + strideWidth - 1) / strideHeight; + outputDepth = (inputDepth + strideDepth - 1) / strideDepth; + } + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels) { + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { + outputWidth = 0; + outputHeight = 0; + outputDepth = 0; + } else { + outputWidth = 1 + (inputWidth - kernelWidth) / strideWidth; + outputHeight = 1 + (inputHeight - kernelHeight) / strideHeight; + outputDepth = 1 + (inputDepth - kernelDepth) / strideDepth; + } + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeUpConvOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + + outputWidth = inputWidth * strideWidth; + outputHeight = inputHeight * strideHeight; + outputDepth = inputDepth * strideDepth; + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeUpConvOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + + outputWidth = (inputWidth - 1) * strideWidth + kernelWidth; + outputHeight = (inputHeight - 1) * strideHeight + kernelHeight; + outputDepth = (inputDepth - 1) * strideDepth + kernelDepth; + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + +//END NEW //padding with border_mode=valid, no padding diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index ae865c9..c4c7956 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -147,6 +147,8 @@ public class AllPredefinedLayers { public static final String PADDING_VALID = "valid"; public static final String PADDING_SAME = "same"; public static final String PADDING_NO_LOSS = "no_loss"; + public static final String PADDING_VALID3D = "valid3d"; + public static final String PADDING_SAME3D = "same3d"; public static final String POOL_MAX = "max"; public static final String POOL_AVG = "avg"; public static final String RANDOM = "random"; -- GitLab From c29763142ffa1348af57e0b959c65b6489c5bd2e Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 12:17:19 +0200 Subject: [PATCH 37/92] Fixes Stride and Padding being incorrect --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 4 ++-- .../lang/monticar/cnnarch/predefined/UpConvolution3D.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index af18fbe..3603736 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -48,7 +48,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.STRIDE_NAME) .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) + .defaultValue(Arrays.asList(1, 1, 1)) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.NOBIAS_NAME) @@ -58,7 +58,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.PADDING_NAME) .constraints(Constraints.PADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) + .defaultValue(AllPredefinedLayers.PADDING_SAME3D) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.GROUPS_NAME) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java index 6e0d7d3..01460ff 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -45,7 +45,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.STRIDE_NAME) .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) + .defaultValue(Arrays.asList(1, 1, 1)) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.NOBIAS_NAME) @@ -55,7 +55,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.TRANSPADDING_NAME) .constraints(Constraints.TRANSPADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) + .defaultValue(AllPredefinedLayers.PADDING_SAME3D) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.GROUPS_NAME) -- GitLab From ac457c31b9d837e5a6deb3a5bef0b06ab4041d41 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 13:49:50 +0200 Subject: [PATCH 38/92] Adds Reshape3D layer --- .../monticar/cnnarch/predefined/AllPredefinedLayers.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index c4c7956..f12f747 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -62,6 +62,7 @@ public class AllPredefinedLayers { public static final String CUSTOM_LAYER = "CustomLayer"; public static final String CONVOLUTION3D_NAME = "Convolution3D"; public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; + public static final String RESHAPE3D_NAME = "Reshape3D"; //replay layers @@ -205,8 +206,8 @@ public class AllPredefinedLayers { LargeMemory.create(), EpisodicMemory.create(), Convolution3D.create(), - UpConvolution3D.create()); - + UpConvolution3D.create(), + Reshape3D.create()); } public static List createUnrollList(){ -- GitLab From 46d9a0401d1e0bf7c813d5ad2504c096b9a6aa87 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 13:58:43 +0200 Subject: [PATCH 39/92] Fix bugs in Reshape3d --- .../cnnarch/predefined/Reshape3D.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java new file mode 100644 index 0000000..e49cae0 --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java @@ -0,0 +1,115 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; +import de.monticore.lang.monticar.cnnarch.helper.ErrorCodes; +import de.se_rwth.commons.logging.Log; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Reshape3D extends PredefinedLayerDeclaration { + + private Reshape3D() { + super(AllPredefinedLayers.RESHAPE3D_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + + List shape = layer.getIntTupleValue(AllPredefinedLayers.SHAPE_NAME).get(); + + int channels = -1; + int height = -1; + int width = -1; + int depth = -1; + + if (shape.size() >= 4) { + width = shape.get(3); + } + + if (shape.size() >= 3) { + height = shape.get(2); + } + + if (shape.size() >=2) { + depth = shape.get(1); + } + + if (shape.size() >= 1) { + channels = shape.get(0); + } else { + Log.error("0" + ErrorCodes.ILLEGAL_PARAMETER_VALUE + "\"Shape\" argument needs to contain at least one entry" + , layer.getSourcePosition()); + } + + int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); + int newTotalSize = shape.stream().reduce(1, (x, y, z) -> x * y * z); + + if (totalSize != newTotalSize && newTotalSize != 0) { + Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + "The input of Reshape layer cannot be reshaped to the given shape. " + + "Source and target shape have a different amount of total values", layer.getSourcePosition()); + } + + if (newTotalSize != 0) { + + if (width != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .height(height) + .width(width) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } else if (height != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .height(height) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } else if (depth != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } + else{ + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } + } + return Collections.emptyList(); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + } + + public static Reshape3D create(){ + Reshape3D declaration = new Reshape3D(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.SHAPE_NAME) + .constraints(Constraints.INTEGER_TUPLE) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 8c5f83717355cf3ff55075d8caa9ba5214e3d85a Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 5 Jun 2021 11:57:08 +0200 Subject: [PATCH 40/92] Change checks for 3d values --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 3603736..0bd876a 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -23,7 +23,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { // TODO check here - return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + return computeConvAndPoolOutputShape3D(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } @@ -31,7 +31,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { errorIfInputSizeIsNotOne(inputTypes, layer); - errorIfInputSmallerThanKernel(inputTypes, layer); + errorIfInputSmallerThanKernel3D(inputTypes, layer); } public static Convolution3D create(){ -- GitLab From 07866bc7d495f7f11a549f0f34f16700a4a57838 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 5 Jun 2021 11:58:20 +0200 Subject: [PATCH 41/92] Remake a change --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 0bd876a..5a0dd73 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -23,7 +23,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { // TODO check here - return computeConvAndPoolOutputShape3D(layer.getInputTypes().get(0), + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } -- GitLab From 7e6dc078f58e0e00fd9a5024301442e83d914314 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 15 Jun 2021 18:33:35 +0200 Subject: [PATCH 42/92] Makes RelU and Sigmoid able to handle 3d data --- .../cnnarch/_symboltable/ArchTypeSymbol.java | 34 ++++- .../CNNArchSymbolTableCreator.java | 16 ++- .../cnnarch/_symboltable/Constraints.java | 15 ++- .../PredefinedLayerDeclaration.java | 119 ++++++++++++------ .../cnnarch/predefined/LeakyRelu.java | 28 +++-- .../monticar/cnnarch/predefined/Relu.java | 26 ++-- .../monticar/cnnarch/predefined/Reshape.java | 2 +- .../cnnarch/predefined/Reshape3D.java | 7 +- .../monticar/cnnarch/predefined/Sigmoid.java | 28 +++-- .../cnnarch/predefined/UpConvolution3D.java | 2 +- 10 files changed, 199 insertions(+), 78 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index ee90bd4..b737c89 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -94,8 +94,8 @@ public class ArchTypeSymbol extends CommonSymbol { return depthIndex; } - public void setDepthIndex(int depthIndex){ - this.depthIndex = depthIndex; + public void setDepthIndex(int depthIndexi){ + this.depthIndex = depthIndexi; } //END NEW public ArchSimpleExpressionSymbol getHeightSymbol() { @@ -122,6 +122,7 @@ public class ArchTypeSymbol extends CommonSymbol { //NEW public ArchSimpleExpressionSymbol getDepthSymbol() { if (getDepthIndex() == -1){ + java.lang.System.out.println("Depth Index is -1"); return ArchSimpleExpressionSymbol.of(1); } return getDimensionSymbols().get(getDepthIndex()); @@ -161,7 +162,7 @@ public class ArchTypeSymbol extends CommonSymbol { } public List getDimensions(){ - List dimensionList = new ArrayList<>(4); + List dimensionList = new ArrayList<>(); for (ArchSimpleExpressionSymbol exp : getDimensionSymbols()){ dimensionList.add(exp.getIntValue().get()); } @@ -241,6 +242,7 @@ public class ArchTypeSymbol extends CommonSymbol { copy.setWidthIndex(getWidthIndex()); copy.setChannelIndex(getChannelIndex()); copy.setHeightIndex(getHeightIndex()); + copy.setDepthIndex(getDepthIndex()); List dimensionCopies = new ArrayList<>(); for (ArchSimpleExpressionSymbol dimension : getDimensionSymbols()){ dimensionCopies.add(dimension.preResolveDeepCopy()); @@ -250,11 +252,17 @@ public class ArchTypeSymbol extends CommonSymbol { return copy; } + public void printDimensions(){ + for (ArchSimpleExpressionSymbol dimension : getDimensionSymbols()){ + System.out.println("From Dimension list: " + dimension.getTextualRepresentation()); + } + } + public static class Builder{ private int height = 1; private int width = 1; private int channels = 1; - private int depth = 0; + private int depth = 1; private ASTElementType domain = null; public Builder height(int height){ @@ -301,8 +309,21 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setChannelIndex(0); sym.setHeightIndex(1); sym.setWidthIndex(2); - sym.setDepthIndex(3); - sym.setDimensions(Arrays.asList(channels, height, width, depth)); + + Integer test = new Integer(this.depth); + Integer test2 = new Integer(sym.getDepth()); + System.out.println("Depth in builder is: " + test.toString() + " and depth is: " + test2.toString()); + if (this.depth != 1){ + sym.setHeightIndex(2); + sym.setWidthIndex(3); + sym.setDepthIndex(1); + sym.setDimensions(Arrays.asList(channels, depth, height, width)); //Dimensions are in this order for mxnet + sym.printDimensions(); + } + + else { + sym.setDimensions(Arrays.asList(channels, height, width)); + } if (domain == null){ domain = new ASTElementType(); @@ -311,5 +332,6 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setDomain(domain); return sym; } + } } diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java index 22815b0..365f297 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java @@ -285,29 +285,37 @@ public class CNNArchSymbolTableCreator extends de.monticore.symboltable.CommonSy ArchTypeSymbol sym = new ArchTypeSymbol(); addToScopeAndLinkWithNode(sym, ast); } - +//NEW @Override public void endVisit(ASTArchType node) { ArchTypeSymbol sym = (ArchTypeSymbol) node.getSymbolOpt().get(); List astDimensions = node.getShape().getDimensionsList(); - + Integer size = new Integer(astDimensions.size()); + java.lang.System.out.println("Size of astDimension is: " + size.toString()); if (astDimensions.size() >= 1){ sym.setChannelIndex(0); } if (astDimensions.size() >= 2){ + java.lang.System.out.println("Setting Height Index in CNNArchSymbolTable"); sym.setHeightIndex(1); } if (astDimensions.size() >= 3){ sym.setWidthIndex(2); } - List dimensionList = new ArrayList<>(3); + if (astDimensions.size() >= 4){ + java.lang.System.out.println("Setting Depth Index to 1 in CNNArchSymbolTable"); + sym.setDepthIndex(1); + sym.setHeightIndex(2); + sym.setWidthIndex(3); + } + List dimensionList = new ArrayList<>(4); for (ASTArchSimpleExpression astExp : astDimensions){ dimensionList.add((ArchSimpleExpressionSymbol) astExp.getSymbolOpt().get()); } sym.setDimensionSymbols(dimensionList); sym.setDomain(node.getElementType()); } - +//END NEW @Override public void visit(ASTLayerDeclaration ast) { LayerDeclarationSymbol layerDeclaration = new LayerDeclarationSymbol(ast.getName()); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java index ff33f8c..6ba58ae 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java @@ -204,8 +204,9 @@ public enum Constraints { @Override protected String msgString() { return AllPredefinedLayers.PADDING_VALID + ", " - + AllPredefinedLayers.PADDING_SAME + " or " - + AllPredefinedLayers.PADDING_NO_LOSS; + + AllPredefinedLayers.PADDING_SAME + ", " + + AllPredefinedLayers.PADDING_NO_LOSS + " or " + + AllPredefinedLayers.PADDING_SAME3D; } }, TRANSPADDING_TYPE { @@ -214,7 +215,9 @@ public enum Constraints { Optional optString= exp.getStringValue(); if (optString.isPresent()){ if (optString.get().equals(AllPredefinedLayers.PADDING_VALID) - || optString.get().equals(AllPredefinedLayers.PADDING_SAME)) { + || optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D)) { return true; } } @@ -222,8 +225,10 @@ public enum Constraints { } @Override protected String msgString() { - return AllPredefinedLayers.PADDING_VALID + "or " - + AllPredefinedLayers.PADDING_SAME; + return AllPredefinedLayers.PADDING_VALID + ", " + + AllPredefinedLayers.PADDING_SAME + " or " + + AllPredefinedLayers.PADDING_SAME3D + " or " + + AllPredefinedLayers.PADDING_VALID3D; } }, POOL_TYPE { diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index ff8be0c..4261000 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -130,12 +130,57 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } } } +//NEW + protected void errorIfInputDepthIsInvalid(List inputTypes, LayerSymbol layer, int depth){ + for (ArchTypeSymbol inputType : inputTypes) { + if (inputType.getDepth() != depth){ + Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + " Invalid layer input. Input depth is " + + inputType.getDepth() + " but needs to be " + depth + ".", layer.getSourcePosition()); + } + } + } + + protected static void errorIfInputSmallerThanKernel3D(List inputTypes, LayerSymbol layer){ + if (!inputTypes.isEmpty()) { + int inputHeight = inputTypes.get(0).getHeight(); + int inputWidth = inputTypes.get(0).getWidth(); + int inputDepth = inputTypes.get(0).getDepth(); + Integer depthI = new Integer(inputTypes.get(0).getDepthIndex()); + //System.out.println("Depth Index is: " + depthI.toString() + " in PredefinedLayerDecl"); + + int kernelHeight = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + + if (kernelHeight > inputHeight || kernelWidth > inputWidth || kernelDepth > inputDepth) { + if (layer.getStringValue(AllPredefinedLayers.PADDING_NAME).equals(AllPredefinedLayers.PADDING_VALID3D)) { + Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + " Invalid layer input. " + + "The input resolution is smaller than the kernel and the padding mode is 'valid'." + + "This would result in an output resolution of 0x0." + , layer.getSourcePosition()); + } else { + Integer height = new Integer(kernelHeight); + Integer width = new Integer(kernelWidth); + Integer depth = new Integer(kernelDepth); + Integer iheight = new Integer(inputHeight); + Integer iwidth = new Integer(inputWidth); + Integer idepth = new Integer(inputDepth); + Log.warn("The input resolution is smaller than the kernel. " + height.toString() + " " + width.toString() + " " + depth.toString() + " " + iheight.toString() + " " + iwidth.toString() + " " + idepth.toString() + " " + + "This results in an output resolution of 1x1. " + "Depth Index is: " + depthI.toString() + " " + + "If this warning appears multiple times, consider changing your architecture" + , layer.getSourcePosition()); + } + } + } + } +//END NEW //check input for convolution and pooling protected static void errorIfInputSmallerThanKernel(List inputTypes, LayerSymbol layer) { if (!inputTypes.isEmpty()) { int inputHeight = inputTypes.get(0).getHeight(); int inputWidth = inputTypes.get(0).getWidth(); + int kernelHeight = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int kernelWidth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); @@ -146,12 +191,16 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol "This would result in an output resolution of 0x0." , layer.getSourcePosition()); } else { - Log.warn("The input resolution is smaller than the kernel. " + + Integer height = new Integer(kernelHeight); + Integer width = new Integer(kernelWidth); + Integer iheight = new Integer(inputHeight); + Integer iwidth = new Integer(inputWidth); + Log.warn("The input resolution is smaller than the kernel. " + height.toString() + " " + width.toString() + " " + iheight.toString() + " " + iwidth.toString() + " " + "This results in an output resolution of 1x1. " + "If this warning appears multiple times, consider changing your architecture" , layer.getSourcePosition()); } - } + } } } @@ -200,28 +249,19 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } //NEW private static List computeOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); - int outputWidth; - int outputHeight; - int outputDepth; - if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { - outputWidth = 0; - outputHeight = 0; - outputDepth = 0; - } else { - outputWidth = (inputWidth + strideWidth - 1) / strideWidth; - outputHeight = (inputHeight + strideWidth - 1) / strideHeight; - outputDepth = (inputDepth + strideDepth - 1) / strideDepth; - } + int outputWidth = (inputWidth + strideWidth - 1) / strideWidth; + int outputHeight = (inputHeight + strideWidth - 1) / strideHeight; + int outputDepth = (inputDepth + strideDepth - 1) / strideDepth; return Collections.singletonList(new ArchTypeSymbol.Builder() .height(outputHeight) @@ -233,12 +273,12 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels) { - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); @@ -266,12 +306,9 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeUpConvOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); @@ -280,10 +317,16 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int outputHeight; int outputDepth; + //Integer iDepth = new Integer(inputDepth); + //Integer stride = new Integer(strideDepth); + outputWidth = inputWidth * strideWidth; outputHeight = inputHeight * strideHeight; outputDepth = inputDepth * strideDepth; + //Integer oDepth = new Integer(outputDepth); + //System.out.println("In computeUpConvShape: " + iDepth.toString() + " " + stride.toString() + " " + oDepth.toString()); + return Collections.singletonList(new ArchTypeSymbol.Builder() .height(outputHeight) .width(outputWidth) @@ -294,12 +337,12 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeUpConvOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java index abd1d0c..34a7f91 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java @@ -22,13 +22,27 @@ public class LeakyRelu extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(layer.getInputTypes().get(0).getChannels()) - .height(layer.getInputTypes().get(0).getHeight()) - .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "oo") - .build()); + Integer test = new Integer(inputTypes.get(0).getDepthIndex()); + System.out.println("Depth Index in LeakyRelu is: " + test.toString()); + if (inputTypes.get(0).getDepthIndex() == -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .elementType("0", "oo") + .build()); + } + else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType("0", "oo") + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java index 321c886..2954e04 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java @@ -25,13 +25,25 @@ public class Relu extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(layer.getInputTypes().get(0).getChannels()) - .height(layer.getInputTypes().get(0).getHeight()) - .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "oo") - .build()); + if (inputTypes.get(0).getDepthIndex() == -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .elementType("0", "oo") + .build()); + } + else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType("0", "oo") + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java index 83eea2d..79d286b 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java @@ -30,7 +30,7 @@ public class Reshape extends PredefinedLayerDeclaration { int channels = -1; int height = -1; int width = -1; - + int depth = -1; if (shape.size() >= 3) { width = shape.get(2); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java index e49cae0..4469fa7 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java @@ -52,11 +52,14 @@ public class Reshape3D extends PredefinedLayerDeclaration { } int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); - int newTotalSize = shape.stream().reduce(1, (x, y, z) -> x * y * z); + int newTotalSize = shape.stream().reduce(1, (x, y) -> x * y); if (totalSize != newTotalSize && newTotalSize != 0) { + Integer nts = new Integer(newTotalSize); + Integer ts = new Integer(totalSize); Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + "The input of Reshape layer cannot be reshaped to the given shape. " - + "Source and target shape have a different amount of total values", layer.getSourcePosition()); + + "Source and target shape have a different amount of total values " + + " newTotalSize = " + nts.toString() + " and totalSize = " + ts.toString(), layer.getSourcePosition()); } if (newTotalSize != 0) { diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java index 8bd782e..8350b2c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java @@ -25,13 +25,27 @@ public class Sigmoid extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(layer.getInputTypes().get(0).getChannels()) - .height(layer.getInputTypes().get(0).getHeight()) - .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "1") - .build()); + Integer test = new Integer(inputTypes.get(0).getDepthIndex()); + System.out.println("Depth Index in Sigmoid is: " + test.toString()); + if (inputTypes.get(0).getDepthIndex() == -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .elementType("0", "oo") + .build()); + } + else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType("0", "oo") + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java index 01460ff..5b39378 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -21,7 +21,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return computeUpConvOutputShape(inputTypes.get(0), + return computeUpConvOutputShape(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } -- GitLab From 6986e2b7f5f601391dad15371f3c3786e970117a Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 22 Jun 2021 23:21:11 +0200 Subject: [PATCH 43/92] Fix conflicts --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 3ffd2be..f12f747 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -63,10 +63,7 @@ public class AllPredefinedLayers { public static final String CONVOLUTION3D_NAME = "Convolution3D"; public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; public static final String RESHAPE3D_NAME = "Reshape3D"; -<<<<<<< HEAD -======= ->>>>>>> 9286fce065fa9bc0240928f6319a3d318228d88a //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 96f294ddf05f1f36694cc62b2521586d78f09d3f Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 14:59:02 +0200 Subject: [PATCH 44/92] creates the 3DConvolution class and adds the name of the 3DConv layer to the AllPredefinedLayers class --- .../cnnarch/predefined/3DConvolution.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java new file mode 100644 index 0000000..f11695f --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java @@ -0,0 +1,71 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class 3DConvolution extends PredefinedLayerDeclaration { + + private 3DConvolution() { + super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + // TODO check here + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + errorIfInputSmallerThanKernel(inputTypes, layer); + } + + public static 3DConvolution create(){ + 3DConvolution declaration = new 3DConvolution(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.PADDING_NAME) + .constraints(Constraints.PADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 7f0ecdef683893b523bdaf0d204429f98f7b504b Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:03:40 +0200 Subject: [PATCH 45/92] Renames 3DConvolution to ThreeDConvolution --- .../cnnarch/predefined/AllPredefinedLayers.java | 6 ++++++ .../{3DConvolution.java => ThreeDConvolution.java} | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{3DConvolution.java => ThreeDConvolution.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index ff0a2e3..829ffdf 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -61,6 +61,7 @@ public class AllPredefinedLayers { public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; + //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; public static final String EPISODIC_MEMORY_NAME = "EpisodicMemory"; @@ -198,8 +199,13 @@ public class AllPredefinedLayers { LoadNetwork.create(), DotProductSelfAttention.create(), LargeMemory.create(), +<<<<<<< HEAD EpisodicMemory.create()); +======= + EpisodicMemory.create(), + ThreeDConvolution.create()); +>>>>>>> Renames 3DConvolution to ThreeDConvolution } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java index f11695f..9d68770 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class 3DConvolution extends PredefinedLayerDeclaration { +public class ThreeDConvolution extends PredefinedLayerDeclaration { - private 3DConvolution() { - super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + private ThreeDConvolution() { + super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); } @Override @@ -34,8 +34,8 @@ public class 3DConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static 3DConvolution create(){ - 3DConvolution declaration = new 3DConvolution(); + public static ThreeDConvolution create(){ + ThreeDConvolution declaration = new ThreeDConvolution(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From a35596cb9380c9da8527db8d68b7e926f2c40803 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:36:49 +0200 Subject: [PATCH 46/92] Renames ThreeDConvolution to Convolution3D --- .../cnnarch/predefined/AllPredefinedLayers.java | 5 +++++ .../{ThreeDConvolution.java => Convolution3D.java} | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{ThreeDConvolution.java => Convolution3D.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 829ffdf..61c5c70 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,6 +60,7 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; + public static final String CONVOLUTION3D_Name = "3DConvolution"; //replay layers @@ -204,8 +205,12 @@ public class AllPredefinedLayers { ======= EpisodicMemory.create(), +<<<<<<< HEAD ThreeDConvolution.create()); >>>>>>> Renames 3DConvolution to ThreeDConvolution +======= + Convolution3D.create()); +>>>>>>> Renames ThreeDConvolution to Convolution3D } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 9d68770..af18fbe 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class ThreeDConvolution extends PredefinedLayerDeclaration { +public class Convolution3D extends PredefinedLayerDeclaration { - private ThreeDConvolution() { - super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); + private Convolution3D() { + super(AllPredefinedLayers.CONVOLUTION3D_NAME); } @Override @@ -34,8 +34,8 @@ public class ThreeDConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static ThreeDConvolution create(){ - ThreeDConvolution declaration = new ThreeDConvolution(); + public static Convolution3D create(){ + Convolution3D declaration = new Convolution3D(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From 02876321850126a1cf5f1973ac6f92c74466d3c2 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:11:40 +0200 Subject: [PATCH 47/92] Adds the 3D up convolution layer class and name in predefinedLayers --- .../predefined/AllPredefinedLayers.java | 13 +--- .../cnnarch/predefined/UpConvolution3D.java | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 61c5c70..d01e605 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -61,6 +61,7 @@ public class AllPredefinedLayers { public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; public static final String CONVOLUTION3D_Name = "3DConvolution"; + public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; //replay layers @@ -200,17 +201,9 @@ public class AllPredefinedLayers { LoadNetwork.create(), DotProductSelfAttention.create(), LargeMemory.create(), -<<<<<<< HEAD - EpisodicMemory.create()); - -======= EpisodicMemory.create(), -<<<<<<< HEAD - ThreeDConvolution.create()); ->>>>>>> Renames 3DConvolution to ThreeDConvolution -======= - Convolution3D.create()); ->>>>>>> Renames ThreeDConvolution to Convolution3D + Convolution3D.create() + UpConvolution3D.create()); } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java new file mode 100644 index 0000000..6e0d7d3 --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -0,0 +1,68 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class UpConvolution3D extends PredefinedLayerDeclaration { + + private UpConvolution3D() { + super(AllPredefinedLayers.UP_CONVOLUTION3D_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + return computeUpConvOutputShape(inputTypes.get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + } + + public static UpConvolution3D create(){ + UpConvolution3D declaration = new UpConvolution3D(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.TRANSPADDING_NAME) + .constraints(Constraints.TRANSPADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 4967385fcec69f54d4c7b8e11e6632fce54dbbb6 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:12:14 +0200 Subject: [PATCH 48/92] Fix small syntax bug --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index d01e605..97a7328 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -202,7 +202,7 @@ public class AllPredefinedLayers { DotProductSelfAttention.create(), LargeMemory.create(), EpisodicMemory.create(), - Convolution3D.create() + Convolution3D.create(), UpConvolution3D.create()); } -- GitLab From a6dda56874688a2ff886b361cd4ee8705b1cfe24 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 14 May 2021 17:28:03 +0200 Subject: [PATCH 49/92] I dont exactly know whats in here --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6f28288..3d61d20 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ de.monticore.lang.monticar cnn-arch - 0.4.6-SNAPSHOT + 0.4.7-SNAPSHOT -- GitLab From dcd0a6c6013fd37e0af4aaea5f922e25ad68400a Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 14:59:02 +0200 Subject: [PATCH 50/92] creates the 3DConvolution class and adds the name of the 3DConv layer to the AllPredefinedLayers class --- .../cnnarch/predefined/3DConvolution.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java new file mode 100644 index 0000000..f11695f --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java @@ -0,0 +1,71 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class 3DConvolution extends PredefinedLayerDeclaration { + + private 3DConvolution() { + super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + // TODO check here + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + errorIfInputSmallerThanKernel(inputTypes, layer); + } + + public static 3DConvolution create(){ + 3DConvolution declaration = new 3DConvolution(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.PADDING_NAME) + .constraints(Constraints.PADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 45f409de6614e5f6299a70b684427d7a9239129b Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:03:40 +0200 Subject: [PATCH 51/92] Renames 3DConvolution to ThreeDConvolution --- .../cnnarch/predefined/AllPredefinedLayers.java | 5 +++++ .../{3DConvolution.java => ThreeDConvolution.java} | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{3DConvolution.java => ThreeDConvolution.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 97a7328..daa3b0f 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,9 +60,14 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; +<<<<<<< HEAD public static final String CONVOLUTION3D_Name = "3DConvolution"; public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; +======= + public static final String ThreeDConvolution_Name = "3DConvolution"; + public static final String THREED_CONVOLUTION_Name = "3DConvolution"; +>>>>>>> Renames 3DConvolution to ThreeDConvolution //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java index f11695f..9d68770 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class 3DConvolution extends PredefinedLayerDeclaration { +public class ThreeDConvolution extends PredefinedLayerDeclaration { - private 3DConvolution() { - super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + private ThreeDConvolution() { + super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); } @Override @@ -34,8 +34,8 @@ public class 3DConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static 3DConvolution create(){ - 3DConvolution declaration = new 3DConvolution(); + public static ThreeDConvolution create(){ + ThreeDConvolution declaration = new ThreeDConvolution(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From 0e8c50459dd6aead171773f1a72a3b527f774fdd Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:36:49 +0200 Subject: [PATCH 52/92] Renames ThreeDConvolution to Convolution3D --- .../predefined/AllPredefinedLayers.java | 4 ++ .../cnnarch/predefined/ThreeDConvolution.java | 71 ------------------- 2 files changed, 4 insertions(+), 71 deletions(-) delete mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index daa3b0f..85bee80 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -67,7 +67,11 @@ public class AllPredefinedLayers { ======= public static final String ThreeDConvolution_Name = "3DConvolution"; public static final String THREED_CONVOLUTION_Name = "3DConvolution"; +<<<<<<< HEAD >>>>>>> Renames 3DConvolution to ThreeDConvolution +======= + public static final String CONVOLUTION3D_Name = "3DConvolution"; +>>>>>>> Renames ThreeDConvolution to Convolution3D //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java deleted file mode 100644 index 9d68770..0000000 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * - * (c) https://github.com/MontiCore/monticore - * - * The license generally applicable for this project - * can be found under https://github.com/MontiCore/monticore. - */ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.lang.monticar.cnnarch.predefined; - -import de.monticore.lang.monticar.cnnarch._symboltable.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ThreeDConvolution extends PredefinedLayerDeclaration { - - private ThreeDConvolution() { - super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); - } - - @Override - public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - // TODO check here - return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), - layer, - layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); - } - - @Override - public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - errorIfInputSizeIsNotOne(inputTypes, layer); - errorIfInputSmallerThanKernel(inputTypes, layer); - } - - public static ThreeDConvolution create(){ - ThreeDConvolution declaration = new ThreeDConvolution(); - List parameters = new ArrayList<>(Arrays.asList( - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.KERNEL_NAME) - .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.CHANNELS_NAME) - .constraints(Constraints.INTEGER, Constraints.POSITIVE) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.STRIDE_NAME) - .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.NOBIAS_NAME) - .constraints(Constraints.BOOLEAN) - .defaultValue(false) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.PADDING_NAME) - .constraints(Constraints.PADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.GROUPS_NAME) - .constraints(Constraints.INTEGER, Constraints.POSITIVE) - .defaultValue(1) - .build())); - declaration.setParameters(parameters); - return declaration; - } -} -- GitLab From e17497ac0c230beccff107715b17fea9c4c37363 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:11:40 +0200 Subject: [PATCH 53/92] Adds the 3D up convolution layer class and name in predefinedLayers --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 85bee80..2c6ae77 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -71,7 +71,11 @@ public class AllPredefinedLayers { >>>>>>> Renames 3DConvolution to ThreeDConvolution ======= public static final String CONVOLUTION3D_Name = "3DConvolution"; +<<<<<<< HEAD >>>>>>> Renames ThreeDConvolution to Convolution3D +======= + public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; +>>>>>>> Adds the 3D up convolution layer class and name in predefinedLayers //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 4e2134fee2c3d83a99cff313b150f645813643aa Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 4 May 2021 09:03:08 +0200 Subject: [PATCH 54/92] Fix bug --- .../predefined/AllPredefinedLayers.java | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 2c6ae77..c5216c6 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,22 +60,8 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; -<<<<<<< HEAD - public static final String CONVOLUTION3D_Name = "3DConvolution"; - public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; - -======= - public static final String ThreeDConvolution_Name = "3DConvolution"; - public static final String THREED_CONVOLUTION_Name = "3DConvolution"; -<<<<<<< HEAD ->>>>>>> Renames 3DConvolution to ThreeDConvolution -======= - public static final String CONVOLUTION3D_Name = "3DConvolution"; -<<<<<<< HEAD ->>>>>>> Renames ThreeDConvolution to Convolution3D -======= - public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; ->>>>>>> Adds the 3D up convolution layer class and name in predefinedLayers + public static final String CONVOLUTION3D_NAME = "3DConvolution"; + public static final String UP_CONVOLUTION3D_NAME = "3DConvolution"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 2553338c798b18893a431b737fbfcd0a549b8e5f Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 14 May 2021 17:28:03 +0200 Subject: [PATCH 55/92] I dont exactly know whats in here --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3d61d20..82b311c 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,6 @@ cnn-arch 0.4.7-SNAPSHOT - -- GitLab From fd5f7fd0c57658504ad64416c520339409d89c93 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 15 May 2021 19:21:23 +0200 Subject: [PATCH 56/92] Fixes --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index c5216c6..ed77fa8 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,8 +60,8 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; - public static final String CONVOLUTION3D_NAME = "3DConvolution"; - public static final String UP_CONVOLUTION3D_NAME = "3DConvolution"; + public static final String CONVOLUTION3D_NAME = "Convolution3D"; + public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 808e0b6e0e29fb7cca2cf7ec3411765e701b956b Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 26 May 2021 15:35:23 +0200 Subject: [PATCH 57/92] Adds the depth dimension for 3d data --- .../cnnarch/_symboltable/ArchTypeSymbol.java | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index 908fe20..ee90bd4 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -28,6 +28,7 @@ public class ArchTypeSymbol extends CommonSymbol { private int channelIndex = -1; private int heightIndex = -1; private int widthIndex = -1; + private int depthIndex = -1; private List dimensions = new ArrayList<>(); public ArchTypeSymbol() { @@ -88,7 +89,15 @@ public class ArchTypeSymbol extends CommonSymbol { public void setChannelIndex(int channelIndex) { this.channelIndex = channelIndex; } - +//NEW + public int getDepthIndex(){ + return depthIndex; + } + + public void setDepthIndex(int depthIndex){ + this.depthIndex = depthIndex; + } +//END NEW public ArchSimpleExpressionSymbol getHeightSymbol() { if (getHeightIndex() == -1){ return ArchSimpleExpressionSymbol.of(1); @@ -110,6 +119,19 @@ public class ArchTypeSymbol extends CommonSymbol { return getDimensionSymbols().get(getChannelIndex()); } +//NEW + public ArchSimpleExpressionSymbol getDepthSymbol() { + if (getDepthIndex() == -1){ + return ArchSimpleExpressionSymbol.of(1); + } + return getDimensionSymbols().get(getDepthIndex()); + } + + public Integer getDepth(){ + return getDepthSymbol().getIntValue().get(); + } +//END NEW + public Integer getWidth(){ return getWidthSymbol().getIntValue().get(); } @@ -139,7 +161,7 @@ public class ArchTypeSymbol extends CommonSymbol { } public List getDimensions(){ - List dimensionList = new ArrayList<>(3); + List dimensionList = new ArrayList<>(4); for (ArchSimpleExpressionSymbol exp : getDimensionSymbols()){ dimensionList.add(exp.getIntValue().get()); } @@ -232,6 +254,7 @@ public class ArchTypeSymbol extends CommonSymbol { private int height = 1; private int width = 1; private int channels = 1; + private int depth = 0; private ASTElementType domain = null; public Builder height(int height){ @@ -246,6 +269,10 @@ public class ArchTypeSymbol extends CommonSymbol { this.channels = channels; return this; } + public Builder depth(int depth){ + this.depth = depth; + return this; + } public Builder elementType(ASTElementType domain){ this.domain = domain; return this; @@ -274,7 +301,8 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setChannelIndex(0); sym.setHeightIndex(1); sym.setWidthIndex(2); - sym.setDimensions(Arrays.asList(channels, height, width)); + sym.setDepthIndex(3); + sym.setDimensions(Arrays.asList(channels, height, width, depth)); if (domain == null){ domain = new ASTElementType(); -- GitLab From 605c2d1cd9cf56e790dd5cf0fddfe92cc256ab68 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 28 May 2021 11:31:54 +0200 Subject: [PATCH 58/92] Adds computeOutputShapewithPadding for 3d Data --- .../cnnarch/_symboltable/Constraints.java | 4 +- .../PredefinedLayerDeclaration.java | 132 ++++++++++++++++++ .../predefined/AllPredefinedLayers.java | 2 + 3 files changed, 137 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java index 41d487d..ff33f8c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java @@ -193,7 +193,9 @@ public enum Constraints { if (optString.isPresent()){ if (optString.get().equals(AllPredefinedLayers.PADDING_VALID) || optString.get().equals(AllPredefinedLayers.PADDING_SAME) - || optString.get().equals(AllPredefinedLayers.PADDING_NO_LOSS)){ + || optString.get().equals(AllPredefinedLayers.PADDING_NO_LOSS) + || optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D)){ return true; } } diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index 355ad37..ff8be0c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -165,6 +165,10 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol return computeOutputShapeWithValidPadding(inputType, method, channels); } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_NO_LOSS)) { return computeOutputShapeWithNoLossPadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES + return computeOutputShapeWithSamePadding3D(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ + return computeOutputShapeWithValidPadding3D (inputType, method, channels); } else { throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); } @@ -177,6 +181,10 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol return computeUpConvOutputShapeWithSamePadding(inputType, method, channels); } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID)) { return computeUpConvOutputShapeWithValidPadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES + return computeUpConvOutputShapeWithSamePadding3D(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ + return computeUpConvOutputShapeWithValidPadding3D (inputType, method, channels); } else { throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); } @@ -190,6 +198,130 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } layer.setIntValue(AllPredefinedLayers.SIZE_NAME, outputChannels); } +//NEW + private static List computeOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { + outputWidth = 0; + outputHeight = 0; + outputDepth = 0; + } else { + outputWidth = (inputWidth + strideWidth - 1) / strideWidth; + outputHeight = (inputHeight + strideWidth - 1) / strideHeight; + outputDepth = (inputDepth + strideDepth - 1) / strideDepth; + } + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels) { + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { + outputWidth = 0; + outputHeight = 0; + outputDepth = 0; + } else { + outputWidth = 1 + (inputWidth - kernelWidth) / strideWidth; + outputHeight = 1 + (inputHeight - kernelHeight) / strideHeight; + outputDepth = 1 + (inputDepth - kernelDepth) / strideDepth; + } + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeUpConvOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + + outputWidth = inputWidth * strideWidth; + outputHeight = inputHeight * strideHeight; + outputDepth = inputDepth * strideDepth; + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeUpConvOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + + outputWidth = (inputWidth - 1) * strideWidth + kernelWidth; + outputHeight = (inputHeight - 1) * strideHeight + kernelHeight; + outputDepth = (inputDepth - 1) * strideDepth + kernelDepth; + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + +//END NEW //padding with border_mode=valid, no padding diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index ed77fa8..7913d26 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -146,6 +146,8 @@ public class AllPredefinedLayers { public static final String PADDING_VALID = "valid"; public static final String PADDING_SAME = "same"; public static final String PADDING_NO_LOSS = "no_loss"; + public static final String PADDING_VALID3D = "valid3d"; + public static final String PADDING_SAME3D = "same3d"; public static final String POOL_MAX = "max"; public static final String POOL_AVG = "avg"; public static final String RANDOM = "random"; -- GitLab From 87f61288b6f32ee6df8ff0e81d11053dac183681 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 12:17:19 +0200 Subject: [PATCH 59/92] Fixes Stride and Padding being incorrect --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 4 ++-- .../lang/monticar/cnnarch/predefined/UpConvolution3D.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index af18fbe..3603736 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -48,7 +48,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.STRIDE_NAME) .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) + .defaultValue(Arrays.asList(1, 1, 1)) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.NOBIAS_NAME) @@ -58,7 +58,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.PADDING_NAME) .constraints(Constraints.PADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) + .defaultValue(AllPredefinedLayers.PADDING_SAME3D) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.GROUPS_NAME) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java index 6e0d7d3..01460ff 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -45,7 +45,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.STRIDE_NAME) .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) + .defaultValue(Arrays.asList(1, 1, 1)) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.NOBIAS_NAME) @@ -55,7 +55,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.TRANSPADDING_NAME) .constraints(Constraints.TRANSPADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) + .defaultValue(AllPredefinedLayers.PADDING_SAME3D) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.GROUPS_NAME) -- GitLab From 0b19499c0c18abace293445811a0358f9e0aa427 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 13:49:50 +0200 Subject: [PATCH 60/92] Adds Reshape3D layer --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 7913d26..1042c84 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -62,6 +62,7 @@ public class AllPredefinedLayers { public static final String CUSTOM_LAYER = "CustomLayer"; public static final String CONVOLUTION3D_NAME = "Convolution3D"; public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; + public static final String RESHAPE3D_NAME = "Reshape3D"; //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -204,7 +205,8 @@ public class AllPredefinedLayers { LargeMemory.create(), EpisodicMemory.create(), Convolution3D.create(), - UpConvolution3D.create()); + UpConvolution3D.create(), + Reshape3D.create()); } public static List createUnrollList(){ -- GitLab From 31bbb72cb5cb2e5ba4bca7af8c5a853e5f1dc786 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 13:58:43 +0200 Subject: [PATCH 61/92] Fix bugs in Reshape3d --- .../cnnarch/predefined/Reshape3D.java | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java new file mode 100644 index 0000000..e49cae0 --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java @@ -0,0 +1,115 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; +import de.monticore.lang.monticar.cnnarch.helper.ErrorCodes; +import de.se_rwth.commons.logging.Log; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class Reshape3D extends PredefinedLayerDeclaration { + + private Reshape3D() { + super(AllPredefinedLayers.RESHAPE3D_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + + List shape = layer.getIntTupleValue(AllPredefinedLayers.SHAPE_NAME).get(); + + int channels = -1; + int height = -1; + int width = -1; + int depth = -1; + + if (shape.size() >= 4) { + width = shape.get(3); + } + + if (shape.size() >= 3) { + height = shape.get(2); + } + + if (shape.size() >=2) { + depth = shape.get(1); + } + + if (shape.size() >= 1) { + channels = shape.get(0); + } else { + Log.error("0" + ErrorCodes.ILLEGAL_PARAMETER_VALUE + "\"Shape\" argument needs to contain at least one entry" + , layer.getSourcePosition()); + } + + int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); + int newTotalSize = shape.stream().reduce(1, (x, y, z) -> x * y * z); + + if (totalSize != newTotalSize && newTotalSize != 0) { + Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + "The input of Reshape layer cannot be reshaped to the given shape. " + + "Source and target shape have a different amount of total values", layer.getSourcePosition()); + } + + if (newTotalSize != 0) { + + if (width != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .height(height) + .width(width) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } else if (height != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .height(height) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } else if (depth != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } + else{ + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } + } + return Collections.emptyList(); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + } + + public static Reshape3D create(){ + Reshape3D declaration = new Reshape3D(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.SHAPE_NAME) + .constraints(Constraints.INTEGER_TUPLE) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 0cd121b1c609cf5c3a4593c4656987ed98e3a9b3 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 5 Jun 2021 11:57:08 +0200 Subject: [PATCH 62/92] Change checks for 3d values --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 3603736..0bd876a 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -23,7 +23,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { // TODO check here - return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + return computeConvAndPoolOutputShape3D(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } @@ -31,7 +31,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { errorIfInputSizeIsNotOne(inputTypes, layer); - errorIfInputSmallerThanKernel(inputTypes, layer); + errorIfInputSmallerThanKernel3D(inputTypes, layer); } public static Convolution3D create(){ -- GitLab From b0ca5ee9d8fc48d8daf36f96fd39206a7f771797 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 5 Jun 2021 11:58:20 +0200 Subject: [PATCH 63/92] Remake a change --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 0bd876a..5a0dd73 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -23,7 +23,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { // TODO check here - return computeConvAndPoolOutputShape3D(layer.getInputTypes().get(0), + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } -- GitLab From 81f9b5e74de75c1e75a2189ef839e73f8723584f Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 15 Jun 2021 18:33:35 +0200 Subject: [PATCH 64/92] Makes RelU and Sigmoid able to handle 3d data --- .../cnnarch/_symboltable/ArchTypeSymbol.java | 34 ++++- .../CNNArchSymbolTableCreator.java | 16 ++- .../cnnarch/_symboltable/Constraints.java | 15 ++- .../PredefinedLayerDeclaration.java | 119 ++++++++++++------ .../cnnarch/predefined/LeakyRelu.java | 28 +++-- .../monticar/cnnarch/predefined/Relu.java | 26 ++-- .../monticar/cnnarch/predefined/Reshape.java | 2 +- .../cnnarch/predefined/Reshape3D.java | 7 +- .../monticar/cnnarch/predefined/Sigmoid.java | 28 +++-- .../cnnarch/predefined/UpConvolution3D.java | 2 +- 10 files changed, 199 insertions(+), 78 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index ee90bd4..b737c89 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -94,8 +94,8 @@ public class ArchTypeSymbol extends CommonSymbol { return depthIndex; } - public void setDepthIndex(int depthIndex){ - this.depthIndex = depthIndex; + public void setDepthIndex(int depthIndexi){ + this.depthIndex = depthIndexi; } //END NEW public ArchSimpleExpressionSymbol getHeightSymbol() { @@ -122,6 +122,7 @@ public class ArchTypeSymbol extends CommonSymbol { //NEW public ArchSimpleExpressionSymbol getDepthSymbol() { if (getDepthIndex() == -1){ + java.lang.System.out.println("Depth Index is -1"); return ArchSimpleExpressionSymbol.of(1); } return getDimensionSymbols().get(getDepthIndex()); @@ -161,7 +162,7 @@ public class ArchTypeSymbol extends CommonSymbol { } public List getDimensions(){ - List dimensionList = new ArrayList<>(4); + List dimensionList = new ArrayList<>(); for (ArchSimpleExpressionSymbol exp : getDimensionSymbols()){ dimensionList.add(exp.getIntValue().get()); } @@ -241,6 +242,7 @@ public class ArchTypeSymbol extends CommonSymbol { copy.setWidthIndex(getWidthIndex()); copy.setChannelIndex(getChannelIndex()); copy.setHeightIndex(getHeightIndex()); + copy.setDepthIndex(getDepthIndex()); List dimensionCopies = new ArrayList<>(); for (ArchSimpleExpressionSymbol dimension : getDimensionSymbols()){ dimensionCopies.add(dimension.preResolveDeepCopy()); @@ -250,11 +252,17 @@ public class ArchTypeSymbol extends CommonSymbol { return copy; } + public void printDimensions(){ + for (ArchSimpleExpressionSymbol dimension : getDimensionSymbols()){ + System.out.println("From Dimension list: " + dimension.getTextualRepresentation()); + } + } + public static class Builder{ private int height = 1; private int width = 1; private int channels = 1; - private int depth = 0; + private int depth = 1; private ASTElementType domain = null; public Builder height(int height){ @@ -301,8 +309,21 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setChannelIndex(0); sym.setHeightIndex(1); sym.setWidthIndex(2); - sym.setDepthIndex(3); - sym.setDimensions(Arrays.asList(channels, height, width, depth)); + + Integer test = new Integer(this.depth); + Integer test2 = new Integer(sym.getDepth()); + System.out.println("Depth in builder is: " + test.toString() + " and depth is: " + test2.toString()); + if (this.depth != 1){ + sym.setHeightIndex(2); + sym.setWidthIndex(3); + sym.setDepthIndex(1); + sym.setDimensions(Arrays.asList(channels, depth, height, width)); //Dimensions are in this order for mxnet + sym.printDimensions(); + } + + else { + sym.setDimensions(Arrays.asList(channels, height, width)); + } if (domain == null){ domain = new ASTElementType(); @@ -311,5 +332,6 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setDomain(domain); return sym; } + } } diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java index 1a8eb42..3c799e4 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java @@ -294,29 +294,37 @@ public class CNNArchSymbolTableCreator extends de.monticore.symboltable.CommonSy ArchTypeSymbol sym = new ArchTypeSymbol(); addToScopeAndLinkWithNode(sym, ast); } - +//NEW @Override public void endVisit(ASTArchType node) { ArchTypeSymbol sym = (ArchTypeSymbol) node.getSymbolOpt().get(); List astDimensions = node.getShape().getDimensionsList(); - + Integer size = new Integer(astDimensions.size()); + java.lang.System.out.println("Size of astDimension is: " + size.toString()); if (astDimensions.size() >= 1){ sym.setChannelIndex(0); } if (astDimensions.size() >= 2){ + java.lang.System.out.println("Setting Height Index in CNNArchSymbolTable"); sym.setHeightIndex(1); } if (astDimensions.size() >= 3){ sym.setWidthIndex(2); } - List dimensionList = new ArrayList<>(3); + if (astDimensions.size() >= 4){ + java.lang.System.out.println("Setting Depth Index to 1 in CNNArchSymbolTable"); + sym.setDepthIndex(1); + sym.setHeightIndex(2); + sym.setWidthIndex(3); + } + List dimensionList = new ArrayList<>(4); for (ASTArchSimpleExpression astExp : astDimensions){ dimensionList.add((ArchSimpleExpressionSymbol) astExp.getSymbolOpt().get()); } sym.setDimensionSymbols(dimensionList); sym.setDomain(node.getElementType()); } - +//END NEW @Override public void visit(ASTLayerDeclaration ast) { LayerDeclarationSymbol layerDeclaration = new LayerDeclarationSymbol(ast.getName()); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java index ff33f8c..6ba58ae 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java @@ -204,8 +204,9 @@ public enum Constraints { @Override protected String msgString() { return AllPredefinedLayers.PADDING_VALID + ", " - + AllPredefinedLayers.PADDING_SAME + " or " - + AllPredefinedLayers.PADDING_NO_LOSS; + + AllPredefinedLayers.PADDING_SAME + ", " + + AllPredefinedLayers.PADDING_NO_LOSS + " or " + + AllPredefinedLayers.PADDING_SAME3D; } }, TRANSPADDING_TYPE { @@ -214,7 +215,9 @@ public enum Constraints { Optional optString= exp.getStringValue(); if (optString.isPresent()){ if (optString.get().equals(AllPredefinedLayers.PADDING_VALID) - || optString.get().equals(AllPredefinedLayers.PADDING_SAME)) { + || optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D)) { return true; } } @@ -222,8 +225,10 @@ public enum Constraints { } @Override protected String msgString() { - return AllPredefinedLayers.PADDING_VALID + "or " - + AllPredefinedLayers.PADDING_SAME; + return AllPredefinedLayers.PADDING_VALID + ", " + + AllPredefinedLayers.PADDING_SAME + " or " + + AllPredefinedLayers.PADDING_SAME3D + " or " + + AllPredefinedLayers.PADDING_VALID3D; } }, POOL_TYPE { diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index ff8be0c..4261000 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -130,12 +130,57 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } } } +//NEW + protected void errorIfInputDepthIsInvalid(List inputTypes, LayerSymbol layer, int depth){ + for (ArchTypeSymbol inputType : inputTypes) { + if (inputType.getDepth() != depth){ + Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + " Invalid layer input. Input depth is " + + inputType.getDepth() + " but needs to be " + depth + ".", layer.getSourcePosition()); + } + } + } + + protected static void errorIfInputSmallerThanKernel3D(List inputTypes, LayerSymbol layer){ + if (!inputTypes.isEmpty()) { + int inputHeight = inputTypes.get(0).getHeight(); + int inputWidth = inputTypes.get(0).getWidth(); + int inputDepth = inputTypes.get(0).getDepth(); + Integer depthI = new Integer(inputTypes.get(0).getDepthIndex()); + //System.out.println("Depth Index is: " + depthI.toString() + " in PredefinedLayerDecl"); + + int kernelHeight = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + + if (kernelHeight > inputHeight || kernelWidth > inputWidth || kernelDepth > inputDepth) { + if (layer.getStringValue(AllPredefinedLayers.PADDING_NAME).equals(AllPredefinedLayers.PADDING_VALID3D)) { + Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + " Invalid layer input. " + + "The input resolution is smaller than the kernel and the padding mode is 'valid'." + + "This would result in an output resolution of 0x0." + , layer.getSourcePosition()); + } else { + Integer height = new Integer(kernelHeight); + Integer width = new Integer(kernelWidth); + Integer depth = new Integer(kernelDepth); + Integer iheight = new Integer(inputHeight); + Integer iwidth = new Integer(inputWidth); + Integer idepth = new Integer(inputDepth); + Log.warn("The input resolution is smaller than the kernel. " + height.toString() + " " + width.toString() + " " + depth.toString() + " " + iheight.toString() + " " + iwidth.toString() + " " + idepth.toString() + " " + + "This results in an output resolution of 1x1. " + "Depth Index is: " + depthI.toString() + " " + + "If this warning appears multiple times, consider changing your architecture" + , layer.getSourcePosition()); + } + } + } + } +//END NEW //check input for convolution and pooling protected static void errorIfInputSmallerThanKernel(List inputTypes, LayerSymbol layer) { if (!inputTypes.isEmpty()) { int inputHeight = inputTypes.get(0).getHeight(); int inputWidth = inputTypes.get(0).getWidth(); + int kernelHeight = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int kernelWidth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); @@ -146,12 +191,16 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol "This would result in an output resolution of 0x0." , layer.getSourcePosition()); } else { - Log.warn("The input resolution is smaller than the kernel. " + + Integer height = new Integer(kernelHeight); + Integer width = new Integer(kernelWidth); + Integer iheight = new Integer(inputHeight); + Integer iwidth = new Integer(inputWidth); + Log.warn("The input resolution is smaller than the kernel. " + height.toString() + " " + width.toString() + " " + iheight.toString() + " " + iwidth.toString() + " " + "This results in an output resolution of 1x1. " + "If this warning appears multiple times, consider changing your architecture" , layer.getSourcePosition()); } - } + } } } @@ -200,28 +249,19 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } //NEW private static List computeOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); - int outputWidth; - int outputHeight; - int outputDepth; - if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { - outputWidth = 0; - outputHeight = 0; - outputDepth = 0; - } else { - outputWidth = (inputWidth + strideWidth - 1) / strideWidth; - outputHeight = (inputHeight + strideWidth - 1) / strideHeight; - outputDepth = (inputDepth + strideDepth - 1) / strideDepth; - } + int outputWidth = (inputWidth + strideWidth - 1) / strideWidth; + int outputHeight = (inputHeight + strideWidth - 1) / strideHeight; + int outputDepth = (inputDepth + strideDepth - 1) / strideDepth; return Collections.singletonList(new ArchTypeSymbol.Builder() .height(outputHeight) @@ -233,12 +273,12 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels) { - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); @@ -266,12 +306,9 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeUpConvOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); @@ -280,10 +317,16 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int outputHeight; int outputDepth; + //Integer iDepth = new Integer(inputDepth); + //Integer stride = new Integer(strideDepth); + outputWidth = inputWidth * strideWidth; outputHeight = inputHeight * strideHeight; outputDepth = inputDepth * strideDepth; + //Integer oDepth = new Integer(outputDepth); + //System.out.println("In computeUpConvShape: " + iDepth.toString() + " " + stride.toString() + " " + oDepth.toString()); + return Collections.singletonList(new ArchTypeSymbol.Builder() .height(outputHeight) .width(outputWidth) @@ -294,12 +337,12 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeUpConvOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ - int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); - int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); - int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); - int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); - int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); - int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java index abd1d0c..34a7f91 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java @@ -22,13 +22,27 @@ public class LeakyRelu extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(layer.getInputTypes().get(0).getChannels()) - .height(layer.getInputTypes().get(0).getHeight()) - .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "oo") - .build()); + Integer test = new Integer(inputTypes.get(0).getDepthIndex()); + System.out.println("Depth Index in LeakyRelu is: " + test.toString()); + if (inputTypes.get(0).getDepthIndex() == -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .elementType("0", "oo") + .build()); + } + else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType("0", "oo") + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java index 321c886..2954e04 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Relu.java @@ -25,13 +25,25 @@ public class Relu extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(layer.getInputTypes().get(0).getChannels()) - .height(layer.getInputTypes().get(0).getHeight()) - .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "oo") - .build()); + if (inputTypes.get(0).getDepthIndex() == -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .elementType("0", "oo") + .build()); + } + else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType("0", "oo") + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java index 83eea2d..79d286b 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java @@ -30,7 +30,7 @@ public class Reshape extends PredefinedLayerDeclaration { int channels = -1; int height = -1; int width = -1; - + int depth = -1; if (shape.size() >= 3) { width = shape.get(2); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java index e49cae0..4469fa7 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java @@ -52,11 +52,14 @@ public class Reshape3D extends PredefinedLayerDeclaration { } int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); - int newTotalSize = shape.stream().reduce(1, (x, y, z) -> x * y * z); + int newTotalSize = shape.stream().reduce(1, (x, y) -> x * y); if (totalSize != newTotalSize && newTotalSize != 0) { + Integer nts = new Integer(newTotalSize); + Integer ts = new Integer(totalSize); Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + "The input of Reshape layer cannot be reshaped to the given shape. " - + "Source and target shape have a different amount of total values", layer.getSourcePosition()); + + "Source and target shape have a different amount of total values " + + " newTotalSize = " + nts.toString() + " and totalSize = " + ts.toString(), layer.getSourcePosition()); } if (newTotalSize != 0) { diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java index 8bd782e..8350b2c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java @@ -25,13 +25,27 @@ public class Sigmoid extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(layer.getInputTypes().get(0).getChannels()) - .height(layer.getInputTypes().get(0).getHeight()) - .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "1") - .build()); + Integer test = new Integer(inputTypes.get(0).getDepthIndex()); + System.out.println("Depth Index in Sigmoid is: " + test.toString()); + if (inputTypes.get(0).getDepthIndex() == -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .elementType("0", "oo") + .build()); + } + else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType("0", "oo") + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java index 01460ff..5b39378 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -21,7 +21,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return computeUpConvOutputShape(inputTypes.get(0), + return computeUpConvOutputShape(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } -- GitLab From 8498da356e4b73ee023561e2323dd06cb99cbd3b Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 14:59:02 +0200 Subject: [PATCH 65/92] creates the 3DConvolution class and adds the name of the 3DConv layer to the AllPredefinedLayers class --- .../cnnarch/predefined/3DConvolution.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java new file mode 100644 index 0000000..f11695f --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java @@ -0,0 +1,71 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class 3DConvolution extends PredefinedLayerDeclaration { + + private 3DConvolution() { + super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + // TODO check here + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + errorIfInputSmallerThanKernel(inputTypes, layer); + } + + public static 3DConvolution create(){ + 3DConvolution declaration = new 3DConvolution(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.PADDING_NAME) + .constraints(Constraints.PADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 230b906757b04755adb3b11f00a2c9ee1aed9133 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:03:40 +0200 Subject: [PATCH 66/92] Renames 3DConvolution to ThreeDConvolution --- .../{3DConvolution.java => ThreeDConvolution.java} | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{3DConvolution.java => ThreeDConvolution.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java index f11695f..9d68770 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class 3DConvolution extends PredefinedLayerDeclaration { +public class ThreeDConvolution extends PredefinedLayerDeclaration { - private 3DConvolution() { - super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + private ThreeDConvolution() { + super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); } @Override @@ -34,8 +34,8 @@ public class 3DConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static 3DConvolution create(){ - 3DConvolution declaration = new 3DConvolution(); + public static ThreeDConvolution create(){ + ThreeDConvolution declaration = new ThreeDConvolution(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From 68565548c9906ba831ae7bf800c935fee082fa37 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:36:49 +0200 Subject: [PATCH 67/92] Renames ThreeDConvolution to Convolution3D --- .../predefined/AllPredefinedLayers.java | 5 ++ .../cnnarch/predefined/Convolution3D.java | 6 +- .../cnnarch/predefined/ThreeDConvolution.java | 71 ------------------- 3 files changed, 8 insertions(+), 74 deletions(-) delete mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 1042c84..50f3bfb 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,9 +60,14 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; +<<<<<<< HEAD public static final String CONVOLUTION3D_NAME = "Convolution3D"; public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; public static final String RESHAPE3D_NAME = "Reshape3D"; +======= + public static final String CONVOLUTION3D_Name = "3DConvolution"; + +>>>>>>> Renames ThreeDConvolution to Convolution3D //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 5a0dd73..af18fbe 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -31,7 +31,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { errorIfInputSizeIsNotOne(inputTypes, layer); - errorIfInputSmallerThanKernel3D(inputTypes, layer); + errorIfInputSmallerThanKernel(inputTypes, layer); } public static Convolution3D create(){ @@ -48,7 +48,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.STRIDE_NAME) .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1, 1)) + .defaultValue(Arrays.asList(1, 1)) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.NOBIAS_NAME) @@ -58,7 +58,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.PADDING_NAME) .constraints(Constraints.PADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME3D) + .defaultValue(AllPredefinedLayers.PADDING_SAME) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.GROUPS_NAME) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java deleted file mode 100644 index 9d68770..0000000 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * - * (c) https://github.com/MontiCore/monticore - * - * The license generally applicable for this project - * can be found under https://github.com/MontiCore/monticore. - */ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.lang.monticar.cnnarch.predefined; - -import de.monticore.lang.monticar.cnnarch._symboltable.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ThreeDConvolution extends PredefinedLayerDeclaration { - - private ThreeDConvolution() { - super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); - } - - @Override - public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - // TODO check here - return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), - layer, - layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); - } - - @Override - public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - errorIfInputSizeIsNotOne(inputTypes, layer); - errorIfInputSmallerThanKernel(inputTypes, layer); - } - - public static ThreeDConvolution create(){ - ThreeDConvolution declaration = new ThreeDConvolution(); - List parameters = new ArrayList<>(Arrays.asList( - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.KERNEL_NAME) - .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.CHANNELS_NAME) - .constraints(Constraints.INTEGER, Constraints.POSITIVE) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.STRIDE_NAME) - .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.NOBIAS_NAME) - .constraints(Constraints.BOOLEAN) - .defaultValue(false) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.PADDING_NAME) - .constraints(Constraints.PADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.GROUPS_NAME) - .constraints(Constraints.INTEGER, Constraints.POSITIVE) - .defaultValue(1) - .build())); - declaration.setParameters(parameters); - return declaration; - } -} -- GitLab From af906abbac9b5c167c318a70661c134848082436 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:11:40 +0200 Subject: [PATCH 68/92] Adds the 3D up convolution layer class and name in predefinedLayers --- .../lang/monticar/cnnarch/predefined/AllPredefinedLayers.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 50f3bfb..bd7f43c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -66,6 +66,7 @@ public class AllPredefinedLayers { public static final String RESHAPE3D_NAME = "Reshape3D"; ======= public static final String CONVOLUTION3D_Name = "3DConvolution"; + public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; >>>>>>> Renames ThreeDConvolution to Convolution3D -- GitLab From cf68a040c415583c85b90e23743218806df1a68e Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 24 Apr 2021 10:12:14 +0200 Subject: [PATCH 69/92] Fix small syntax bug --- .../monticar/cnnarch/predefined/AllPredefinedLayers.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index bd7f43c..1042c84 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -60,15 +60,9 @@ public class AllPredefinedLayers { public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; public static final String CUSTOM_LAYER = "CustomLayer"; -<<<<<<< HEAD public static final String CONVOLUTION3D_NAME = "Convolution3D"; public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; public static final String RESHAPE3D_NAME = "Reshape3D"; -======= - public static final String CONVOLUTION3D_Name = "3DConvolution"; - public static final String UP_CONVOLUTION3D_Name = "3DConvolution"; - ->>>>>>> Renames ThreeDConvolution to Convolution3D //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; -- GitLab From 041031a000050a549330f459c361da709f3e8f86 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 14:59:02 +0200 Subject: [PATCH 70/92] creates the 3DConvolution class and adds the name of the 3DConv layer to the AllPredefinedLayers class --- .../cnnarch/predefined/3DConvolution.java | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java new file mode 100644 index 0000000..f11695f --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java @@ -0,0 +1,71 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class 3DConvolution extends PredefinedLayerDeclaration { + + private 3DConvolution() { + super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + // TODO check here + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + errorIfInputSmallerThanKernel(inputTypes, layer); + } + + public static 3DConvolution create(){ + 3DConvolution declaration = new 3DConvolution(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.PADDING_NAME) + .constraints(Constraints.PADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} -- GitLab From 2146310c7cc038c0886293e53a26b0b9fb95eb75 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:03:40 +0200 Subject: [PATCH 71/92] Renames 3DConvolution to ThreeDConvolution --- .../cnnarch/predefined/AllPredefinedLayers.java | 1 + .../{3DConvolution.java => ThreeDConvolution.java} | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) rename src/main/java/de/monticore/lang/monticar/cnnarch/predefined/{3DConvolution.java => ThreeDConvolution.java} (90%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index 1042c84..f12f747 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -64,6 +64,7 @@ public class AllPredefinedLayers { public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; public static final String RESHAPE3D_NAME = "Reshape3D"; + //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; public static final String EPISODIC_MEMORY_NAME = "EpisodicMemory"; diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java similarity index 90% rename from src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java rename to src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java index f11695f..9d68770 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/3DConvolution.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java @@ -14,10 +14,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class 3DConvolution extends PredefinedLayerDeclaration { +public class ThreeDConvolution extends PredefinedLayerDeclaration { - private 3DConvolution() { - super(AllPredefinedLayers.ThreeDCONVOLUTION_NAME); + private ThreeDConvolution() { + super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); } @Override @@ -34,8 +34,8 @@ public class 3DConvolution extends PredefinedLayerDeclaration { errorIfInputSmallerThanKernel(inputTypes, layer); } - public static 3DConvolution create(){ - 3DConvolution declaration = new 3DConvolution(); + public static ThreeDConvolution create(){ + ThreeDConvolution declaration = new ThreeDConvolution(); List parameters = new ArrayList<>(Arrays.asList( new ParameterSymbol.Builder() .name(AllPredefinedLayers.KERNEL_NAME) -- GitLab From 2b903f8a55c482b541a31a0ee53b3ac9498c2c7e Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 21 Apr 2021 15:36:49 +0200 Subject: [PATCH 72/92] Renames ThreeDConvolution to Convolution3D --- .../cnnarch/predefined/ThreeDConvolution.java | 71 ------------------- 1 file changed, 71 deletions(-) delete mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java deleted file mode 100644 index 9d68770..0000000 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/ThreeDConvolution.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * - * (c) https://github.com/MontiCore/monticore - * - * The license generally applicable for this project - * can be found under https://github.com/MontiCore/monticore. - */ -/* (c) https://github.com/MontiCore/monticore */ -package de.monticore.lang.monticar.cnnarch.predefined; - -import de.monticore.lang.monticar.cnnarch._symboltable.*; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ThreeDConvolution extends PredefinedLayerDeclaration { - - private ThreeDConvolution() { - super(AllPredefinedLayers.THREED_CONVOLUTION_NAME); - } - - @Override - public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - // TODO check here - return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), - layer, - layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); - } - - @Override - public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - errorIfInputSizeIsNotOne(inputTypes, layer); - errorIfInputSmallerThanKernel(inputTypes, layer); - } - - public static ThreeDConvolution create(){ - ThreeDConvolution declaration = new ThreeDConvolution(); - List parameters = new ArrayList<>(Arrays.asList( - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.KERNEL_NAME) - .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.CHANNELS_NAME) - .constraints(Constraints.INTEGER, Constraints.POSITIVE) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.STRIDE_NAME) - .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.NOBIAS_NAME) - .constraints(Constraints.BOOLEAN) - .defaultValue(false) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.PADDING_NAME) - .constraints(Constraints.PADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) - .build(), - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.GROUPS_NAME) - .constraints(Constraints.INTEGER, Constraints.POSITIVE) - .defaultValue(1) - .build())); - declaration.setParameters(parameters); - return declaration; - } -} -- GitLab From c2453a779a23982cb508dfcf27814fa8e08e3a8c Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 26 May 2021 15:35:23 +0200 Subject: [PATCH 73/92] Adds the depth dimension for 3d data --- .../lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index b737c89..53aeb7d 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -94,8 +94,9 @@ public class ArchTypeSymbol extends CommonSymbol { return depthIndex; } - public void setDepthIndex(int depthIndexi){ - this.depthIndex = depthIndexi; + public void setDepthIndex(int depthIndex){ + this.depthIndex = depthIndex; + } //END NEW public ArchSimpleExpressionSymbol getHeightSymbol() { -- GitLab From 8ca29ae7fc85d22cc62e5d5c9b0a0b677ada1d32 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 28 May 2021 11:31:54 +0200 Subject: [PATCH 74/92] Adds computeOutputShapewithPadding for 3d Data --- .../PredefinedLayerDeclaration.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index 4261000..ec43486 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -255,13 +255,23 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); - int outputWidth = (inputWidth + strideWidth - 1) / strideWidth; - int outputHeight = (inputHeight + strideWidth - 1) / strideHeight; - int outputDepth = (inputDepth + strideDepth - 1) / strideDepth; + int outputWidth; + int outputHeight; + int outputDepth; + if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { + outputWidth = 0; + outputHeight = 0; + outputDepth = 0; + } else { + outputWidth = (inputWidth + strideWidth - 1) / strideWidth; + outputHeight = (inputHeight + strideWidth - 1) / strideHeight; + outputDepth = (inputDepth + strideDepth - 1) / strideDepth; + } return Collections.singletonList(new ArchTypeSymbol.Builder() .height(outputHeight) @@ -273,12 +283,14 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels) { +<<<<<<< HEAD int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); @@ -309,6 +321,7 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); @@ -343,6 +356,7 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); -- GitLab From 8fbcf71b5d61444069e2b63c13b1ef6635b796cc Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 1 Jun 2021 12:17:19 +0200 Subject: [PATCH 75/92] Fixes Stride and Padding being incorrect --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index af18fbe..3603736 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -48,7 +48,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.STRIDE_NAME) .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) - .defaultValue(Arrays.asList(1, 1)) + .defaultValue(Arrays.asList(1, 1, 1)) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.NOBIAS_NAME) @@ -58,7 +58,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { new ParameterSymbol.Builder() .name(AllPredefinedLayers.PADDING_NAME) .constraints(Constraints.PADDING_TYPE) - .defaultValue(AllPredefinedLayers.PADDING_SAME) + .defaultValue(AllPredefinedLayers.PADDING_SAME3D) .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.GROUPS_NAME) -- GitLab From db6e4f13f744a623183ad6a02de2dccabdbe8e7d Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 5 Jun 2021 11:57:08 +0200 Subject: [PATCH 76/92] Change checks for 3d values --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 3603736..0bd876a 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -23,7 +23,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { // TODO check here - return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + return computeConvAndPoolOutputShape3D(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } @@ -31,7 +31,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { errorIfInputSizeIsNotOne(inputTypes, layer); - errorIfInputSmallerThanKernel(inputTypes, layer); + errorIfInputSmallerThanKernel3D(inputTypes, layer); } public static Convolution3D create(){ -- GitLab From 9863bbf577332499ee1cbf81efbb098bb7cc78fe Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 5 Jun 2021 11:58:20 +0200 Subject: [PATCH 77/92] Remake a change --- .../lang/monticar/cnnarch/predefined/Convolution3D.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 0bd876a..5a0dd73 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -23,7 +23,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { // TODO check here - return computeConvAndPoolOutputShape3D(layer.getInputTypes().get(0), + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), layer, layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); } -- GitLab From 102ed4d24e31a0c5540920eccde7e50f54b267bc Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 15 Jun 2021 18:33:35 +0200 Subject: [PATCH 78/92] Makes RelU and Sigmoid able to handle 3d data --- .../_symboltable/PredefinedLayerDeclaration.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index ec43486..b0ae364 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -260,18 +260,9 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); - int outputWidth; - int outputHeight; - int outputDepth; - if (inputWidth < kernelWidth || inputHeight < kernelHeight || inputDepth < kernelDepth) { - outputWidth = 0; - outputHeight = 0; - outputDepth = 0; - } else { - outputWidth = (inputWidth + strideWidth - 1) / strideWidth; - outputHeight = (inputHeight + strideWidth - 1) / strideHeight; - outputDepth = (inputDepth + strideDepth - 1) / strideDepth; - } + int outputWidth = (inputWidth + strideWidth - 1) / strideWidth; + int outputHeight = (inputHeight + strideWidth - 1) / strideHeight; + int outputDepth = (inputDepth + strideDepth - 1) / strideDepth; return Collections.singletonList(new ArchTypeSymbol.Builder() .height(outputHeight) @@ -283,7 +274,6 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } private static List computeOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels) { -<<<<<<< HEAD int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); -- GitLab From 1aaf043ea1d889d033f3fb23fc1fc1b38a9b02e8 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 23 Jun 2021 12:33:55 +0200 Subject: [PATCH 79/92] Fixes Reshape --- .../predefined/Convolution3D.java~HEAD | 71 +++++++++++++++++++ .../monticar/cnnarch/predefined/Reshape.java | 49 ++++++++----- 2 files changed, 103 insertions(+), 17 deletions(-) create mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java~HEAD diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java~HEAD b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java~HEAD new file mode 100644 index 0000000..5a0dd73 --- /dev/null +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java~HEAD @@ -0,0 +1,71 @@ +/** + * + * (c) https://github.com/MontiCore/monticore + * + * The license generally applicable for this project + * can be found under https://github.com/MontiCore/monticore. + */ +/* (c) https://github.com/MontiCore/monticore */ +package de.monticore.lang.monticar.cnnarch.predefined; + +import de.monticore.lang.monticar.cnnarch._symboltable.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Convolution3D extends PredefinedLayerDeclaration { + + private Convolution3D() { + super(AllPredefinedLayers.CONVOLUTION3D_NAME); + } + + @Override + public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + // TODO check here + return computeConvAndPoolOutputShape(layer.getInputTypes().get(0), + layer, + layer.getIntValue(AllPredefinedLayers.CHANNELS_NAME).get()); + } + + @Override + public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { + errorIfInputSizeIsNotOne(inputTypes, layer); + errorIfInputSmallerThanKernel3D(inputTypes, layer); + } + + public static Convolution3D create(){ + Convolution3D declaration = new Convolution3D(); + List parameters = new ArrayList<>(Arrays.asList( + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.KERNEL_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.CHANNELS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.STRIDE_NAME) + .constraints(Constraints.INTEGER_TUPLE, Constraints.POSITIVE) + .defaultValue(Arrays.asList(1, 1, 1)) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.NOBIAS_NAME) + .constraints(Constraints.BOOLEAN) + .defaultValue(false) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.PADDING_NAME) + .constraints(Constraints.PADDING_TYPE) + .defaultValue(AllPredefinedLayers.PADDING_SAME3D) + .build(), + new ParameterSymbol.Builder() + .name(AllPredefinedLayers.GROUPS_NAME) + .constraints(Constraints.INTEGER, Constraints.POSITIVE) + .defaultValue(1) + .build())); + declaration.setParameters(parameters); + return declaration; + } +} diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java index 79d286b..84e0289 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java @@ -31,23 +31,30 @@ public class Reshape extends PredefinedLayerDeclaration { int height = -1; int width = -1; int depth = -1; + + if (shape.size() >= 4) { + depth = shape.get(1); + height = shape.get(2); + width = shape.get(3); + channels = shape.get(0); + } else { + + if (shape.size() >= 3) { + width = shape.get(2); + } - if (shape.size() >= 3) { - width = shape.get(2); - } - - if (shape.size() >= 2) { - height = shape.get(1); - } + if (shape.size() >= 2) { + height = shape.get(1); + } - if (shape.size() >= 1) { - channels = shape.get(0); - } else { - Log.error("0" + ErrorCodes.ILLEGAL_PARAMETER_VALUE + "\"Shape\" argument needs to contain at least one entry" - , layer.getSourcePosition()); - } + if (shape.size() >= 1) { + channels = shape.get(0); + } else { + Log.error("0" + ErrorCodes.ILLEGAL_PARAMETER_VALUE + "\"Shape\" argument needs to contain at least one entry" + , layer.getSourcePosition()); + } - int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth(); + int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); int newTotalSize = shape.stream().reduce(1, (x, y) -> x * y); if (totalSize != newTotalSize && newTotalSize != 0) { @@ -56,8 +63,16 @@ public class Reshape extends PredefinedLayerDeclaration { } if (newTotalSize != 0) { - - if (width != -1) { + if (depth != -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .height(height) + .width(width) + .depth(depth) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } else if (width != -1) { return Collections.singletonList( new ArchTypeSymbol.Builder() .channels(channels) @@ -98,4 +113,4 @@ public class Reshape extends PredefinedLayerDeclaration { declaration.setParameters(parameters); return declaration; } -} \ No newline at end of file +} -- GitLab From eee8d1ba732500e8dafcc58690b6d71e399f6b5f Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 23 Jun 2021 12:40:10 +0200 Subject: [PATCH 80/92] Fix bug --- .../lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index 896dd38..cb6f3e4 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -96,7 +96,7 @@ public class ArchTypeSymbol extends CommonSymbol { public void setDepthIndex(int depthIndex){ this.depthIndex = depthIndex; - + } //END NEW public ArchSimpleExpressionSymbol getHeightSymbol() { if (getHeightIndex() == -1){ -- GitLab From b79e234ee29f370bf83a43c84c0386fea1a80cf1 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sun, 27 Jun 2021 23:25:07 +0200 Subject: [PATCH 81/92] Fixes --- .../cnnarch/_symboltable/PredefinedLayerDeclaration.java | 3 ++- .../de/monticore/lang/monticar/cnnarch/predefined/Reshape.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index b0ae364..81ca89f 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -165,8 +165,9 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol Integer iheight = new Integer(inputHeight); Integer iwidth = new Integer(inputWidth); Integer idepth = new Integer(inputDepth); + Integer channel = new Integer(inputTypes.get(0).getChannels()); Log.warn("The input resolution is smaller than the kernel. " + height.toString() + " " + width.toString() + " " + depth.toString() + " " + iheight.toString() + " " + iwidth.toString() + " " + idepth.toString() + " " + - "This results in an output resolution of 1x1. " + "Depth Index is: " + depthI.toString() + " " + + "This results in an output resolution of 1x1. " + "Depth Index is: " + depthI.toString() + " " + "Channel is: " + channel.toString() + " " + "If this warning appears multiple times, consider changing your architecture" , layer.getSourcePosition()); } diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java index 84e0289..8d73406 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape.java @@ -53,7 +53,7 @@ public class Reshape extends PredefinedLayerDeclaration { Log.error("0" + ErrorCodes.ILLEGAL_PARAMETER_VALUE + "\"Shape\" argument needs to contain at least one entry" , layer.getSourcePosition()); } - + } int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); int newTotalSize = shape.stream().reduce(1, (x, y) -> x * y); -- GitLab From 65fd934c7e609e0ac97c9c64e74dcd328d807048 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 27 Jul 2021 18:22:15 +0200 Subject: [PATCH 82/92] Can use tuples for padding in 3dconvolutions --- .../cnnarch/_symboltable/ArchTypeSymbol.java | 11 +- .../cnnarch/_symboltable/Constraints.java | 57 ++++- .../PredefinedLayerDeclaration.java | 225 ++++++++++++++---- .../predefined/AllPredefinedLayers.java | 1 + .../cnnarch/predefined/Convolution3D.java | 2 +- .../cnnarch/predefined/LeakyRelu.java | 2 - .../cnnarch/predefined/Reshape3D.java | 20 +- .../monticar/cnnarch/predefined/Sigmoid.java | 2 - .../cnnarch/predefined/UpConvolution3D.java | 2 +- 9 files changed, 245 insertions(+), 77 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index cb6f3e4..f64f5f4 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -122,7 +122,6 @@ public class ArchTypeSymbol extends CommonSymbol { //NEW public ArchSimpleExpressionSymbol getDepthSymbol() { if (getDepthIndex() == -1){ - java.lang.System.out.println("Depth Index is -1"); return ArchSimpleExpressionSymbol.of(1); } return getDimensionSymbols().get(getDepthIndex()); @@ -254,7 +253,7 @@ public class ArchTypeSymbol extends CommonSymbol { public void printDimensions(){ for (ArchSimpleExpressionSymbol dimension : getDimensionSymbols()){ - System.out.println("From Dimension list: " + dimension.getTextualRepresentation()); + //System.out.println("From Dimension list: " + dimension.getTextualRepresentation()); } } @@ -262,7 +261,7 @@ public class ArchTypeSymbol extends CommonSymbol { private int height = 1; private int width = 1; private int channels = 1; - private int depth = 1; + private int depth = 0; private ASTElementType domain = null; public Builder height(int height){ @@ -312,13 +311,13 @@ public class ArchTypeSymbol extends CommonSymbol { Integer test = new Integer(this.depth); Integer test2 = new Integer(sym.getDepth()); - System.out.println("Depth in builder is: " + test.toString() + " and depth is: " + test2.toString()); - if (this.depth != 1){ + + if (this.depth != 0){ sym.setHeightIndex(2); sym.setWidthIndex(3); sym.setDepthIndex(1); sym.setDimensions(Arrays.asList(channels, depth, height, width)); //Dimensions are in this order for mxnet - sym.printDimensions(); + //sym.printDimensions(); } else { diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java index 6ba58ae..c82e79b 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java @@ -193,9 +193,7 @@ public enum Constraints { if (optString.isPresent()){ if (optString.get().equals(AllPredefinedLayers.PADDING_VALID) || optString.get().equals(AllPredefinedLayers.PADDING_SAME) - || optString.get().equals(AllPredefinedLayers.PADDING_NO_LOSS) - || optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) - || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D)){ + || optString.get().equals(AllPredefinedLayers.PADDING_NO_LOSS)){ return true; } } @@ -205,8 +203,7 @@ public enum Constraints { protected String msgString() { return AllPredefinedLayers.PADDING_VALID + ", " + AllPredefinedLayers.PADDING_SAME + ", " - + AllPredefinedLayers.PADDING_NO_LOSS + " or " - + AllPredefinedLayers.PADDING_SAME3D; + + AllPredefinedLayers.PADDING_NO_LOSS; } }, TRANSPADDING_TYPE { @@ -215,9 +212,7 @@ public enum Constraints { Optional optString= exp.getStringValue(); if (optString.isPresent()){ if (optString.get().equals(AllPredefinedLayers.PADDING_VALID) - || optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) - || optString.get().equals(AllPredefinedLayers.PADDING_SAME) - || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D)) { + || optString.get().equals(AllPredefinedLayers.PADDING_SAME)) { return true; } } @@ -226,11 +221,51 @@ public enum Constraints { @Override protected String msgString() { return AllPredefinedLayers.PADDING_VALID + ", " - + AllPredefinedLayers.PADDING_SAME + " or " - + AllPredefinedLayers.PADDING_SAME3D + " or " - + AllPredefinedLayers.PADDING_VALID3D; + + AllPredefinedLayers.PADDING_SAME; + } + }, + PADDING_TYPE3D { + @Override + public boolean isValid(ArchSimpleExpressionSymbol exp) { + Optional optString= exp.getStringValue(); + if (optString.isPresent()){ + if (optString.get().equals(AllPredefinedLayers.PADDING_VALID) + || optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SIMPLE3D)){ + return true; + } + } + return false || exp.isIntTuple().get(); + } + @Override + protected String msgString() { + return AllPredefinedLayers.PADDING_VALID3D + ", " + + AllPredefinedLayers.PADDING_SAME3D + ", " + + AllPredefinedLayers.PADDING_NO_LOSS + " or " + + AllPredefinedLayers.PADDING_SIMPLE3D; } }, + TRANSPADDING_TYPE3D { + @Override + public boolean isValid(ArchSimpleExpressionSymbol exp) { + Optional optString= exp.getStringValue(); + if (optString.isPresent()){ + if (optString.get().equals(AllPredefinedLayers.PADDING_VALID3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SAME3D) + || optString.get().equals(AllPredefinedLayers.PADDING_SIMPLE3D)){ + return true; + } + } + return false || exp.isIntTuple().get(); + } + @Override + protected String msgString() { + return AllPredefinedLayers.PADDING_VALID3D + ", " + + AllPredefinedLayers.PADDING_SAME3D + " or " + + AllPredefinedLayers.PADDING_SIMPLE3D; + } + }, POOL_TYPE { @Override public boolean isValid(ArchSimpleExpressionSymbol exp) { diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index 81ca89f..3d580c1 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -166,8 +166,8 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol Integer iwidth = new Integer(inputWidth); Integer idepth = new Integer(inputDepth); Integer channel = new Integer(inputTypes.get(0).getChannels()); - Log.warn("The input resolution is smaller than the kernel. " + height.toString() + " " + width.toString() + " " + depth.toString() + " " + iheight.toString() + " " + iwidth.toString() + " " + idepth.toString() + " " + - "This results in an output resolution of 1x1. " + "Depth Index is: " + depthI.toString() + " " + "Channel is: " + channel.toString() + " " + + Log.warn("The input resolution is smaller than the kernel. " + " " + + "This results in an output resolution of 1x1. " + " " + "If this warning appears multiple times, consider changing your architecture" , layer.getSourcePosition()); } @@ -196,7 +196,7 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol Integer width = new Integer(kernelWidth); Integer iheight = new Integer(inputHeight); Integer iwidth = new Integer(inputWidth); - Log.warn("The input resolution is smaller than the kernel. " + height.toString() + " " + width.toString() + " " + iheight.toString() + " " + iwidth.toString() + " " + + Log.warn("The input resolution is smaller than the kernel. " + " " + "This results in an output resolution of 1x1. " + "If this warning appears multiple times, consider changing your architecture" , layer.getSourcePosition()); @@ -206,37 +206,49 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } - //output type function for convolution and pooling + //output type function for convolution and poolingee protected static List computeConvAndPoolOutputShape(ArchTypeSymbol inputType, LayerSymbol method, int channels) { - String borderModeSetting = method.getStringValue(AllPredefinedLayers.PADDING_NAME).get(); - if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME)) { - return computeOutputShapeWithSamePadding(inputType, method, channels); - } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID)) { - return computeOutputShapeWithValidPadding(inputType, method, channels); - } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_NO_LOSS)) { - return computeOutputShapeWithNoLossPadding(inputType, method, channels); - } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES - return computeOutputShapeWithSamePadding3D(inputType, method, channels); - } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ - return computeOutputShapeWithValidPadding3D (inputType, method, channels); + if (method.getIntTupleValue(AllPredefinedLayers.PADDING_NAME).isPresent()){ //If the Padding is given in Tuple + return computeOutputShapeWithTupelPadding3D(inputType, method, channels); } else { - throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); + String borderModeSetting = method.getStringValue(AllPredefinedLayers.PADDING_NAME).get(); + if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME)) { + return computeOutputShapeWithSamePadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID)) { + return computeOutputShapeWithValidPadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_NO_LOSS)) { + return computeOutputShapeWithNoLossPadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES + return computeOutputShapeWithSamePadding3D(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ + return computeOutputShapeWithValidPadding3D (inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SIMPLE3D)){ + return computeOutputShapeWithSimplePadding3D (inputType, method, channels); + } else { + throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); + } } } //output type function for transposed convolution protected static List computeUpConvOutputShape(ArchTypeSymbol inputType, LayerSymbol method, int channels) { - String borderModeSetting = method.getStringValue(AllPredefinedLayers.TRANSPADDING_NAME).get(); - if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME)) { - return computeUpConvOutputShapeWithSamePadding(inputType, method, channels); - } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID)) { - return computeUpConvOutputShapeWithValidPadding(inputType, method, channels); - } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES - return computeUpConvOutputShapeWithSamePadding3D(inputType, method, channels); - } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ - return computeUpConvOutputShapeWithValidPadding3D (inputType, method, channels); + if (method.getIntTupleValue(AllPredefinedLayers.TRANSPADDING_NAME).isPresent()){ //If the Padding is given in Tuple + return computeUpOutputShapeWithTupelPadding3D(inputType, method, channels); } else { - throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); + String borderModeSetting = method.getStringValue(AllPredefinedLayers.TRANSPADDING_NAME).get(); + if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME)) { + return computeUpConvOutputShapeWithSamePadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID)) { + return computeUpConvOutputShapeWithValidPadding(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SAME3D)){ //Add 3D PADDING CASES + return computeUpConvOutputShapeWithSamePadding3D(inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_VALID3D)){ + return computeUpConvOutputShapeWithValidPadding3D (inputType, method, channels); + } else if (borderModeSetting.equals(AllPredefinedLayers.PADDING_SIMPLE3D)){ + return computeUpConvOutputShapeWithSimplePadding3D (inputType, method, channels); + } else { + throw new IllegalStateException("border_mode is " + borderModeSetting + ". This should never happen."); + } } } @@ -248,7 +260,8 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } layer.setIntValue(AllPredefinedLayers.SIZE_NAME, outputChannels); } -//NEW + + //Same padding should result in the output shape having the same size as the input shape private static List computeOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); @@ -262,7 +275,7 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int inputDepth = inputType.getDepth(); int outputWidth = (inputWidth + strideWidth - 1) / strideWidth; - int outputHeight = (inputHeight + strideWidth - 1) / strideHeight; + int outputHeight = (inputHeight + strideHeight - 1) / strideHeight; int outputDepth = (inputDepth + strideDepth - 1) / strideDepth; return Collections.singletonList(new ArchTypeSymbol.Builder() @@ -274,6 +287,7 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol .build()); } + //Padding of size (0,0,0) private static List computeOutputShapeWithValidPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels) { int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); @@ -294,9 +308,9 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol outputHeight = 0; outputDepth = 0; } else { - outputWidth = 1 + (inputWidth - kernelWidth) / strideWidth; - outputHeight = 1 + (inputHeight - kernelHeight) / strideHeight; - outputDepth = 1 + (inputDepth - kernelDepth) / strideDepth; + outputWidth = 1 + ((inputWidth - kernelWidth) / strideWidth); + outputHeight = 1 + ((inputHeight - kernelHeight) / strideHeight); + outputDepth = 1 + ((inputDepth - kernelDepth) / strideDepth); } return Collections.singletonList(new ArchTypeSymbol.Builder() @@ -308,25 +322,93 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol .build()); } - private static List computeUpConvOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + //Padding of size (1,1,1) + private static List computeOutputShapeWithSimplePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); int inputHeight = inputType.getHeight(); int inputWidth = inputType.getWidth(); int inputDepth = inputType.getDepth(); + int pad = 1; + int outputWidth; int outputHeight; int outputDepth; - //Integer iDepth = new Integer(inputDepth); - //Integer stride = new Integer(strideDepth); + if (inputWidth + 2*pad < kernelWidth || inputHeight + 2*pad < kernelHeight || inputDepth + 2*pad < kernelDepth) { + outputWidth = 0; + outputHeight = 0; + outputDepth = 0; + } else { + outputWidth = 1 + ((inputWidth - kernelWidth + 2* pad) / strideWidth); + outputHeight = 1 + ((inputHeight - kernelHeight + 2* pad) / strideHeight); + outputDepth = 1 + ((inputDepth - kernelDepth + 2* pad) / strideDepth); + } + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeOutputShapeWithTupelPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + + int paddingHeight = method.getIntTupleValue(AllPredefinedLayers.PADDING_NAME).get().get(1); + int paddingWidth = method.getIntTupleValue(AllPredefinedLayers.PADDING_NAME).get().get(2); + int paddingDepth = method.getIntTupleValue(AllPredefinedLayers.PADDING_NAME).get().get(0); + + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth = 1 + ((inputWidth - kernelWidth + 2*paddingWidth) / strideWidth); + int outputHeight = 1 + ((inputHeight - kernelHeight + 2*paddingHeight) / strideHeight); + int outputDepth = 1 + ((inputDepth - kernelDepth + 2*paddingDepth) / strideDepth); + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + + private static List computeUpConvOutputShapeWithSamePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); - outputWidth = inputWidth * strideWidth; - outputHeight = inputHeight * strideHeight; - outputDepth = inputDepth * strideDepth; + int outputWidth; + int outputHeight; + int outputDepth; + + outputWidth = strideWidth*inputWidth; + outputHeight = strideHeight*inputHeight; + outputDepth = strideDepth*inputDepth; //Integer oDepth = new Integer(outputDepth); //System.out.println("In computeUpConvShape: " + iDepth.toString() + " " + stride.toString() + " " + oDepth.toString()); @@ -356,9 +438,12 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int outputHeight; int outputDepth; - outputWidth = (inputWidth - 1) * strideWidth + kernelWidth; - outputHeight = (inputHeight - 1) * strideHeight + kernelHeight; - outputDepth = (inputDepth - 1) * strideDepth + kernelDepth; + //TEMPORARY + int pad = 0; + + outputWidth = (inputWidth - 1) * strideWidth + kernelWidth - 2*pad; + outputHeight = (inputHeight - 1) * strideHeight + kernelHeight - 2*pad; + outputDepth = (inputDepth - 1) * strideDepth + kernelDepth - 2*pad; return Collections.singletonList(new ArchTypeSymbol.Builder() .height(outputHeight) @@ -369,7 +454,65 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol .build()); } -//END NEW + private static List computeUpConvOutputShapeWithSimplePadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth; + int outputHeight; + int outputDepth; + + int pad = 1; + + outputWidth = (inputWidth - 1) * strideWidth + kernelWidth - 2*pad; + outputHeight = (inputHeight - 1) * strideHeight + kernelHeight - 2*pad; + outputDepth = (inputDepth - 1) * strideDepth + kernelDepth - 2*pad; + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } + + private static List computeUpOutputShapeWithTupelPadding3D(ArchTypeSymbol inputType, LayerSymbol method, int channels){ + int strideHeight = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(1); + int strideWidth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(2); + int strideDepth = method.getIntTupleValue(AllPredefinedLayers.STRIDE_NAME).get().get(0); + int kernelHeight = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); + int kernelWidth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); + int kernelDepth = method.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(0); + + int paddingHeight = method.getIntTupleValue(AllPredefinedLayers.TRANSPADDING_NAME).get().get(1); + int paddingWidth = method.getIntTupleValue(AllPredefinedLayers.TRANSPADDING_NAME).get().get(2); + int paddingDepth = method.getIntTupleValue(AllPredefinedLayers.TRANSPADDING_NAME).get().get(0); + + int inputHeight = inputType.getHeight(); + int inputWidth = inputType.getWidth(); + int inputDepth = inputType.getDepth(); + + int outputWidth = (inputWidth - 1) * strideWidth + kernelWidth - 2*paddingWidth; + int outputHeight = (inputHeight - 1) * strideHeight + kernelHeight - 2*paddingHeight; + int outputDepth = (inputDepth - 1) * strideDepth + kernelDepth - 2*paddingDepth; + + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(outputHeight) + .width(outputWidth) + .depth(outputDepth) + .channels(channels) + .elementType("-oo", "oo") + .build()); + } //padding with border_mode=valid, no padding diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index f12f747..a92159c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -150,6 +150,7 @@ public class AllPredefinedLayers { public static final String PADDING_NO_LOSS = "no_loss"; public static final String PADDING_VALID3D = "valid3d"; public static final String PADDING_SAME3D = "same3d"; + public static final String PADDING_SIMPLE3D = "simple3d"; public static final String POOL_MAX = "max"; public static final String POOL_AVG = "avg"; public static final String RANDOM = "random"; diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java index 5a0dd73..b972080 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Convolution3D.java @@ -57,7 +57,7 @@ public class Convolution3D extends PredefinedLayerDeclaration { .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.PADDING_NAME) - .constraints(Constraints.PADDING_TYPE) + .constraints(Constraints.PADDING_TYPE3D) //3D Padding Type also allows Tupels .defaultValue(AllPredefinedLayers.PADDING_SAME3D) .build(), new ParameterSymbol.Builder() diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java index 34a7f91..4c730b9 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/LeakyRelu.java @@ -22,8 +22,6 @@ public class LeakyRelu extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - Integer test = new Integer(inputTypes.get(0).getDepthIndex()); - System.out.println("Depth Index in LeakyRelu is: " + test.toString()); if (inputTypes.get(0).getDepthIndex() == -1) { return Collections.singletonList( new ArchTypeSymbol.Builder() diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java index 4469fa7..fd53ec1 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java @@ -32,24 +32,18 @@ public class Reshape3D extends PredefinedLayerDeclaration { int width = -1; int depth = -1; - if (shape.size() >= 4) { - width = shape.get(3); - } + + width = shape.get(3); - if (shape.size() >= 3) { - height = shape.get(2); - } + height = shape.get(2); - if (shape.size() >=2) { - depth = shape.get(1); - } + depth = shape.get(1); - if (shape.size() >= 1) { - channels = shape.get(0); - } else { + channels = shape.get(0); + /* else { Log.error("0" + ErrorCodes.ILLEGAL_PARAMETER_VALUE + "\"Shape\" argument needs to contain at least one entry" , layer.getSourcePosition()); - } + }*/ int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); int newTotalSize = shape.stream().reduce(1, (x, y) -> x * y); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java index 8350b2c..24961cf 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java @@ -25,8 +25,6 @@ public class Sigmoid extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - Integer test = new Integer(inputTypes.get(0).getDepthIndex()); - System.out.println("Depth Index in Sigmoid is: " + test.toString()); if (inputTypes.get(0).getDepthIndex() == -1) { return Collections.singletonList( new ArchTypeSymbol.Builder() diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java index 5b39378..e44a631 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/UpConvolution3D.java @@ -54,7 +54,7 @@ public class UpConvolution3D extends PredefinedLayerDeclaration { .build(), new ParameterSymbol.Builder() .name(AllPredefinedLayers.TRANSPADDING_NAME) - .constraints(Constraints.TRANSPADDING_TYPE) + .constraints(Constraints.TRANSPADDING_TYPE3D) .defaultValue(AllPredefinedLayers.PADDING_SAME3D) .build(), new ParameterSymbol.Builder() -- GitLab From adb58c8c375f84b9cb02902cdcf67fdebabb602c Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Wed, 28 Jul 2021 20:16:17 +0200 Subject: [PATCH 83/92] I'm not sure --- .../lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java | 3 --- .../monticore/lang/monticar/cnnarch/predefined/Sigmoid.java | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java index f64f5f4..3755375 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchTypeSymbol.java @@ -308,9 +308,6 @@ public class ArchTypeSymbol extends CommonSymbol { sym.setChannelIndex(0); sym.setHeightIndex(1); sym.setWidthIndex(2); - - Integer test = new Integer(this.depth); - Integer test2 = new Integer(sym.getDepth()); if (this.depth != 0){ sym.setHeightIndex(2); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java index 24961cf..b72f292 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java @@ -25,12 +25,13 @@ public class Sigmoid extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - if (inputTypes.get(0).getDepthIndex() == -1) { + if (inputTypes.get(0).getDepthIndex() >= -1) { return Collections.singletonList( new ArchTypeSymbol.Builder() .channels(layer.getInputTypes().get(0).getChannels()) .height(layer.getInputTypes().get(0).getHeight()) .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) .elementType("0", "oo") .build()); } @@ -40,7 +41,6 @@ public class Sigmoid extends PredefinedLayerDeclaration { .channels(layer.getInputTypes().get(0).getChannels()) .height(layer.getInputTypes().get(0).getHeight()) .width(layer.getInputTypes().get(0).getWidth()) - .depth(layer.getInputTypes().get(0).getDepth()) .elementType("0", "oo") .build()); } -- GitLab From 6a232ee1389c22198a5a425a5df74e177b15a124 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Tue, 3 Aug 2021 13:35:01 +0200 Subject: [PATCH 84/92] Fix the Sigmoid Test --- .../monticore/lang/monticar/cnnarch/predefined/Sigmoid.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java index b72f292..8b087fe 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Sigmoid.java @@ -25,14 +25,14 @@ public class Sigmoid extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - if (inputTypes.get(0).getDepthIndex() >= -1) { + if (inputTypes.get(0).getDepthIndex() > -1) { return Collections.singletonList( new ArchTypeSymbol.Builder() .channels(layer.getInputTypes().get(0).getChannels()) .height(layer.getInputTypes().get(0).getHeight()) .width(layer.getInputTypes().get(0).getWidth()) .depth(layer.getInputTypes().get(0).getDepth()) - .elementType("0", "oo") + .elementType("0", "1") .build()); } else { @@ -41,7 +41,7 @@ public class Sigmoid extends PredefinedLayerDeclaration { .channels(layer.getInputTypes().get(0).getChannels()) .height(layer.getInputTypes().get(0).getHeight()) .width(layer.getInputTypes().get(0).getWidth()) - .elementType("0", "oo") + .elementType("0", "1") .build()); } } -- GitLab From 4a2087d80735678b9228db684c676bf5dd7c20fa Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 20 Aug 2021 15:33:51 +0200 Subject: [PATCH 85/92] Change FullyConnected to accept 3D data --- .../cnnarch/_symboltable/Constraints.java | 2 +- .../PredefinedLayerDeclaration.java | 1 - .../cnnarch/predefined/Concatenate.java | 28 +++++-- .../cnnarch/predefined/FullyConnected.java | 74 +++++++++++++++---- 4 files changed, 82 insertions(+), 23 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java index c82e79b..8cdf99d 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/Constraints.java @@ -265,7 +265,7 @@ public enum Constraints { + AllPredefinedLayers.PADDING_SAME3D + " or " + AllPredefinedLayers.PADDING_SIMPLE3D; } - }, + }, POOL_TYPE { @Override public boolean isValid(ArchSimpleExpressionSymbol exp) { diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index 3d580c1..cc0f4ea 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -146,7 +146,6 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol int inputWidth = inputTypes.get(0).getWidth(); int inputDepth = inputTypes.get(0).getDepth(); Integer depthI = new Integer(inputTypes.get(0).getDepthIndex()); - //System.out.println("Depth Index is: " + depthI.toString() + " in PredefinedLayerDecl"); int kernelHeight = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(1); int kernelWidth = layer.getIntTupleValue(AllPredefinedLayers.KERNEL_NAME).get().get(2); diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Concatenate.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Concatenate.java index 1e07d13..f80870c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Concatenate.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Concatenate.java @@ -29,6 +29,9 @@ public class Concatenate extends PredefinedLayerDeclaration { int channels = layer.getInputTypes().get(0).getChannels(); int height = layer.getInputTypes().get(0).getHeight(); int width = layer.getInputTypes().get(0).getWidth(); + if (inputTypes.get(0).getDepthIndex() > -1) { + int depth = layer.getInputTypes().get(0).getDepth(); + } int axis = layer.getIntValue(AllPredefinedLayers.AXIS_NAME).get(); @@ -50,13 +53,24 @@ public class Concatenate extends PredefinedLayerDeclaration { width += inputShape.getWidth(); } } - - return Collections.singletonList(new ArchTypeSymbol.Builder() - .channels(channels) - .height(height) - .width(width) - .elementType(range.get(0), range.get(1)) - .build()); + if (inputTypes.get(0).getDepthIndex() > -1) { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(layer.getInputTypes().get(0).getChannels()) + .height(layer.getInputTypes().get(0).getHeight()) + .width(layer.getInputTypes().get(0).getWidth()) + .depth(layer.getInputTypes().get(0).getDepth()) + .elementType(range.get(0), range.get(1)) + .build()); + } else { + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(channels) + .height(height) + .width(width) + .elementType(range.get(0), range.get(1)) + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/FullyConnected.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/FullyConnected.java index 320dbda..deb5374 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/FullyConnected.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/FullyConnected.java @@ -27,21 +27,41 @@ public class FullyConnected extends PredefinedLayerDeclaration { int units = layer.getIntValue(AllPredefinedLayers.UNITS_NAME).get(); if (flatten) { - return Collections.singletonList(new ArchTypeSymbol.Builder() - .channels(units) - .height(1) - .width(1) - .elementType("-oo", "oo") - .build()); + if (inputTypes.get(0).getDepthIndex() == -1){ + return Collections.singletonList(new ArchTypeSymbol.Builder() + .channels(units) + .height(1) + .width(1) + .elementType("-oo", "oo") + .build()); + } else { + + return Collections.singletonList( + new ArchTypeSymbol.Builder() + .channels(units) + .height(1) + .width(1) + .depth(1) + .elementType("0", "oo") + .build()); + } } else { ArchTypeSymbol inputType = layer.getInputTypes().get(0); + if (inputTypes.get(0).getDepthIndex() == -1){ //2D Cases + if (inputType.getWidth() == 1) { + if (inputType.getHeight() == 1) { + return Collections.singletonList(new ArchTypeSymbol.Builder() + .channels(units) + .height(1) + .width(1) + .elementType("-oo", "oo") + .build()); + } - if (inputType.getWidth() == 1) { - if (inputType.getHeight() == 1) { return Collections.singletonList(new ArchTypeSymbol.Builder() - .channels(units) - .height(1) + .channels(inputType.getChannels()) + .height(units) .width(1) .elementType("-oo", "oo") .build()); @@ -49,18 +69,44 @@ public class FullyConnected extends PredefinedLayerDeclaration { return Collections.singletonList(new ArchTypeSymbol.Builder() .channels(inputType.getChannels()) - .height(units) - .width(1) + .height(inputType.getHeight()) + .width(units) .elementType("-oo", "oo") .build()); } - - return Collections.singletonList(new ArchTypeSymbol.Builder() + } else { //3D Cases + if (inputType.getWidth() == 1) { + if (inputType.getHeight() == 1) { + if (inputType.getDepth() == 1){ + return Collections.singletonList(new ArchTypeSymbol.Builder() + .channels(units) + .height(1) + .width(1) + .depth(1) + .elementType("-oo", "oo") + .build()); + } return Collections.singletonList(new ArchTypeSymbol.Builder() + .channels(inputType.getChannels()) + .height(1) + .width(1) + .depth(units) + .elementType("-oo", "oo") + .build()); + } return Collections.singletonList(new ArchTypeSymbol.Builder() + .channels(inputType.getChannels()) + .height(units) + .width(1) + .depth(inputType.getDepth()) + .elementType("-oo", "oo") + .build()); + } return Collections.singletonList(new ArchTypeSymbol.Builder() .channels(inputType.getChannels()) .height(inputType.getHeight()) .width(units) + .depth(inputType.getDepth()) .elementType("-oo", "oo") .build()); + } } } -- GitLab From febede7e7dc89e7dedc598a4b3d8153731b2c48b Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Thu, 9 Sep 2021 21:56:38 +0200 Subject: [PATCH 86/92] Removes Reshape3D --- .../predefined/AllPredefinedLayers.java | 4 +- .../monticar/cnnarch/predefined/Flatten.java | 29 +++-- .../cnnarch/predefined/FullyConnected.java | 59 +++++---- .../cnnarch/predefined/Reshape3D.java | 112 ------------------ 4 files changed, 51 insertions(+), 153 deletions(-) delete mode 100644 src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index a92159c..efc0a6d 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -62,7 +62,6 @@ public class AllPredefinedLayers { public static final String CUSTOM_LAYER = "CustomLayer"; public static final String CONVOLUTION3D_NAME = "Convolution3D"; public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; - public static final String RESHAPE3D_NAME = "Reshape3D"; //replay layers @@ -207,8 +206,7 @@ public class AllPredefinedLayers { LargeMemory.create(), EpisodicMemory.create(), Convolution3D.create(), - UpConvolution3D.create(), - Reshape3D.create()); + UpConvolution3D.create()); } public static List createUnrollList(){ diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Flatten.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Flatten.java index b0460fe..bfe744c 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Flatten.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Flatten.java @@ -25,14 +25,27 @@ public class Flatten extends PredefinedLayerDeclaration { @Override public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - return Collections.singletonList(new ArchTypeSymbol.Builder() - .height(1) - .width(1) - .channels(layer.getInputTypes().get(0).getHeight() - * layer.getInputTypes().get(0).getWidth() - * layer.getInputTypes().get(0).getChannels()) - .elementType(layer.getInputTypes().get(0).getDomain()) - .build()); + if (inputTypes.get(0).getDepthIndex() == -1){ + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(1) + .width(1) + .channels(layer.getInputTypes().get(0).getHeight() + * layer.getInputTypes().get(0).getWidth() + * layer.getInputTypes().get(0).getChannels()) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } else { + return Collections.singletonList(new ArchTypeSymbol.Builder() + .height(1) + .width(1) + .depth(1) + .channels(layer.getInputTypes().get(0).getHeight() + * layer.getInputTypes().get(0).getWidth() + * layer.getInputTypes().get(0).getChannels() + * layer.getInputTypes().get(0).getDepth()) + .elementType(layer.getInputTypes().get(0).getDomain()) + .build()); + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/FullyConnected.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/FullyConnected.java index deb5374..bd3e444 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/FullyConnected.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/FullyConnected.java @@ -73,41 +73,40 @@ public class FullyConnected extends PredefinedLayerDeclaration { .width(units) .elementType("-oo", "oo") .build()); - } - } else { //3D Cases - if (inputType.getWidth() == 1) { - if (inputType.getHeight() == 1) { - if (inputType.getDepth() == 1){ - return Collections.singletonList(new ArchTypeSymbol.Builder() - .channels(units) - .height(1) - .width(1) - .depth(1) - .elementType("-oo", "oo") - .build()); + } else { //3D Cases + if (inputType.getWidth() == 1) { + if (inputType.getHeight() == 1) { + if (inputType.getDepth() == 1){ + return Collections.singletonList(new ArchTypeSymbol.Builder() + .channels(units) + .height(1) + .width(1) + .depth(1) + .elementType("-oo", "oo") + .build()); + } return Collections.singletonList(new ArchTypeSymbol.Builder() + .channels(inputType.getChannels()) + .height(1) + .width(1) + .depth(units) + .elementType("-oo", "oo") + .build()); + } return Collections.singletonList(new ArchTypeSymbol.Builder() + .channels(inputType.getChannels()) + .height(units) + .width(1) + .depth(inputType.getDepth()) + .elementType("-oo", "oo") + .build()); } return Collections.singletonList(new ArchTypeSymbol.Builder() .channels(inputType.getChannels()) - .height(1) - .width(1) - .depth(units) - .elementType("-oo", "oo") - .build()); - } return Collections.singletonList(new ArchTypeSymbol.Builder() - .channels(inputType.getChannels()) - .height(units) - .width(1) + .height(inputType.getHeight()) + .width(units) .depth(inputType.getDepth()) .elementType("-oo", "oo") .build()); - } return Collections.singletonList(new ArchTypeSymbol.Builder() - .channels(inputType.getChannels()) - .height(inputType.getHeight()) - .width(units) - .depth(inputType.getDepth()) - .elementType("-oo", "oo") - .build()); - } - } + } + } } @Override diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java deleted file mode 100644 index fd53ec1..0000000 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/Reshape3D.java +++ /dev/null @@ -1,112 +0,0 @@ -/** - * - * (c) https://github.com/MontiCore/monticore - * - * The license generally applicable for this project - * can be found under https://github.com/MontiCore/monticore. - */ -package de.monticore.lang.monticar.cnnarch.predefined; - -import de.monticore.lang.monticar.cnnarch._symboltable.*; -import de.monticore.lang.monticar.cnnarch.helper.ErrorCodes; -import de.se_rwth.commons.logging.Log; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class Reshape3D extends PredefinedLayerDeclaration { - - private Reshape3D() { - super(AllPredefinedLayers.RESHAPE3D_NAME); - } - - @Override - public List computeOutputTypes(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - - List shape = layer.getIntTupleValue(AllPredefinedLayers.SHAPE_NAME).get(); - - int channels = -1; - int height = -1; - int width = -1; - int depth = -1; - - - width = shape.get(3); - - height = shape.get(2); - - depth = shape.get(1); - - channels = shape.get(0); - /* else { - Log.error("0" + ErrorCodes.ILLEGAL_PARAMETER_VALUE + "\"Shape\" argument needs to contain at least one entry" - , layer.getSourcePosition()); - }*/ - - int totalSize = layer.getInputTypes().get(0).getChannels() * layer.getInputTypes().get(0).getHeight() * layer.getInputTypes().get(0).getWidth() * layer.getInputTypes().get(0).getDepth(); - int newTotalSize = shape.stream().reduce(1, (x, y) -> x * y); - - if (totalSize != newTotalSize && newTotalSize != 0) { - Integer nts = new Integer(newTotalSize); - Integer ts = new Integer(totalSize); - Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_SHAPE + "The input of Reshape layer cannot be reshaped to the given shape. " - + "Source and target shape have a different amount of total values " - + " newTotalSize = " + nts.toString() + " and totalSize = " + ts.toString(), layer.getSourcePosition()); - } - - if (newTotalSize != 0) { - - if (width != -1) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(channels) - .height(height) - .width(width) - .depth(depth) - .elementType(layer.getInputTypes().get(0).getDomain()) - .build()); - } else if (height != -1) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(channels) - .height(height) - .depth(depth) - .elementType(layer.getInputTypes().get(0).getDomain()) - .build()); - } else if (depth != -1) { - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(channels) - .depth(depth) - .elementType(layer.getInputTypes().get(0).getDomain()) - .build()); - } - else{ - return Collections.singletonList( - new ArchTypeSymbol.Builder() - .channels(channels) - .elementType(layer.getInputTypes().get(0).getDomain()) - .build()); - } - } - return Collections.emptyList(); - } - - @Override - public void checkInput(List inputTypes, LayerSymbol layer, VariableSymbol.Member member) { - errorIfInputSizeIsNotOne(inputTypes, layer); - } - - public static Reshape3D create(){ - Reshape3D declaration = new Reshape3D(); - List parameters = new ArrayList<>(Arrays.asList( - new ParameterSymbol.Builder() - .name(AllPredefinedLayers.SHAPE_NAME) - .constraints(Constraints.INTEGER_TUPLE) - .build())); - declaration.setParameters(parameters); - return declaration; - } -} -- GitLab From 9ca7d6913b65f864b395ed098ed7492a673a7e98 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 10 Sep 2021 16:23:23 +0200 Subject: [PATCH 87/92] Create test networks for Conv and Upconv 3D --- .../valid_tests/SimpleNetwork3DConvolution.cnna | 10 ++++++++++ .../valid_tests/SimpleNetwork3DUpConvolution.cnna | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/test/resources/valid_tests/SimpleNetwork3DConvolution.cnna create mode 100644 src/test/resources/valid_tests/SimpleNetwork3DUpConvolution.cnna diff --git a/src/test/resources/valid_tests/SimpleNetwork3DConvolution.cnna b/src/test/resources/valid_tests/SimpleNetwork3DConvolution.cnna new file mode 100644 index 0000000..1dd1603 --- /dev/null +++ b/src/test/resources/valid_tests/SimpleNetwork3DConvolution.cnna @@ -0,0 +1,10 @@ +architecture SimpleNetworkLinear(inputs=80, classes=2){ + def input Q(-oo:+oo)^{inputs} in1 + def output Q(-oo:oo)^{classes} out1 + + in1 -> + Reshape(shape=(10,2,2,2)) -> + UpConvolution3D(kernel=(2,2,2), channels=10 , stride = (1,1,1), padding=(1,1,1)) -> + FullyConnected(units=classes, no_bias=true) -> + out1; +} diff --git a/src/test/resources/valid_tests/SimpleNetwork3DUpConvolution.cnna b/src/test/resources/valid_tests/SimpleNetwork3DUpConvolution.cnna new file mode 100644 index 0000000..bdd8b07 --- /dev/null +++ b/src/test/resources/valid_tests/SimpleNetwork3DUpConvolution.cnna @@ -0,0 +1,10 @@ +architecture SimpleNetworkLinear(inputs=10, classes=2){ + def input Q(-oo:+oo)^{inputs} in1 + def output Q(-oo:oo)^{classes} out1 + + in1 -> + Reshape(shape=(10,1,1,1)) -> + Convolution3D(kernel=(1,1,1), channels=10, stride=(1,1,1), padding=(1,1,1)) -> + FullyConnected(units=classes, no_bias=true) -> + out1; +} -- GitLab From 5f12a23e5e47a1538551f22f6c1e72e60353793c Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 10 Sep 2021 16:25:05 +0200 Subject: [PATCH 88/92] Expand function testValidCoCos to include Conv and UpConv 3D --- pom.xml | 2 +- .../monticar/cnnarch/predefined/AllPredefinedLayers.java | 8 +------- .../lang/monticar/cnnarch/cocos/AllCoCoTest.java | 2 ++ 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 82b311c..052e461 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ de.monticore.lang.monticar cnn-arch - 0.4.7-SNAPSHOT + 0.4.8-SNAPSHOT diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java index df5f44f..d670086 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/predefined/AllPredefinedLayers.java @@ -59,14 +59,11 @@ public class AllPredefinedLayers { public static final String RESHAPE_NAME = "Reshape"; public static final String DOT_PRODUCT_SELF_ATTENTION_NAME = "DotProductSelfAttention"; public static final String LOAD_NETWORK_NAME = "LoadNetwork"; -<<<<<<< HEAD public static final String CUSTOM_LAYER = "CustomLayer"; public static final String CONVOLUTION3D_NAME = "Convolution3D"; public static final String UP_CONVOLUTION3D_NAME = "UpConvolution3D"; -======= public static final String AdaNet_Name = "AdaNet"; //AdaNet layer ->>>>>>> master //replay layers public static final String LARGE_MEMORY_NAME = "LargeMemory"; @@ -216,13 +213,10 @@ public class AllPredefinedLayers { DotProductSelfAttention.create(), LargeMemory.create(), EpisodicMemory.create(), -<<<<<<< HEAD Convolution3D.create(), - UpConvolution3D.create()); -======= + UpConvolution3D.create(), AdaNet.create()); ->>>>>>> master } public static List createUnrollList(){ diff --git a/src/test/java/de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java b/src/test/java/de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java index 4f107d3..4a01aba 100644 --- a/src/test/java/de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java +++ b/src/test/java/de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java @@ -58,6 +58,8 @@ public class AllCoCoTest extends AbstractCoCoTest { checkValid("valid_tests", "RNNtest"); checkValid("valid_tests", "EpisodicMemoryNetwork"); checkValid("valid_tests", "LargeMemoryNetwork"); + checkValid("valid_tests", "SimpleNetwork3DConvolution") + checkValid("valid_tests", "SimpleNetwork3DUpConvolution"); } @Test -- GitLab From 6df99bbb3182dc48814654fffebb07810a08b95c Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Sat, 11 Sep 2021 22:25:03 +0200 Subject: [PATCH 89/92] Add new test for Conv and UpConv3D layer --- .../monticar/cnnarch/cocos/AllCoCoTest.java | 3 +-- .../SimpleNetwork3DConvolution.cnna | 10 -------- .../SimpleNetwork3DUpConvolution.cnna | 10 -------- .../resources/valid_tests/Small3DGan.cnna | 25 +++++++++++++++++++ 4 files changed, 26 insertions(+), 22 deletions(-) delete mode 100644 src/test/resources/valid_tests/SimpleNetwork3DConvolution.cnna delete mode 100644 src/test/resources/valid_tests/SimpleNetwork3DUpConvolution.cnna create mode 100644 src/test/resources/valid_tests/Small3DGan.cnna diff --git a/src/test/java/de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java b/src/test/java/de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java index 4a01aba..6a77176 100644 --- a/src/test/java/de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java +++ b/src/test/java/de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java @@ -58,8 +58,7 @@ public class AllCoCoTest extends AbstractCoCoTest { checkValid("valid_tests", "RNNtest"); checkValid("valid_tests", "EpisodicMemoryNetwork"); checkValid("valid_tests", "LargeMemoryNetwork"); - checkValid("valid_tests", "SimpleNetwork3DConvolution") - checkValid("valid_tests", "SimpleNetwork3DUpConvolution"); + checkValid("valid_tests", "Small3DGan"); } @Test diff --git a/src/test/resources/valid_tests/SimpleNetwork3DConvolution.cnna b/src/test/resources/valid_tests/SimpleNetwork3DConvolution.cnna deleted file mode 100644 index 1dd1603..0000000 --- a/src/test/resources/valid_tests/SimpleNetwork3DConvolution.cnna +++ /dev/null @@ -1,10 +0,0 @@ -architecture SimpleNetworkLinear(inputs=80, classes=2){ - def input Q(-oo:+oo)^{inputs} in1 - def output Q(-oo:oo)^{classes} out1 - - in1 -> - Reshape(shape=(10,2,2,2)) -> - UpConvolution3D(kernel=(2,2,2), channels=10 , stride = (1,1,1), padding=(1,1,1)) -> - FullyConnected(units=classes, no_bias=true) -> - out1; -} diff --git a/src/test/resources/valid_tests/SimpleNetwork3DUpConvolution.cnna b/src/test/resources/valid_tests/SimpleNetwork3DUpConvolution.cnna deleted file mode 100644 index bdd8b07..0000000 --- a/src/test/resources/valid_tests/SimpleNetwork3DUpConvolution.cnna +++ /dev/null @@ -1,10 +0,0 @@ -architecture SimpleNetworkLinear(inputs=10, classes=2){ - def input Q(-oo:+oo)^{inputs} in1 - def output Q(-oo:oo)^{classes} out1 - - in1 -> - Reshape(shape=(10,1,1,1)) -> - Convolution3D(kernel=(1,1,1), channels=10, stride=(1,1,1), padding=(1,1,1)) -> - FullyConnected(units=classes, no_bias=true) -> - out1; -} diff --git a/src/test/resources/valid_tests/Small3DGan.cnna b/src/test/resources/valid_tests/Small3DGan.cnna new file mode 100644 index 0000000..033d1c5 --- /dev/null +++ b/src/test/resources/valid_tests/Small3DGan.cnna @@ -0,0 +1,25 @@ +/* (c) https://github.com/MontiCore/monticore */ +architecture Small3DGan{ + def input Q(0:1)^{200} data + def output Q(0:1)^{1} discriminated + + data -> + Reshape (shape=(200,1,1,1)) -> + UpConvolution3D(kernel=(4,4,4), channels=64 , stride = (2,2,2), padding="simple3d") -> + BatchNorm() -> + Relu() -> + UpConvolution3D(kernel=(4,4,4), channels=32 , stride = (2,2,2), padding="simple3d") -> + BatchNorm() -> + Relu() -> + UpConvolution3D(kernel=(4,4,4), channels=1 , stride = (2,2,2), padding="simple3d") -> + Sigmoid() -> + Convolution3D(kernel=(4,4,4), channels=32, stride=(2,2,2), padding=(1,1,1)) -> + BatchNorm() -> + LeakyRelu(alpha=0.2) -> + Convolution3D(kernel=(4,4,4), channels=64, stride=(2,2,2), padding=(1,1,1)) -> + BatchNorm() -> + LeakyRelu(alpha=0.2) -> + Convolution3D(kernel=(4,4,4), channels=1, stride=(2,2,2), padding="simple3d") -> + Sigmoid() -> + discriminated; +} -- GitLab From 0d2bafb9c090c33ba72c67698dbc788380644a5c Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 17 Sep 2021 14:29:34 +0200 Subject: [PATCH 90/92] Cleaned code --- .../cnnarch/_symboltable/PredefinedLayerDeclaration.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java index cc0f4ea..cfede4b 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/PredefinedLayerDeclaration.java @@ -130,7 +130,7 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } } } -//NEW + protected void errorIfInputDepthIsInvalid(List inputTypes, LayerSymbol layer, int depth){ for (ArchTypeSymbol inputType : inputTypes) { if (inputType.getDepth() != depth){ @@ -173,7 +173,6 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol } } } -//END NEW //check input for convolution and pooling protected static void errorIfInputSmallerThanKernel(List inputTypes, LayerSymbol layer) { -- GitLab From 8883c80198c811e84582e82c0c38537171120b12 Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 24 Sep 2021 10:56:33 +0200 Subject: [PATCH 91/92] Remove files --- .directory | 6 ++++++ README.md | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 .directory diff --git a/.directory b/.directory new file mode 100644 index 0000000..1cca69d --- /dev/null +++ b/.directory @@ -0,0 +1,6 @@ +[Dolphin] +Timestamp=2021,9,23,17,57,14 +Version=4 + +[Settings] +HiddenFilesShown=true diff --git a/README.md b/README.md index aa19bb4..e478d92 100644 --- a/README.md +++ b/README.md @@ -782,6 +782,26 @@ All predefined methods start with a capital letter and all constructed methods h * **padding** ({"valid", "same", "no_loss"}, optional, default="same"): One of "valid", "same" or "no_loss". "valid" means no padding. "same" results in padding the input such that the output has the same length as the original input divided by the stride (rounded up). "no_loss" results in minimal padding such that each input is used by at least one filter (identical to "valid" if *stride* equals 1). * **no_bias** (boolean, optional, default=false): Whether to disable the bias parameter. +* **Convolution3D(kernel, channels, stride=(1,1,1), padding="same3d", no_bias=false)** + + Creates a convolutional layer. Currently, only 2D convolutions are allowed + + * **kernel** (integer tuple > 0, required): convolution kernel size: (height, width, depth). + * **channels** (integer > 0, required): number of convolution filters and number of output channels. + * **stride** (integer tuple > 0, optional, default=(1,1,1)): convolution stride: (height, width, depth). + * **padding** ({"valid", "same", "no_loss"}, optional, default="same3d"): One of "valid3d", "same3d" or "simple3d". "valid" means no padding. "same" results in padding the input such that the output has the same length as the original input divided by the stride (rounded up). "simple3d" results constant padding of size 1 (same as (1,1,1). Convolution3D also accepts tuples of form (height, widht, depth) as input. + * **no_bias** (boolean, optional, default=false): Whether to disable the bias parameter. + +* **UpConvolution3D(kernel, channels, stride=(1,1,1), padding="same3d", no_bias=false)** + + Creates a convolutional layer. Currently, only 2D convolutions are allowed + + * **kernel** (integer tuple > 0, required): convolution kernel size: (height, width, depth). + * **channels** (integer > 0, required): number of convolution filters and number of output channels. + * **stride** (integer tuple > 0, optional, default=(1,1,1)): convolution stride: (height, width, depth). + * **padding** ({"valid", "same", "no_loss"}, optional, default="same3d"): One of "valid3d", "same3d" or "simple3d". "valid" means no padding. "same" results in padding the input such that the output has the same length as the original input divided by the stride (rounded up). "simple3d" results constant padding of size 1 (same as (1,1,1). UpConvolution3D also accepts tuples of form (height, widht, depth) as input. + * **no_bias** (boolean, optional, default=false): Whether to disable the bias parameter. + * **EpisodicMemory(replayMemoryStoreProb=1, maxStoredSamples=-1, memoryReplacementStrategy="replace_oldest", useReplay=true, replayInterval, replayBatchSize=-1, replaySteps, replayGradientSteps=1, useLocalAdaption=true, localAdaptionGradientSteps=1, localAdaptionK=1, queryNetDir=-1, queryNetPrefix=-1, queryNetNumInputs=1)** -- GitLab From d6f8a59fc5a6aa674876366e846f2ad90484700e Mon Sep 17 00:00:00 2001 From: Alexander Mann Date: Fri, 24 Sep 2021 12:56:22 +0200 Subject: [PATCH 92/92] Updates readme --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e478d92..3e6139f 100644 --- a/README.md +++ b/README.md @@ -548,7 +548,7 @@ All predefined methods start with a capital letter and all constructed methods h * **Convolution(kernel, channels, stride=(1,1), padding="same", no_bias=false)** - Creates a convolutional layer. Currently, only 2D convolutions are allowed + Creates a convolutional layer. * **kernel** (integer tuple > 0, required): convolution kernel size: (height, width). * **channels** (integer > 0, required): number of convolution filters and number of output channels. @@ -774,7 +774,7 @@ All predefined methods start with a capital letter and all constructed methods h * **UpConvolution(kernel, channels, stride=(1,1), no_bias=false, padding="same")** - Creates a up convolutional layer (also known as transposed convolution ). Is currently only supported in the tesnsorflow backend. + Creates a up convolutional layer (also known as transposed convolution ). * **kernel** (integer tuple > 0, required): convolution kernel size: (height, width). * **channels** (integer > 0, required): number of up convolution filters and number of output channels. @@ -784,7 +784,7 @@ All predefined methods start with a capital letter and all constructed methods h * **Convolution3D(kernel, channels, stride=(1,1,1), padding="same3d", no_bias=false)** - Creates a convolutional layer. Currently, only 2D convolutions are allowed + Creates a convolutional layer for 3 dimension. * **kernel** (integer tuple > 0, required): convolution kernel size: (height, width, depth). * **channels** (integer > 0, required): number of convolution filters and number of output channels. @@ -794,7 +794,7 @@ All predefined methods start with a capital letter and all constructed methods h * **UpConvolution3D(kernel, channels, stride=(1,1,1), padding="same3d", no_bias=false)** - Creates a convolutional layer. Currently, only 2D convolutions are allowed + Creates a transposed convolutional layer for 3 dimensional data * **kernel** (integer tuple > 0, required): convolution kernel size: (height, width, depth). * **channels** (integer > 0, required): number of convolution filters and number of output channels. -- GitLab