Commit 6d091d65 authored by Evgeny Kusmenko's avatar Evgeny Kusmenko

Merge branch 'develop' into 'master'

Added attention-related params

See merge request !25
parents e02c53c3 14beccf5
Pipeline #213652 passed with stages
in 9 minutes and 29 seconds
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< de.monticore.lang.monticar:cnn-train >----------------
[INFO] Building cnn-train 0.3.6-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ cnn-train ---
[INFO] Deleting /home/julian/Dropbox/Dokumente/bachelorarbeit/pipeline/CNNTrainLang/target
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.1:prepare-agent (pre-unit-test) @ cnn-train ---
[INFO] argLine set to -javaagent:/home/julian/.m2/repository/org/jacoco/org.jacoco.agent/0.8.1/org.jacoco.agent-0.8.1-runtime.jar=destfile=/home/julian/Dropbox/Dokumente/bachelorarbeit/pipeline/CNNTrainLang/target/jacoco.exec
[INFO]
[INFO] --- monticore-maven-plugin:5.0.1:generate (default) @ cnn-train ---
[INFO] Changes detected for /home/julian/Dropbox/Dokumente/bachelorarbeit/pipeline/CNNTrainLang/src/main/grammars/de/monticore/lang/monticar/CNNTrain.mc4. Regenerating...
......@@ -18,7 +18,7 @@
<groupId>de.monticore.lang.monticar</groupId>
<artifactId>cnn-train</artifactId>
<version>0.3.8-SNAPSHOT</version>
<version>0.3.9-SNAPSHOT</version>
<!-- == PROJECT DEPENDENCIES ============================================= -->
......
......@@ -24,6 +24,8 @@ grammar CNNTrain extends de.monticore.lang.monticar.Common2, de.monticore.Number
BooleanValue implements ConfigValue = (TRUE:"true" | FALSE:"false");
ComponentNameValue implements ConfigValue = Name ("."Name)*;
DoubleVectorValue implements ConfigValue = "(" number:NumberWithUnit ("," number:NumberWithUnit)* ")";
IntegerTupelValue implements ConfigValue = "(" first:IntegerValue "," second:IntegerValue ")";
IntegerListValue implements ConfigValue = "[" number:NumberWithUnit ("," number:NumberWithUnit)* "]";
NumEpochEntry implements ConfigEntry = name:"num_epoch" ":" value:IntegerValue;
BatchSizeEntry implements ConfigEntry = name:"batch_size" ":" value:IntegerValue;
......@@ -31,17 +33,24 @@ grammar CNNTrain extends de.monticore.lang.monticar.Common2, de.monticore.Number
NormalizeEntry implements ConfigEntry = name:"normalize" ":" value:BooleanValue;
OptimizerEntry implements ConfigEntry = (name:"optimizer" | name:"actor_optimizer") ":" value:OptimizerValue;
TrainContextEntry implements ConfigEntry = name:"context" ":" value:TrainContextValue;
EvalMetricEntry implements ConfigEntry = name:"eval_metric" ":" value:EvalMetricValue;
LossEntry implements ConfigEntry = name:"loss" ":" value:LossValue;
LossWeightsEntry implements ConfigEntry = name:"loss_weights" ":" value:DoubleVectorValue;
EvalMetricValue implements ConfigValue =(accuracy:"accuracy"
| crossEntropy:"cross_entropy"
| f1:"f1"
| mae:"mae"
| mse:"mse"
| rmse:"rmse"
| topKAccuracy:"top_k_accuracy");
EvalMetricEntry implements MultiParamConfigEntry = name:"eval_metric" ":" value:EvalMetricValue;
interface EvalMetricValue extends MultiParamValue;
AccuracyEvalMetric implements EvalMetricValue = name:"accuracy";
BleuMetric implements EvalMetricValue = name:"bleu" ("{" params:BleuEntry* "}")?;
CrossEntropyEvalMetric implements EvalMetricValue = name:"cross_entropy";
F1EvalMetric implements EvalMetricValue = name:"f1";
MAEEvalMetric implements EvalMetricValue = name:"mae";
MSEEvalMetric implements EvalMetricValue = name:"mse";
PerplexityEvalMetric implements EvalMetricValue = name:"perplexity";
RMSEEvalMetric implements EvalMetricValue = name:"rmse";
TopKAccuracyEvalMetric implements EvalMetricValue = name:"top_k_accuracy";
interface BleuEntry extends Entry;
ExcludeBleuEntry implements BleuEntry = name:"exclude" ":" value:IntegerListValue;
LRPolicyValue implements ConfigValue =(fixed:"fixed"
| step:"step"
......@@ -72,6 +81,9 @@ grammar CNNTrain extends de.monticore.lang.monticar.Common2, de.monticore.Number
interface SoftmaxCrossEntropyEntry extends Entry;
SoftmaxCrossEntropyLoss implements LossValue = name:"softmax_cross_entropy" ("{" params:SoftmaxCrossEntropyEntry* "}")?;
interface SoftmaxCrossEntropyIgnoreIndicesEntry extends Entry;
SoftmaxCrossEntropyIgnoreIndicesLoss implements LossValue = name:"softmax_cross_entropy_ignore_indices" ("{" params:SoftmaxCrossEntropyIgnoreIndicesEntry* "}")?;
SigmoidBinaryCrossEntropyLoss implements LossValue = name:"sigmoid_binary_cross_entropy" ("{" params:Entry* "}")?;
interface HingeEntry extends Entry;
......@@ -86,8 +98,9 @@ grammar CNNTrain extends de.monticore.lang.monticar.Common2, de.monticore.Number
interface KullbackLeiblerEntry extends Entry;
KullbackLeiblerLoss implements LossValue = name:"kullback_leibler" ("{" params:KullbackLeiblerEntry* "}")?;
SparseLabelEntry implements CrossEntropyEntry, SoftmaxCrossEntropyEntry = name:"sparse_label" ":" value:BooleanValue;
FromLogitsEntry implements SoftmaxCrossEntropyEntry, KullbackLeiblerEntry = name:"from_logits" ":" value:BooleanValue;
SparseLabelEntry implements CrossEntropyEntry, SoftmaxCrossEntropyEntry, SoftmaxCrossEntropyIgnoreIndicesEntry = name:"sparse_label" ":" value:BooleanValue;
FromLogitsEntry implements SoftmaxCrossEntropyEntry, SoftmaxCrossEntropyIgnoreIndicesEntry, KullbackLeiblerEntry = name:"from_logits" ":" value:BooleanValue;
IgnoreIndicesEntry implements SoftmaxCrossEntropyIgnoreIndicesEntry = name:"ignore_indices" ":" value:IntegerValue;
MarginEntry implements HingeEntry, SquaredHingeEntry = name:"margin" ":" value:NumberValue;
LabelFormatEntry implements LogisticEntry = name:"label_format" ":" value:StringValue;
......@@ -131,6 +144,11 @@ grammar CNNTrain extends de.monticore.lang.monticar.Common2, de.monticore.Number
ClipWeightsEntry implements RmsPropEntry = name:"clip_weights" ":" value:NumberValue;
RhoEntry implements AdaDeltaEntry,RmsPropEntry,HuberEntry = name:"rho" ":" value:NumberValue;
UseTeacherForcing implements ConfigEntry = name:"use_teacher_forcing" ":" value:BooleanValue;
// Visual attention Extension
SaveAttentionImage implements ConfigEntry = name:"save_attention_image" ":" value:BooleanValue;
// Reinforcement Extensions
interface MultiParamValue extends ConfigValue;
......@@ -147,7 +165,7 @@ grammar CNNTrain extends de.monticore.lang.monticar.Common2, de.monticore.Number
StartTrainingAtEntry implements ConfigEntry = name:"start_training_at" ":" value:IntegerValue;
EvaluationSamplesEntry implements ConfigEntry = name:"evaluation_samples" ":" value:IntegerValue;
LearningMethodValue implements ConfigValue = (supervisedLearning:"supervised" | reinforcement:"reinforcement");
LearningMethodValue implements ConfigValue = (supervisedLearning:"supervised" | reinforcement:"reinforcement" | gan:"gan");
RLAlgorithmValue implements ConfigValue = (dqn:"dqn-algorithm" | ddpg:"ddpg-algorithm" | tdThree:"td3-algorithm");
......@@ -230,4 +248,20 @@ grammar CNNTrain extends de.monticore.lang.monticar.Common2, de.monticore.Number
PolicyNoiseEntry implements ConfigEntry = name:"policy_noise" ":" value:NumberValue;
NoiseClipEntry implements ConfigEntry = name:"noise_clip" ":" value:NumberValue;
PolicyDelayEntry implements ConfigEntry = name:"policy_delay" ":" value:IntegerValue;
// GANs Extensions
DiscriminatorNetworkEntry implements ConfigEntry = name:"discriminator_name" ":" value:ComponentNameValue;
PreprocessingEntry implements ConfigEntry = name:"preprocessing_name" ":" value:ComponentNameValue;
ImgResizeEntry implements ConfigEntry = name:"img_resize" ":" value:IntegerTupelValue;
// Noise Distribution Creator
NoiseDistributionEntry implements MultiParamConfigEntry = name:"noise_distribution" ":" value:NoiseDistributionValue;
interface NoiseDistributionValue extends MultiParamValue;
interface NoiseDistributionGaussianEntry extends Entry;
NoiseDistributionGaussianValue implements NoiseDistributionValue = name:"gaussian" ("{" params:NoiseDistributionGaussianEntry* "}")?;
MeanValueEntry implements NoiseDistributionGaussianEntry = name:"mean_value" ":" value:IntegerValue;
SpreadValueEntry implements NoiseDistributionGaussianEntry = name:"spread_value" ":" value:IntegerValue;
}
\ No newline at end of file
/**
* (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.cnntrain._cocos;
import de.monticore.lang.monticar.cnntrain._ast.ASTIntegerListValue;
import de.monticore.lang.monticar.cnntrain.helper.ErrorCodes;
import de.monticore.numberunit._ast.ASTNumberWithUnit;
import de.se_rwth.commons.logging.Log;
public class CheckIntegerList implements CNNTrainASTIntegerListValueCoCo {
@Override
public void check(ASTIntegerListValue node) {
for (ASTNumberWithUnit element : node.getNumberList()) {
Double unitNumber = element.getNumber().get();
if ((unitNumber % 1)!= 0) {
Log.error("0" + ErrorCodes.NOT_INTEGER_CODE +" Value has to be an integer."
, node.get_SourcePositionStart());
}
}
}
}
......@@ -59,10 +59,9 @@ public class CheckLearningParameterCombination implements CNNTrainASTEntryCoCo {
if (supervisedLearningParameter && !reinforcementLearningParameter) {
setLearningMethodOrLogErrorIfActualLearningMethodIsNotSupervised(node);
} else if(!supervisedLearningParameter) {
} else if(!supervisedLearningParameter && reinforcementLearningParameter) {
setLearningMethodOrLogErrorIfActualLearningMethodIsNotReinforcement(node);
}
}
private void setLearningMethodOrLogErrorIfActualLearningMethodIsNotReinforcement(ASTEntry node) {
......@@ -91,8 +90,12 @@ public class CheckLearningParameterCombination implements CNNTrainASTEntryCoCo {
private void evaluateLearningMethodEntry(ASTEntry node) {
ASTLearningMethodValue learningMethodValue = (ASTLearningMethodValue)node.getValue();
LearningMethod evaluatedLearningMethod = learningMethodValue.isPresentReinforcement()
? LearningMethod.REINFORCEMENT : LearningMethod.SUPERVISED;
LearningMethod evaluatedLearningMethod;
if(learningMethodValue.isPresentReinforcement()) {
evaluatedLearningMethod = LearningMethod.REINFORCEMENT;
} else {
evaluatedLearningMethod = LearningMethod.SUPERVISED;
}
if (isLearningMethodKnown()) {
logErrorIfEvaluatedLearningMethoNotEqualToActual(node, evaluatedLearningMethod);
......
......@@ -38,15 +38,20 @@ class ParameterAlgorithmMapping {
ASTBatchSizeEntry.class,
ASTLoadCheckpointEntry.class,
ASTEvalMetricEntry.class,
ASTExcludeBleuEntry.class,
ASTNormalizeEntry.class,
ASTNumEpochEntry.class,
ASTLossEntry.class,
ASTLossWeightsEntry.class,
ASTSparseLabelEntry.class,
ASTFromLogitsEntry.class,
ASTIgnoreIndicesEntry.class,
ASTMarginEntry.class,
ASTLabelFormatEntry.class,
ASTRhoEntry.class
ASTRhoEntry.class,
ASTPreprocessingEntry.class,
ASTUseTeacherForcing.class,
ASTSaveAttentionImage.class
);
private static final List<Class> GENERAL_REINFORCEMENT_PARAMETERS = Lists.newArrayList(
......@@ -110,6 +115,12 @@ class ParameterAlgorithmMapping {
ASTStrategyGaussianNoiseVarianceEntry.class
);
private static final List<Class> GENERAL_GAN_PARAMETERS = Lists.newArrayList(
ASTDiscriminatorNetworkEntry.class,
ASTNoiseDistributionEntry.class,
ASTImgResizeEntry.class
);
ParameterAlgorithmMapping() {
}
......@@ -133,7 +144,9 @@ class ParameterAlgorithmMapping {
boolean isSupervisedLearningParameter(Class<? extends ASTEntry> entryClazz) {
return GENERAL_PARAMETERS.contains(entryClazz)
|| EXCLUSIVE_SUPERVISED_PARAMETERS.contains(entryClazz);
|| EXCLUSIVE_SUPERVISED_PARAMETERS.contains(entryClazz)
|| GENERAL_GAN_PARAMETERS.contains(entryClazz);
}
boolean isDqnParameter(Class<? extends ASTEntry> entryClazz) {
......@@ -168,6 +181,7 @@ class ParameterAlgorithmMapping {
return ImmutableList.<Class> builder()
.addAll(GENERAL_PARAMETERS)
.addAll(EXCLUSIVE_SUPERVISED_PARAMETERS)
.addAll(GENERAL_GAN_PARAMETERS)
.build();
}
}
......@@ -156,32 +156,12 @@ public class CNNTrainSymbolTableCreator extends CNNTrainSymbolTableCreatorTOP {
@Override
public void visit(ASTEvalMetricEntry node) {
EntrySymbol entry = new EntrySymbol(node.getName());
ValueSymbol value = new ValueSymbol();
if (node.getValue().isPresentAccuracy()){
value.setValue(EvalMetric.ACCURACY);
}
else if (node.getValue().isPresentCrossEntropy()){
value.setValue(EvalMetric.CROSS_ENTROPY);
}
else if (node.getValue().isPresentF1()){
value.setValue(EvalMetric.F1);
}
else if (node.getValue().isPresentMae()){
value.setValue(EvalMetric.MAE);
}
else if (node.getValue().isPresentMse()){
value.setValue(EvalMetric.MSE);
}
else if (node.getValue().isPresentRmse()){
value.setValue(EvalMetric.RMSE);
}
else if (node.getValue().isPresentTopKAccuracy()){
value.setValue(EvalMetric.TOP_K_ACCURACY);
}
entry.setValue(value);
addToScopeAndLinkWithNode(entry, node);
configuration.getEntryMap().put(node.getName(), entry);
processMultiParamConfigVisit(node, node.getValue().getName());
}
@Override
public void endVisit(ASTEvalMetricEntry node) {
processMultiParamConfigEndVisit(node);
}
@Override
......@@ -335,7 +315,29 @@ public class CNNTrainSymbolTableCreator extends CNNTrainSymbolTableCreatorTOP {
.map(n -> n.getNumber().get())
.collect(Collectors.toList());
}
private List<Integer> getIntegerListFromValue(ASTIntegerListValue value) {
return value.getNumberList().stream()
.filter(n -> n.getNumber().isPresent())
.map(n -> n.getNumber().get().intValue())
.collect(Collectors.toList());
}
@Override
public void endVisit(ASTUseTeacherForcing node) {
EntrySymbol entry = new EntrySymbol(node.getName());
entry.setValue(getValueSymbolForBoolean(node.getValue()));
addToScopeAndLinkWithNode(entry, node);
configuration.getEntryMap().put(node.getName(), entry);
}
@Override
public void endVisit(ASTSaveAttentionImage node) {
EntrySymbol entry = new EntrySymbol(node.getName());
entry.setValue(getValueSymbolForBoolean(node.getValue()));
addToScopeAndLinkWithNode(entry, node);
configuration.getEntryMap().put(node.getName(), entry);
}
@Override
public void visit(ASTLearningMethodEntry node) {
......@@ -344,6 +346,8 @@ public class CNNTrainSymbolTableCreator extends CNNTrainSymbolTableCreatorTOP {
if (node.getValue().isPresentReinforcement()) {
value.setValue(LearningMethod.REINFORCEMENT);
} if (node.getValue().isPresentGan()) {
value.setValue(LearningMethod.GAN);
} else if (node.getValue().isPresentSupervisedLearning()) {
value.setValue(LearningMethod.SUPERVISED);
}
......@@ -459,7 +463,35 @@ public class CNNTrainSymbolTableCreator extends CNNTrainSymbolTableCreatorTOP {
configuration.getEntryMap().put(node.getName(), entry);
}
@Override
public void visit(ASTDiscriminatorNetworkEntry node) {
EntrySymbol entry = new EntrySymbol(node.getName());
entry.setValue(getValueSymbolForComponentNameAsString(node.getValue()));
addToScopeAndLinkWithNode(entry, node);
configuration.getEntryMap().put(node.getName(), entry);
}
@Override
public void visit(ASTPreprocessingEntry node) {
EntrySymbol entry = new EntrySymbol(node.getName());
entry.setValue(getValueSymbolForComponentNameAsString(node.getValue()));
addToScopeAndLinkWithNode(entry, node);
configuration.getEntryMap().put(node.getName(), entry);
}
@Override
public void visit(ASTImgResizeEntry node) {
EntrySymbol width_entry = new EntrySymbol(node.getName());
EntrySymbol height_entry = new EntrySymbol(node.getName());
width_entry.setValue(getValueSymbolForInteger(node.getValue().getFirst()));
height_entry.setValue(getValueSymbolForInteger(node.getValue().getSecond()));
addToScopeAndLinkWithNode(width_entry, node);
addToScopeAndLinkWithNode(height_entry, node);
configuration.getEntryMap().put(node.getName() + "_width", width_entry);
configuration.getEntryMap().put(node.getName() + "_height", height_entry);
}
@Override
public void visit(ASTReplayMemoryEntry node) {
......@@ -493,6 +525,22 @@ public class CNNTrainSymbolTableCreator extends CNNTrainSymbolTableCreatorTOP {
processMultiParamConfigEndVisit(node);
}
@Override
public void visit(ASTNoiseDistributionEntry node) {
NoiseDistribution noiseDistribution;
if(node.getValue().getName().equals("gaussian")) {
noiseDistribution = NoiseDistribution.GAUSSIAN;
} else {
noiseDistribution = NoiseDistribution.GAUSSIAN;
}
processMultiParamConfigVisit(node, noiseDistribution);
}
@Override
public void endVisit(ASTNoiseDistributionEntry node) {
processMultiParamConfigEndVisit(node);
}
@Override
public void visit(ASTRewardFunctionEntry node) {
RewardFunctionSymbol symbol = new RewardFunctionSymbol(node.getName());
......@@ -598,6 +646,8 @@ public class CNNTrainSymbolTableCreator extends CNNTrainSymbolTableCreatorTOP {
.filter(n -> n.getNumber().isPresent())
.map(n -> n.getNumber().get())
.collect(Collectors.toList());
} else if (configValue instanceof ASTIntegerListValue) {
return getIntegerListFromValue((ASTIntegerListValue)configValue);
}
throw new UnsupportedOperationException("Unknown Value type: " + configValue.getClass());
}
......
......@@ -22,6 +22,7 @@ public class ConfigurationSymbol extends CommonScopeSpanningSymbol {
private RewardFunctionSymbol rlRewardFunctionSymbol;
private NNArchitectureSymbol trainedArchitecture;
private NNArchitectureSymbol criticNetwork;
private NNArchitectureSymbol discriminatorNetwork;
public static final ConfigurationSymbolKind KIND = new ConfigurationSymbolKind();
......@@ -75,10 +76,18 @@ public class ConfigurationSymbol extends CommonScopeSpanningSymbol {
return Optional.ofNullable(criticNetwork);
}
public Optional<NNArchitectureSymbol> getDiscriminatorNetwork() {
return Optional.ofNullable(discriminatorNetwork);
}
public void setCriticNetwork(NNArchitectureSymbol criticNetwork) {
this.criticNetwork = criticNetwork;
}
public void setDiscriminatorNetwork(NNArchitectureSymbol discriminatorNetwork) {
this.discriminatorNetwork = discriminatorNetwork;
}
public Map<String, EntrySymbol> getEntryMap() {
return entryMap;
}
......@@ -96,10 +105,22 @@ public class ConfigurationSymbol extends CommonScopeSpanningSymbol {
return getLearningMethod().equals(LearningMethod.REINFORCEMENT);
}
public boolean isGAN() {
return getLearningMethod().equals(LearningMethod.GAN);
}
public boolean hasPreprocessor() {
return getEntryMap().containsKey(PREPROCESSING_NAME);
}
public boolean hasCritic() {
return getEntryMap().containsKey(CRITIC);
}
public boolean hasDiscriminator() {
return getEntryMap().containsKey(DISCRIMINATOR_NAME);
}
public Optional<String> getCriticName() {
if (!hasCritic()) {
return Optional.empty();
......@@ -109,4 +130,24 @@ public class ConfigurationSymbol extends CommonScopeSpanningSymbol {
assert criticNameValue instanceof String;
return Optional.of((String)criticNameValue);
}
public Optional<String> getPreprocessingName() {
if (!hasPreprocessor()) {
return Optional.empty();
}
final Object preprocessingNameValue = getEntry(PREPROCESSING_NAME).getValue().getValue();
assert preprocessingNameValue instanceof String;
return Optional.of((String)preprocessingNameValue);
}
public Optional<String> getDiscriminatorName() {
if (!hasDiscriminator()) {
return Optional.empty();
}
final Object discriminatorNameValue = getEntry(DISCRIMINATOR_NAME).getValue().getValue();
assert discriminatorNameValue instanceof String;
return Optional.of((String)discriminatorNameValue);
}
}
\ No newline at end of file
/**
* (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.cnntrain._symboltable;
public enum EvalMetric {
ACCURACY{
@Override
public String toString() {
return "accuracy";
}
},
CROSS_ENTROPY{
@Override
public String toString() {
return "crossEntropy";
}
},
F1{
@Override
public String toString() {
return "f1";
}
},
MAE{
@Override
public String toString() {
return "mae";
}
},
MSE{
@Override
public String toString() {
return "mse";
}
},
RMSE{
@Override
public String toString() {
return "rmse";
}
},
TOP_K_ACCURACY{
@Override
public String toString() {
return "topKAccuracy";
}
}
}
......@@ -22,5 +22,11 @@ public enum LearningMethod {
public String toString() {
return "reinforcement";
}
},
GAN {
@Override
public String toString() {
return "gan";
}
}
}
/**
* (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.cnntrain._symboltable;
public enum NoiseDistribution {
GAUSSIAN{
@Override
public String toString() {
return "gaussian";
}
}
}
......@@ -9,6 +9,7 @@ package de.monticore.lang.monticar.cnntrain.helper;
public class ConfigEntryNameConstants {
public static final String LEARNING_METHOD = "learning_method";
public static final String EVAL_METRIC = "eval_metric";
public static final String NUM_EPISODES = "num_episodes";
public static final String DISCOUNT_FACTOR = "discount_factor";
public static final String NUM_MAX_STEPS = "num_max_steps";
......@@ -44,4 +45,11 @@ public class ConfigEntryNameConstants {
public static final String STRATEGY_EPSDECAY = "epsdecay";
public static final String CRITIC = "critic";
public static final String DISCRIMINATOR_NAME = "discriminator_name";
public static final String PREPROCESSING_NAME = "preprocessing_name";
public static final String NOISE_DISTRIBUTION = "noise_distribution";
public static final String IMG_RESIZE = "img_resize";
public static final String IMG_RESIZE_WIDTH = "img_resize_width";
public static final String IMG_RESIZE_HEIGHT = "img_resize_height";
}
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