Commit db864dbe authored by Evgeny Kusmenko's avatar Evgeny Kusmenko

Merge branch 'moved_to_monticore_5_0_0' into 'master'

Version 0.2.3-SNAPSHOT: moved to monticore 5.0.1 and MontiMath 0.0.19-SNAPSHOT

See merge request !8
parents a2f74aa0 781766ff
Pipeline #69221 passed with stages
in 20 minutes and 24 seconds
......@@ -30,20 +30,20 @@
<groupId>de.monticore.lang.monticar</groupId>
<artifactId>cnn-arch</artifactId>
<version>0.2.1-SNAPSHOT</version>
<version>0.2.3-SNAPSHOT</version>
<!-- == PROJECT DEPENDENCIES ============================================= -->
<properties>
<!-- .. SE-Libraries .................................................. -->
<monticore.version>4.5.4.08.11.2017</monticore.version>
<se-commons.version>1.7.7</se-commons.version>
<monticore.version>5.0.1</monticore.version>
<se-commons.version>1.7.8</se-commons.version>
<mc.grammars.assembly.version>0.0.6</mc.grammars.assembly.version>
<SIUnit.version>0.0.10-SNAPSHOT</SIUnit.version>
<Common-MontiCar.version>0.0.12</Common-MontiCar.version>
<CNNTrain.version>0.2.2-SNAPSHOT</CNNTrain.version>
<Math.version>0.0.11</Math.version>
<SIUnit.version>0.0.11</SIUnit.version>
<Common-MontiCar.version>0.0.14-SNAPSHOT</Common-MontiCar.version>
<CNNTrain.version>0.2.3-SNAPSHOT</CNNTrain.version>
<Math.version>0.0.19-SNAPSHOT</Math.version>
<!-- .. Libraries .................................................. -->
<guava.version>18.0</guava.version>
......@@ -53,7 +53,7 @@
<commons-cli.version>1.4</commons-cli.version>
<!-- .. Plugins ....................................................... -->
<monticore.plugin>4.5.3.1</monticore.plugin>
<monticore.plugin>5.0.1</monticore.plugin>
<assembly.plugin>2.5.4</assembly.plugin>
<compiler.plugin>3.3</compiler.plugin>
<source.plugin>2.4</source.plugin>
......
package de.monticore.lang.monticar;
grammar CNNArch extends de.monticore.lang.math.Math {
grammar CNNArch extends de.monticore.CommonExpressions, de.monticore.lang.Math, de.monticore.lang.monticar.Common2 {
token NEWLINETOKEN =
('\r' '\n' |
......@@ -113,12 +113,51 @@ grammar CNNArch extends de.monticore.lang.math.Math {
/**
Expressions for variable values.
*/
ArchSimpleExpression = (arithmeticExpression:MathArithmeticExpression
| booleanExpression:MathBooleanExpression
ArchSimpleExpression = (arithmeticExpression:ArchArithmeticExpression
| booleanExpression:ArchBooleanExpression
| tupleExpression:TupleExpression
| string:StringLiteral);
TupleExpression = "(" expressions:MathArithmeticExpression "," expressions:(MathArithmeticExpression || ",")* ")";
interface ArchMathExpression extends Expression;
interface ArchArithmeticExpression extends ArchMathExpression;
interface ArchBooleanExpression extends ArchMathExpression;
ArchSimpleArithmeticExpression implements ArchArithmeticExpression = (NumberExpression
| NameExpression
| MathDottedNameExpression
| MathAssignmentDeclarationStatement
| MathAssignmentStatement);
//| MinusPrefixExpression);
ArchComplexArithmeticExpression implements ArchArithmeticExpression = leftExpression:ArchMathExpression
NEWLINETOKEN*
( operator:"*"
| operator:"/"
| operator:"%"
| operator:"^"
| operator:"+"
| operator:"-"
)
NEWLINETOKEN*
rightExpression:ArchMathExpression;
TupleExpression = "(" expressions:ArchArithmeticExpression "," expressions:(ArchArithmeticExpression || ",")* ")";
ArchSimpleBooleanExpression implements ArchBooleanExpression = (BooleanExpression
| BooleanNotExpression
| LogicalNotExpression);
ArchComplexBooleanExpression implements ArchBooleanExpression = leftExpression:ArchMathExpression
( operator:"=="
| operator:"!="
| operator:"&&"
| operator:"||"
)
rightExpression:ArchMathExpression;
ArchBracketExpression implements ArchMathExpression, ArchBooleanExpression, ArchArithmeticExpression = "(" ArchMathExpression ")";
ArchPreMinusExpression implements ArchMathExpression, ArchBooleanExpression, ArchArithmeticExpression = "-" ArchMathExpression ;
/* =================================*/
......
......@@ -23,25 +23,26 @@ package de.monticore.lang.monticar.cnnarch._ast;
import de.monticore.lang.monticar.cnnarch.predefined.AllPredefinedVariables;
import java.util.List;
import java.util.Optional;
public class ASTArchSpecialArgument extends ASTArchSpecialArgumentTOP {
public ASTArchSpecialArgument() {
}
public ASTArchSpecialArgument(ASTArchExpression rhs, List<String> nEWLINETOKENs, String serial, String parallel, String conditional) {
public ASTArchSpecialArgument(ASTArchExpression rhs, List<String> nEWLINETOKENs, Optional<String> serial, Optional<String> parallel, Optional<String> conditional) {
super(rhs, nEWLINETOKENs, serial, parallel, conditional);
}
@Override
public String getName() {
if (getParallel().isPresent()){
if (isPresentParallel()){
return AllPredefinedVariables.PARALLEL_ARG_NAME;
}
else if (getSerial().isPresent()) {
else if (isPresentSerial()) {
return AllPredefinedVariables.SERIAL_ARG_NAME;
}
else if (getConditional().isPresent()){
else if (isPresentConditional()){
return AllPredefinedVariables.CONDITIONAL_ARG_NAME;
}
else {
......
......@@ -20,7 +20,7 @@
*/
package de.monticore.lang.monticar.cnnarch._cocos;
import de.monticore.lang.math.math._symboltable.expression.MathExpressionSymbol;
import de.monticore.lang.math._symboltable.expression.MathExpressionSymbol;
import de.monticore.lang.monticar.cnnarch._symboltable.*;
import de.monticore.symboltable.Symbol;
......
......@@ -31,7 +31,7 @@ public class CheckArgument implements CNNArchASTArchArgumentCoCo {
@Override
public void check(ASTArchArgument node) {
ArgumentSymbol argument = (ArgumentSymbol) node.getSymbol().get();
ArgumentSymbol argument = (ArgumentSymbol) node.getSymbolOpt().get();
LayerDeclarationSymbol layerDeclaration = argument.getLayer().getDeclaration();
if (layerDeclaration != null && argument.getParameter() == null){
Log.error("0"+ ErrorCodes.UNKNOWN_ARGUMENT + " Unknown Argument. " +
......
......@@ -20,8 +20,8 @@
*/
package de.monticore.lang.monticar.cnnarch._cocos;
import de.monticore.lang.math.math._symboltable.expression.MathExpressionSymbol;
import de.monticore.lang.math.math._symboltable.expression.MathNameExpressionSymbol;
import de.monticore.lang.math._symboltable.expression.MathExpressionSymbol;
import de.monticore.lang.math._symboltable.expression.MathNameExpressionSymbol;
import de.monticore.lang.monticar.cnnarch._symboltable.ArchExpressionSymbol;
import de.monticore.lang.monticar.cnnarch._symboltable.ArchSimpleExpressionSymbol;
import de.monticore.lang.monticar.cnnarch._symboltable.VariableSymbol;
......
......@@ -41,7 +41,7 @@ public class CheckIOType extends CNNArchSymbolCoCo {
public void checkIO(IODeclarationSymbol ioDeclaration) {
ArchTypeSymbol type = ioDeclaration.getType();
if (type.getDomain().isIsComplex() || type.getDomain().isIsBoolean()){
if (type.getDomain().isComplex() || type.getDomain().isBoolean()){
Log.error("0" + ErrorCodes.INVALID_IO_TYPE + " Invalid IO element type. " +
"Type has to be rational or whole number.");
}
......
......@@ -38,7 +38,7 @@ public class CheckLayer implements CNNArchASTLayerCoCo{
@Override
public void check(ASTLayer node) {
Set<String> nameSet = new HashSet<>();
for (ASTArchArgument argument : node.getArguments()){
for (ASTArchArgument argument : node.getArgumentsList()){
String name = argument.getName();
if (nameSet.contains(name)){
Log.error("0" + ErrorCodes.DUPLICATED_ARG + " Duplicated name: " + name +
......@@ -50,9 +50,9 @@ public class CheckLayer implements CNNArchASTLayerCoCo{
}
}
LayerDeclarationSymbol layerDeclaration = ((LayerSymbol) node.getSymbol().get()).getDeclaration();
LayerDeclarationSymbol layerDeclaration = ((LayerSymbol) node.getSymbolOpt().get()).getDeclaration();
if (layerDeclaration == null){
ArchitectureSymbol architecture = node.getSymbol().get().getEnclosingScope().<ArchitectureSymbol>resolve("", ArchitectureSymbol.KIND).get();
ArchitectureSymbol architecture = node.getSymbolOpt().get().getEnclosingScope().<ArchitectureSymbol>resolve("", ArchitectureSymbol.KIND).get();
Log.error("0" + ErrorCodes.UNKNOWN_LAYER + " Unknown layer. " +
"Layer with name '" + node.getName() + "' does not exist. " +
"Existing layers: " + Joiners.COMMA.join(architecture.getLayerDeclarations()) + "."
......@@ -65,7 +65,7 @@ public class CheckLayer implements CNNArchASTLayerCoCo{
requiredArguments.add(param.getName());
}
}
for (ASTArchArgument argument : node.getArguments()){
for (ASTArchArgument argument : node.getArgumentsList()){
requiredArguments.remove(argument.getName());
}
......
......@@ -39,7 +39,7 @@ public class CheckLayerRecursion implements CNNArchASTLayerDeclarationCoCo {
@Override
public void check(ASTLayerDeclaration node) {
done = false;
LayerDeclarationSymbol layerDeclaration = (LayerDeclarationSymbol) node.getSymbol().get();
LayerDeclarationSymbol layerDeclaration = (LayerDeclarationSymbol) node.getSymbolOpt().get();
checkForRecursion(layerDeclaration, layerDeclaration.getBody());
}
......
......@@ -28,13 +28,13 @@ public class CheckRangeOperators implements CNNArchASTArchValueRangeCoCo {
@Override
public void check(ASTArchValueRange node) {
if (node.getParallel().isPresent()){
if (!node.getParallel2().isPresent()){
if (node.isPresentParallel()){
if (!node.isPresentParallel2()){
differentOperatorError(node);
}
}
else {
if (node.getParallel2().isPresent()){
if (node.isPresentParallel2()){
differentOperatorError(node);
}
}
......
......@@ -65,7 +65,7 @@ public class CheckVariableName implements CNNArchASTVariableCoCo {
String name = node.getName();
if (variableNames.contains(name)){
if (node instanceof ASTLayerParameter){
Collection<Symbol> allParametersWithSameName = node.getEnclosingScope().get().getLocalSymbols().get(name);
Collection<Symbol> allParametersWithSameName = node.getEnclosingScopeOpt().get().getLocalSymbols().get(name);
if (allParametersWithSameName.size() > 1){
duplicationError(node);
}
......
......@@ -20,7 +20,7 @@
*/
package de.monticore.lang.monticar.cnnarch._symboltable;
import de.monticore.lang.math.math._symboltable.expression.*;
import de.monticore.lang.math._symboltable.expression.*;
import de.monticore.lang.monticar.cnnarch.helper.Calculator;
import de.monticore.lang.monticar.cnnarch.helper.Utils;
import de.monticore.symboltable.Scope;
......
......@@ -20,7 +20,11 @@
*/
package de.monticore.lang.monticar.cnnarch._symboltable;
import de.monticore.lang.monticar.ranges._ast.ASTRange;
import de.monticore.lang.monticar.ranges._ast.ASTRangeStepResolution;
import de.monticore.lang.monticar.resolution._ast.ASTUnitNumberResolution;
import de.monticore.lang.monticar.types2._ast.ASTElementType;
import de.monticore.numberunit._ast.ASTNumberWithUnit;
import de.monticore.symboltable.CommonSymbol;
import de.monticore.symboltable.MutableScope;
import de.monticore.symboltable.Scope;
......@@ -45,7 +49,7 @@ public class ArchTypeSymbol extends CommonSymbol {
public ArchTypeSymbol() {
super("", KIND);
ASTElementType elementType = new ASTElementType();
elementType.setTElementType(DEFAULT_ELEMENT_TYPE);
elementType.setName(DEFAULT_ELEMENT_TYPE);
setDomain(elementType);
}
......@@ -244,7 +248,11 @@ public class ArchTypeSymbol extends CommonSymbol {
}
public Builder elementType(String start, String end){
domain = new ASTElementType();
domain.setTElementType("Q(" + start + ":" + end +")");
domain.setName("Q"); //("Q(" + start + ":" + end +")");
ASTRange range = new ASTRange();
range.setStartValue(start);
range.setEndValue(end);
domain.setRange(range);
return this;
}
......@@ -257,7 +265,7 @@ public class ArchTypeSymbol extends CommonSymbol {
if (domain == null){
domain = new ASTElementType();
domain.setTElementType(DEFAULT_ELEMENT_TYPE);
domain.setName(DEFAULT_ELEMENT_TYPE);
}
sym.setDomain(domain);
return sym;
......
......@@ -228,8 +228,8 @@ public class IOSymbol extends ArchitectureElementSymbol {
if (!Utils.equals(inputType, getDefinition().getType().getDomain())) {
Log.error("0" + ErrorCodes.INVALID_ELEMENT_INPUT_DOMAIN + " " +
"The declared output type of '" + name + "' does not match with the actual type. " +
"Declared type: " + getDefinition().getType().getDomain().getTElementType().get() + ". " +
"Actual type: " + inputType.getTElementType().get() + ".");
"Declared type: " + getDefinition().getType().getDomain().getName() + ". " +
"Actual type: " + inputType.getName() + ".");
}
}
......
......@@ -257,7 +257,8 @@ public class LayerSymbol extends ArchitectureElementSymbol {
public List<ArchTypeSymbol> computeOutputTypes() {
if (getResolvedThis().isPresent()) {
if (getResolvedThis().get() == this) {
return ((PredefinedLayerDeclaration) getDeclaration()).computeOutputTypes(getInputTypes(), this);
List<ArchTypeSymbol> inputTypes = getInputTypes();
return ((PredefinedLayerDeclaration) getDeclaration()).computeOutputTypes(inputTypes, this);
}
else {
return getResolvedThis().get().getOutputTypes();
......
......@@ -20,10 +20,10 @@
*/
package de.monticore.lang.monticar.cnnarch._symboltable;
import de.monticore.lang.math.math._ast.ASTMathFalseExpression;
import de.monticore.lang.math.math._ast.ASTMathTrueExpression;
import de.monticore.lang.math.math._symboltable.MathSymbolTableCreator;
import de.monticore.lang.math.math._symboltable.expression.MathNameExpressionSymbol;
import de.monticore.lang.math._ast.ASTMathFalseExpression;
import de.monticore.lang.math._ast.ASTMathTrueExpression;
import de.monticore.lang.math._symboltable.MathSymbolTableCreator;
import de.monticore.lang.math._symboltable.expression.MathNameExpressionSymbol;
import de.monticore.lang.monticar.cnnarch.predefined.AllPredefinedVariables;
import de.monticore.symboltable.MutableScope;
import de.monticore.symboltable.ResolvingConfiguration;
......
......@@ -20,6 +20,7 @@
*/
package de.monticore.lang.monticar.cnnarch._symboltable;
import com.google.gson.internal.Streams;
import de.monticore.lang.monticar.cnnarch.helper.ErrorCodes;
import de.monticore.lang.monticar.cnnarch.predefined.AllPredefinedLayers;
import de.monticore.lang.monticar.ranges._ast.ASTRange;
......@@ -29,6 +30,7 @@ import org.jscience.mathematics.number.Rational;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.BinaryOperator;
import java.util.stream.Stream;
......@@ -193,18 +195,20 @@ abstract public class PredefinedLayerDeclaration extends LayerDeclarationSymbol
String start = null;
String end = null;
for (ArchTypeSymbol inputType : inputTypes){
ASTRange range = inputType.getDomain().getRange().get();
if (range.getStartInf().isPresent()){
start = "-oo";
}
else {
startValues.add(range.getStartValue());
}
if (range.getEndInf().isPresent()){
end = "oo";
}
else {
endValues.add(range.getEndValue());
Optional<ASTRange> range = inputType.getDomain().getRangeOpt();
if (range.isPresent()) {
if (range.get().hasNoLowerLimit()){
start = "-oo";
}
else {
startValues.add(range.get().getStartValue());
}
if (range.get().hasNoUpperLimit()){
end = "oo";
}
else {
endValues.add(range.get().getEndValue());
}
}
}
if (start == null){
......
......@@ -20,7 +20,7 @@
*/
package de.monticore.lang.monticar.cnnarch._symboltable;
import de.monticore.lang.math.math._symboltable.expression.MathExpressionSymbol;
import de.monticore.lang.math._symboltable.expression.MathExpressionSymbol;
import de.monticore.lang.monticar.cnnarch.helper.Utils;
import java.util.LinkedList;
......
......@@ -20,7 +20,7 @@
*/
package de.monticore.lang.monticar.cnnarch.helper;
import de.monticore.lang.math.math._symboltable.expression.*;
import de.monticore.lang.math._symboltable.expression.*;
import de.monticore.lang.monticar.cnnarch._symboltable.TupleExpressionSymbol;
import de.monticore.lang.monticar.ranges._ast.ASTRange;
import de.monticore.lang.monticar.types2._ast.ASTElementType;
......@@ -143,6 +143,10 @@ public class Utils {
MathNumberExpressionSymbol exp = (MathNumberExpressionSymbol) expression;
copy = new MathNumberExpressionSymbol(exp.getValue().getRealNumber());
}
else if (expression instanceof MathBooleanExpressionSymbol){
MathBooleanExpressionSymbol castedCopy = (MathBooleanExpressionSymbol) expression.getRealMathExpressionSymbol();
copy = castedCopy;
}
else {
throw new IllegalArgumentException("Unknown expression type: " + expression.getClass().getSimpleName());
}
......@@ -155,40 +159,40 @@ public class Utils {
}
public static boolean equals(ASTElementType firstType, ASTElementType secondType){
if (firstType.isIsBoolean() ^ secondType.isIsBoolean()
|| firstType.isIsNatural() ^ secondType.isIsNatural()
|| firstType.isIsRational() ^ secondType.isIsRational()
|| firstType.isIsWholeNumberNumber() ^ secondType.isIsWholeNumberNumber()
|| firstType.isIsComplex() ^ secondType.isIsComplex()){
if (firstType.isBoolean() ^ secondType.isBoolean()
|| firstType.isNaturalNumber() ^ secondType.isNaturalNumber()
|| firstType.isRational() ^ secondType.isRational()
|| firstType.isWholeNumber() ^ secondType.isWholeNumber()
|| firstType.isComplex() ^ secondType.isComplex()){
return false;
}
if (firstType.getRange().isPresent()){
if (!secondType.getRange().isPresent()){
if (firstType.isPresentRange()){
if (!secondType.isPresentRange()){
return false;
}
}
else {
return !secondType.getRange().isPresent();
return !secondType.isPresentRange();
}
return equals(firstType.getRange().get(), secondType.getRange().get());
return equals(firstType.getRange(), secondType.getRange());
}
public static boolean equals(ASTRange firstRange, ASTRange secondRange){
if (firstRange.getStartInf().isPresent() ^ secondRange.getStartInf().isPresent()
|| firstRange.getEndInf().isPresent() ^ secondRange.getEndInf().isPresent()){
if (firstRange.hasNoLowerLimit() ^ secondRange.hasNoLowerLimit()
|| firstRange.hasNoUpperLimit() ^ secondRange.hasNoUpperLimit()){
return false;
}
if (!firstRange.getStartInf().isPresent() && !firstRange.getStartValue().equals(secondRange.getStartValue())){
if (!firstRange.hasNoLowerLimit() && !firstRange.getStartValue().equals(secondRange.getStartValue())){
return false;
}
if (!firstRange.getEndInf().isPresent() && !firstRange.getEndValue().equals(secondRange.getEndValue())){
if (!firstRange.hasNoUpperLimit() && !firstRange.getEndValue().equals(secondRange.getEndValue())){
return false;
}
if (firstRange.getStep().isPresent() ^ secondRange.getStep().isPresent()){
if (firstRange.isPresentStep() ^ secondRange.isPresentStep()){
return false;
}
if (firstRange.getStep().isPresent() && !firstRange.getStepValue().equals(secondRange.getStepValue())){
if (firstRange.isPresentStep() && !firstRange.getStepValue().equals(secondRange.getStepValue())){
return false;
}
......
......@@ -64,11 +64,11 @@ public class AllPredefinedLayers {
//possible String values
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 POOL_MAX = "\"max\"";
public static final String POOL_AVG = "\"avg\"";
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 POOL_MAX = "max";
public static final String POOL_AVG = "avg";
//list with all predefined layers
......
......@@ -20,9 +20,9 @@
*/
package de.monticore.lang.monticar.cnnarch;
import de.monticore.lang.math.math._symboltable.expression.MathArithmeticExpressionSymbol;
import de.monticore.lang.math.math._symboltable.expression.MathNumberExpressionSymbol;
import de.monticore.lang.math.math._symboltable.expression.MathPreOperatorExpressionSymbol;
import de.monticore.lang.math._symboltable.expression.MathArithmeticExpressionSymbol;
import de.monticore.lang.math._symboltable.expression.MathNumberExpressionSymbol;
import de.monticore.lang.math._symboltable.expression.MathPreOperatorExpressionSymbol;
import de.monticore.lang.monticar.cnnarch._symboltable.ArchSimpleExpressionSymbol;
import de.monticore.lang.monticar.cnnarch.helper.Calculator;
import de.monticore.lang.numberunit.Rationals;
......
......@@ -25,6 +25,7 @@ import de.monticore.lang.monticar.cnnarch.predefined.AllPredefinedVariables;
import de.monticore.symboltable.Scope;
import de.se_rwth.commons.logging.Log;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import static de.monticore.lang.monticar.cnnarch.ParserTest.ENABLE_FAIL_QUICK;
......
......@@ -47,7 +47,6 @@ public class SymtabTest extends AbstractSymtabTest {
assertTrue(parser.parse("src/test/resources/architectures/Alexnet.cnna").isPresent());
}
@Ignore
@Test
public void testAlexnet(){
Scope symTab = createSymTab("src/test/resources/architectures");
......@@ -59,7 +58,6 @@ public class SymtabTest extends AbstractSymtabTest {
a.getArchitecture().getBody().getOutputTypes();
}
@Ignore
@Test
public void testResNeXt(){
Scope symTab = createSymTab("src/test/resources/architectures");
......@@ -71,7 +69,6 @@ public class SymtabTest extends AbstractSymtabTest {
a.getArchitecture().getBody().getOutputTypes();
}
@Ignore
@Test
public void test3(){
Scope symTab = createSymTab("src/test/resources/valid_tests");
......
......@@ -32,4 +32,4 @@ architecture ResNet34(img_height=224, img_width=224, img_channels=3, classes=100
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -26,4 +26,4 @@ architecture SequentialAlexnet(img_height=224, img_width=224, img_channels=3, cl
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -28,4 +28,4 @@ architecture VGG16(img_height=224, img_width=224, img_channels=3, classes=1000){
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -31,4 +31,4 @@ architecture ArgumentConstraintTest1(img_height=224, img_width=224, img_channels
FullyConnected(units=classes, ->=true) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -31,4 +31,4 @@ architecture ArgumentConstraintTest2(img_height=224, img_width=224, img_channels
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -31,4 +31,4 @@ architecture ArgumentConstraintTest3(img_height=224, img_width=224, img_channels
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -31,4 +31,4 @@ architecture ArgumentConstraintTest4(img_height=224, img_width=224, img_channels
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -31,4 +31,4 @@ architecture ArgumentConstraintTest5(img_height=224, img_width=224, img_channels
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -31,4 +31,4 @@ architecture ArgumentConstraintTest6(img_height=224, img_width=224, img_channels
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -24,4 +24,4 @@ architecture InvalidArrayAccessValue(img_height=200, img_width=300, img_channels
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -37,4 +37,4 @@ architecture InvalidRecursion(img_height=224, img_width=224, img_channels=3, cla
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
......@@ -29,4 +29,4 @@ architecture ThreeInputCNN_M14_alternative(img_height=200, img_width=300, img_ch
FullyConnected(units=classes) ->
Softmax() ->
predictions
}
}
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment