From 95bfcfa9124f25b83e633b531c293fe9a2733876 Mon Sep 17 00:00:00 2001 From: Sebastian Nickels <sn1c@protonmail.ch> Date: Fri, 21 Jun 2019 06:01:06 +0200 Subject: [PATCH] Implemented basic multiple streams --- ...NArch2GluonArchitectureSupportChecker.java | 4 +- .../CNNArch2GluonTemplateController.java | 24 +++++- .../resources/templates/gluon/CNNCreator.ftl | 86 +++++++++++-------- src/main/resources/templates/gluon/CNNNet.ftl | 22 +++-- .../templates/gluon/CNNPredictor.ftl | 30 ++++--- .../templates/gluon/CNNSupervisedTrainer.ftl | 81 ++++++++++------- .../templates/gluon/elements/Add.ftl | 2 - .../templates/gluon/elements/BatchNorm.ftl | 1 - .../templates/gluon/elements/Concatenate.ftl | 1 - .../templates/gluon/elements/Convolution.ftl | 1 - .../templates/gluon/elements/Dropout.ftl | 1 - .../templates/gluon/elements/Flatten.ftl | 1 - .../gluon/elements/FullyConnected.ftl | 1 - .../templates/gluon/elements/Get.ftl | 1 - .../gluon/elements/GlobalPooling.ftl | 1 - .../templates/gluon/elements/Input.ftl | 1 - .../templates/gluon/elements/Lrn.ftl | 1 - .../templates/gluon/elements/OneHot.ftl | 1 - .../templates/gluon/elements/Output.ftl | 5 -- .../templates/gluon/elements/Pooling.ftl | 1 - .../templates/gluon/elements/Relu.ftl | 1 - .../templates/gluon/elements/Sigmoid.ftl | 1 - .../templates/gluon/elements/Softmax.ftl | 1 - .../templates/gluon/elements/Split.ftl | 1 - .../templates/gluon/elements/Tanh.ftl | 1 - .../resources/templates/gluon/execute.ftl | 13 +-- .../gluongenerator/GenerationTest.java | 19 +--- .../invalid_tests/MultipleOutputs.cnna | 21 ----- .../resources/invalid_tests/data_paths.txt | 2 - .../target_code/CNNCreator_Alexnet.py | 78 +++++++++-------- .../CNNCreator_CifarClassifierNetwork.py | 78 +++++++++-------- .../resources/target_code/CNNCreator_VGG16.py | 78 +++++++++-------- .../resources/target_code/CNNNet_Alexnet.py | 8 +- .../CNNNet_CifarClassifierNetwork.py | 8 +- .../resources/target_code/CNNNet_VGG16.py | 8 +- .../target_code/CNNPredictor_Alexnet.h | 10 +-- .../CNNPredictor_CifarClassifierNetwork.h | 10 +-- .../target_code/CNNPredictor_VGG16.h | 10 +-- .../CNNSupervisedTrainer_Alexnet.py | 63 +++++++------- ...upervisedTrainer_CifarClassifierNetwork.py | 63 +++++++------- .../target_code/CNNSupervisedTrainer_VGG16.py | 63 +++++++------- .../resources/target_code/execute_Alexnet | 4 +- .../execute_CifarClassifierNetwork | 4 +- src/test/resources/target_code/execute_VGG16 | 4 +- .../MultipleStreams.cnna | 0 src/test/resources/valid_tests/data_paths.txt | 1 - 46 files changed, 424 insertions(+), 392 deletions(-) delete mode 100644 src/test/resources/invalid_tests/MultipleOutputs.cnna rename src/test/resources/{invalid_tests => valid_tests}/MultipleStreams.cnna (100%) diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/gluongenerator/CNNArch2GluonArchitectureSupportChecker.java b/src/main/java/de/monticore/lang/monticar/cnnarch/gluongenerator/CNNArch2GluonArchitectureSupportChecker.java index e213c30b..80cb310b 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/gluongenerator/CNNArch2GluonArchitectureSupportChecker.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/gluongenerator/CNNArch2GluonArchitectureSupportChecker.java @@ -7,9 +7,9 @@ public class CNNArch2GluonArchitectureSupportChecker extends ArchitectureSupport public CNNArch2GluonArchitectureSupportChecker() {} - /*protected boolean checkMultipleStreams(ArchitectureSymbol architecture) { + protected boolean checkMultipleStreams(ArchitectureSymbol architecture) { return true; - }*/ + } protected boolean checkMultipleInputs(ArchitectureSymbol architecture) { return true; diff --git a/src/main/java/de/monticore/lang/monticar/cnnarch/gluongenerator/CNNArch2GluonTemplateController.java b/src/main/java/de/monticore/lang/monticar/cnnarch/gluongenerator/CNNArch2GluonTemplateController.java index 93b49d62..eeb67f23 100644 --- a/src/main/java/de/monticore/lang/monticar/cnnarch/gluongenerator/CNNArch2GluonTemplateController.java +++ b/src/main/java/de/monticore/lang/monticar/cnnarch/gluongenerator/CNNArch2GluonTemplateController.java @@ -30,7 +30,7 @@ import java.io.Writer; import java.util.*; public class CNNArch2GluonTemplateController extends CNNArchTemplateController { - public static final String NET_DEFINITION_MODE_KEY = "definition_mode"; + public static final String NET_DEFINITION_MODE_KEY = "mode"; public CNNArch2GluonTemplateController(ArchitectureSymbol architecture, TemplateConfiguration templateConfiguration) { @@ -42,7 +42,7 @@ public class CNNArch2GluonTemplateController extends CNNArchTemplateController { Map<String, Object> ftlContext = new HashMap<>(); ftlContext.put(TEMPLATE_CONTROLLER_KEY, this); ftlContext.put(ELEMENT_DATA_KEY, getCurrentElement()); - ftlContext.put(NET_DEFINITION_MODE_KEY, netDefinitionMode); + ftlContext.put(NET_DEFINITION_MODE_KEY, netDefinitionMode.toString()); getTemplateConfiguration().processTemplate(ftlContext, templatePath, writer); } @@ -116,4 +116,24 @@ public class CNNArch2GluonTemplateController extends CNNArchTemplateController { } include(architectureElement, getWriter(), netDefinitionMode); } + + public List<String> getStreamInputNames(SerialCompositeElementSymbol stream) { + List<String> names = new ArrayList<>(); + + for (ArchitectureElementSymbol element : stream.getFirstAtomicElements()) { + names.add(getName(element)); + } + + return names; + } + + public List<String> getStreamOutputNames(SerialCompositeElementSymbol stream) { + List<String> names = new ArrayList<>(); + + for (ArchitectureElementSymbol element : stream.getLastAtomicElements()) { + names.add(getName(element)); + } + + return names; + } } diff --git a/src/main/resources/templates/gluon/CNNCreator.ftl b/src/main/resources/templates/gluon/CNNCreator.ftl index ae113d9c..2a9938ff 100644 --- a/src/main/resources/templates/gluon/CNNCreator.ftl +++ b/src/main/resources/templates/gluon/CNNCreator.ftl @@ -1,55 +1,67 @@ import mxnet as mx import logging import os -from CNNNet_${tc.fullArchitectureName} import Net +<#list tc.architecture.streams as stream> +<#if stream.isNetwork()> +from CNNNet_${tc.fullArchitectureName} import Net_${stream?index} +</#if> +</#list> class ${tc.fileNameWithoutEnding}: _model_dir_ = "model/${tc.componentName}/" _model_prefix_ = "model" - _input_shapes_ = [<#list tc.architecture.inputs as input>(${tc.join(input.definition.type.dimensions, ",")},)<#sep>, </#list>] def __init__(self): self.weight_initializer = mx.init.Normal() - self.net = None - - def get_input_shapes(self): - return self._input_shapes_ + self.networks = {} def load(self, context): - lastEpoch = 0 - param_file = None - - try: - os.remove(self._model_dir_ + self._model_prefix_ + "_newest-0000.params") - except OSError: - pass - try: - os.remove(self._model_dir_ + self._model_prefix_ + "_newest-symbol.json") - except OSError: - pass - - if os.path.isdir(self._model_dir_): - for file in os.listdir(self._model_dir_): - if ".params" in file and self._model_prefix_ in file: - epochStr = file.replace(".params","").replace(self._model_prefix_ + "-","") - epoch = int(epochStr) - if epoch > lastEpoch: - lastEpoch = epoch - param_file = file - if param_file is None: - return 0 - else: - logging.info("Loading checkpoint: " + param_file) - self.net.load_parameters(self._model_dir_ + param_file) - return lastEpoch + earliestLastEpoch = None + + for i, network in self.networks.items(): + lastEpoch = 0 + param_file = None + + try: + os.remove(self._model_dir_ + self._model_prefix_ + "_" + str(i) + "_newest-0000.params") + except OSError: + pass + try: + os.remove(self._model_dir_ + self._model_prefix_ + "_" + str(i) + "_newest-symbol.json") + except OSError: + pass + + if os.path.isdir(self._model_dir_): + for file in os.listdir(self._model_dir_): + if ".params" in file and self._model_prefix_ + "_" + str(i) in file: + epochStr = file.replace(".params","").replace(self._model_prefix_ + "_" + str(i) + "-","") + epoch = int(epochStr) + if epoch > lastEpoch: + lastEpoch = epoch + param_file = file + if param_file is None: + earliestLastEpoch = 0 + else: + logging.info("Loading checkpoint: " + param_file) + network.load_parameters(self._model_dir_ + param_file) + + if earliestLastEpoch == None or lastEpoch < earliestLastEpoch: + earliestLastEpoch = lastEpoch + + return earliestLastEpoch def construct(self, context, data_mean=None, data_std=None): - self.net = Net(data_mean=data_mean, data_std=data_std) - self.net.collect_params().initialize(self.weight_initializer, ctx=context) - self.net.hybridize() - self.net(<#list tc.architecture.inputs as input>mx.nd.zeros((1,) + self._input_shapes_[${input?index}], ctx=context)<#sep>, </#list>) +<#list tc.architecture.streams as stream> +<#if stream.isNetwork()> + self.networks[${stream?index}] = Net_${stream?index}(data_mean=data_mean, data_std=data_std) + self.networks[${stream?index}].collect_params().initialize(self.weight_initializer, ctx=context) + self.networks[${stream?index}].hybridize() + self.networks[${stream?index}](<#list stream.getFirstAtomicElements() as input>mx.nd.zeros((1, ${tc.join(input.definition.type.dimensions, ",")},), ctx=context)<#sep>, </#list>) +</#if> +</#list> if not os.path.exists(self._model_dir_): os.makedirs(self._model_dir_) - self.net.export(self._model_dir_ + self._model_prefix_, epoch=0) + for i, network in self.networks.items(): + network.export(self._model_dir_ + self._model_prefix_ + "_" + str(i), epoch=0) diff --git a/src/main/resources/templates/gluon/CNNNet.ftl b/src/main/resources/templates/gluon/CNNNet.ftl index 48aeb8eb..5dd6d199 100644 --- a/src/main/resources/templates/gluon/CNNNet.ftl +++ b/src/main/resources/templates/gluon/CNNNet.ftl @@ -78,18 +78,22 @@ class NoNormalization(gluon.HybridBlock): return x -class Net(gluon.HybridBlock): +<#list tc.architecture.streams as stream> +<#if stream.isNetwork()> +class Net_${stream?index}(gluon.HybridBlock): def __init__(self, data_mean=None, data_std=None, **kwargs): - super(Net, self).__init__(**kwargs) + super(Net_${stream?index}, self).__init__(**kwargs) self.last_layers = {} with self.name_scope(): -${tc.include(tc.architecture.streams[0], "ARCHITECTURE_DEFINITION")} +${tc.include(stream, "ARCHITECTURE_DEFINITION")} - def hybrid_forward(self, F, ${tc.join(tc.architectureInputs, ", ")}): - <#if tc.architectureOutputs?size gt 1> + def hybrid_forward(self, F, ${tc.join(tc.getStreamInputNames(stream), ", ")}): outputs = [] - </#if> -${tc.include(tc.architecture.streams[0], "FORWARD_FUNCTION")} - <#if tc.architectureOutputs?size gt 1> +${tc.include(stream, "FORWARD_FUNCTION")} +<#if tc.getStreamOutputNames(stream)?size gt 1> return tuple(outputs) - </#if> +<#else> + return outputs[0] +</#if> +</#if> +</#list> \ No newline at end of file diff --git a/src/main/resources/templates/gluon/CNNPredictor.ftl b/src/main/resources/templates/gluon/CNNPredictor.ftl index 7207b360..6a782312 100644 --- a/src/main/resources/templates/gluon/CNNPredictor.ftl +++ b/src/main/resources/templates/gluon/CNNPredictor.ftl @@ -9,34 +9,36 @@ #include <CNNBufferFile.h> -class ${tc.fileNameWithoutEnding}{ +<#list tc.architecture.streams as stream> +<#if stream.isNetwork()> +class ${tc.fileNameWithoutEnding}_${stream?index}{ public: - const std::string json_file = "model/${tc.componentName}/model_newest-symbol.json"; - const std::string param_file = "model/${tc.componentName}/model_newest-0000.params"; + const std::string json_file = "model/${tc.componentName}/model_${stream?index}_newest-symbol.json"; + const std::string param_file = "model/${tc.componentName}/model_${stream?index}_newest-0000.params"; const std::vector<std::string> input_keys = { -<#if (tc.architectureInputs?size == 1)> +<#if (tc.getStreamInputNames(stream)?size == 1)> "data" <#else> - <#list tc.architectureInputs as inputName>"data${inputName?index}"<#sep>, </#list> + <#list tc.getStreamInputNames(stream) as inputName>"data${inputName?index}"<#sep>, </#list> </#if> }; - const std::vector<std::vector<mx_uint>> input_shapes = {<#list tc.architecture.inputs as input>{1, ${tc.join(input.definition.type.dimensions, ", ")}}<#sep>, </#list>}; + const std::vector<std::vector<mx_uint>> input_shapes = {<#list stream.getFirstAtomicElements() as input>{1, ${tc.join(input.definition.type.dimensions, ", ")}}<#sep>, </#list>}; const bool use_gpu = false; PredictorHandle handle; - explicit ${tc.fileNameWithoutEnding}(){ + explicit ${tc.fileNameWithoutEnding}_${stream?index}(){ init(json_file, param_file, input_keys, input_shapes, use_gpu); } - ~${tc.fileNameWithoutEnding}(){ + ~${tc.fileNameWithoutEnding}_${stream?index}(){ if(handle) MXPredFree(handle); } - void predict(${tc.join(tc.architectureInputs, ", ", "const std::vector<float> &", "")}, - ${tc.join(tc.architectureOutputs, ", ", "std::vector<float> &", "")}){ -<#list tc.architectureInputs as inputName> -<#if (tc.architectureInputs?size == 1)> + void predict(${tc.join(tc.getStreamInputNames(stream), ", ", "const std::vector<float> &", "")}, + ${tc.join(tc.getStreamOutputNames(stream), ", ", "std::vector<float> &", "")}){ +<#list tc.getStreamInputNames(stream) as inputName> +<#if (tc.getStreamInputNames(stream)?size == 1)> MXPredSetInput(handle, "data", ${inputName}.data(), static_cast<mx_uint>(${inputName}.size())); <#else> MXPredSetInput(handle, "data${inputName?index}", ${inputName}.data(), static_cast<mx_uint>(${inputName}.size())); @@ -50,7 +52,7 @@ public: mx_uint shape_len; size_t size; -<#list tc.architectureOutputs as outputName> +<#list tc.getStreamOutputNames(stream) as outputName> output_index = ${outputName?index?c}; MXPredGetOutputShape(handle, output_index, &shape, &shape_len); size = 1; @@ -115,5 +117,7 @@ public: assert(handle); } }; +</#if> +</#list> #endif // ${tc.fileNameWithoutEnding?upper_case} diff --git a/src/main/resources/templates/gluon/CNNSupervisedTrainer.ftl b/src/main/resources/templates/gluon/CNNSupervisedTrainer.ftl index 08a640b6..c83d1938 100644 --- a/src/main/resources/templates/gluon/CNNSupervisedTrainer.ftl +++ b/src/main/resources/templates/gluon/CNNSupervisedTrainer.ftl @@ -7,10 +7,10 @@ import shutil from mxnet import gluon, autograd, nd class ${tc.fileNameWithoutEnding}: - def __init__(self, data_loader, net_constructor, net=None): + def __init__(self, data_loader, net_constructor): self._data_loader = data_loader self._net_creator = net_constructor - self._net = net + self._networks = {} def train(self, batch_size=64, num_epoch=10, @@ -45,12 +45,11 @@ class ${tc.fileNameWithoutEnding}: train_iter, test_iter, data_mean, data_std = self._data_loader.load_data(batch_size) - if self._net is None: - if normalize: - self._net_creator.construct( - context=mx_context, data_mean=data_mean, data_std=data_std) - else: - self._net_creator.construct(context=mx_context) + + if normalize: + self._net_creator.construct(context=mx_context, data_mean=data_mean, data_std=data_std) + else: + self._net_creator.construct(context=mx_context) begin_epoch = 0 if load_checkpoint: @@ -59,7 +58,7 @@ class ${tc.fileNameWithoutEnding}: if os.path.isdir(self._net_creator._model_dir_): shutil.rmtree(self._net_creator._model_dir_) - self._net = self._net_creator.net + self._networks = self._net_creator.networks try: os.makedirs(self._net_creator._model_dir_) @@ -67,20 +66,21 @@ class ${tc.fileNameWithoutEnding}: if not os.path.isdir(self._net_creator._model_dir_): raise - trainer = mx.gluon.Trainer(self._net.collect_params(), optimizer, optimizer_params) + trainers = [mx.gluon.Trainer(network.collect_params(), optimizer, optimizer_params) for network in self._networks.values()] loss_functions = {} - for output_name, last_layer in self._net.last_layers.items(): - if last_layer == 'softmax': - loss_functions[output_name] = mx.gluon.loss.SoftmaxCrossEntropyLoss() - elif last_layer == 'sigmoid': - loss_functions[output_name] = mx.gluon.loss.SigmoidBinaryCrossEntropyLoss() - elif last_layer == 'linear': - loss_functions[output_name] = mx.gluon.loss.L2Loss() - else: - loss_functions[output_name] = mx.gluon.loss.L2Loss() - logging.warning("Invalid last layer, defaulting to L2 loss") + for network in self._networks.values(): + for output_name, last_layer in network.last_layers.items(): + if last_layer == 'softmax': + loss_functions[output_name] = mx.gluon.loss.SoftmaxCrossEntropyLoss() + elif last_layer == 'sigmoid': + loss_functions[output_name] = mx.gluon.loss.SigmoidBinaryCrossEntropyLoss() + elif last_layer == 'linear': + loss_functions[output_name] = mx.gluon.loss.L2Loss() + else: + loss_functions[output_name] = mx.gluon.loss.L2Loss() + logging.warning("Invalid last layer, defaulting to L2 loss") speed_period = 50 tic = None @@ -96,12 +96,20 @@ class ${tc.fileNameWithoutEnding}: </#list> with autograd.record(): - ${tc.join(tc.architectureOutputs, ", ", "", "_output")} = self._net(${tc.join(tc.architectureInputs, ", ", "", "_data")}) +<#list tc.architecture.streams as stream> +<#if stream.isNetwork()> + ${tc.join(tc.getStreamOutputNames(stream), ", ", "", "_output")} = self._networks[${stream?index}](${tc.join(tc.getStreamInputNames(stream), ", ", "", "_data")}) +<#else> + # TODO: Implement non network streams +</#if> +</#list> loss = <#list tc.architectureOutputs as output_name>loss_functions['${output_name}'](${output_name}_output, ${output_name}_label)<#sep> + </#list> loss.backward() - trainer.step(batch_size) + + for trainer in trainers: + trainer.step(batch_size) if tic is None: tic = time.time() @@ -129,7 +137,13 @@ class ${tc.fileNameWithoutEnding}: <#list tc.architectureOutputs as output_name>batch.label[${output_name?index}].as_in_context(mx_context)<#sep>, </#list> ] - ${tc.join(tc.architectureOutputs, ", ", "", "_output")} = self._net(${tc.join(tc.architectureInputs, ", ", "", "_data")}) +<#list tc.architecture.streams as stream> +<#if stream.isNetwork()> + ${tc.join(tc.getStreamOutputNames(stream), ", ", "", "_output")} = self._networks[${stream?index}](${tc.join(tc.getStreamInputNames(stream), ", ", "", "_data")}) +<#else> + # TODO: Implement non network streams +</#if> +</#list> predictions = [ <#list tc.architectureOutputs as output_name>mx.nd.argmax(${output_name}_output, axis=1)<#sep>, </#list> @@ -149,8 +163,13 @@ class ${tc.fileNameWithoutEnding}: <#list tc.architectureOutputs as output_name>batch.label[${output_name?index}].as_in_context(mx_context)<#sep>, </#list> ] - ${tc.join(tc.architectureOutputs, ", ", "", "_output")} = self._net(${tc.join(tc.architectureInputs, ", ", "", "_data")}) - +<#list tc.architecture.streams as stream> +<#if stream.isNetwork()> + ${tc.join(tc.getStreamOutputNames(stream), ", ", "", "_output")} = self._networks[${stream?index}](${tc.join(tc.getStreamInputNames(stream), ", ", "", "_data")}) +<#else> + # TODO: Implement non network streams +</#if> +</#list> predictions = [ <#list tc.architectureOutputs as output_name>mx.nd.argmax(${output_name}_output, axis=1)<#sep>, </#list> ] @@ -161,10 +180,12 @@ class ${tc.fileNameWithoutEnding}: logging.info("Epoch[%d] Train: %f, Test: %f" % (epoch, train_metric_score, test_metric_score)) if (epoch - begin_epoch) % checkpoint_period == 0: - self._net.save_parameters(self.parameter_path() + '-' + str(epoch).zfill(4) + '.params') + for i, network in self._networks.items(): + network.save_parameters(self.parameter_path(i) + '-' + str(epoch).zfill(4) + '.params') - self._net.save_parameters(self.parameter_path() + '-' + str(num_epoch + begin_epoch).zfill(4) + '.params') - self._net.export(self.parameter_path() + '_newest', epoch=0) + for i, network in self._networks.items(): + network.save_parameters(self.parameter_path(i) + '-' + str(num_epoch + begin_epoch).zfill(4) + '.params') + network.export(self.parameter_path(i) + '_newest', epoch=0) - def parameter_path(self): - return self._net_creator._model_dir_ + self._net_creator._model_prefix_ \ No newline at end of file + def parameter_path(self, index): + return self._net_creator._model_dir_ + self._net_creator._model_prefix_ + '_' + str(index) \ No newline at end of file diff --git a/src/main/resources/templates/gluon/elements/Add.ftl b/src/main/resources/templates/gluon/elements/Add.ftl index 8a955802..c2b1b443 100644 --- a/src/main/resources/templates/gluon/elements/Add.ftl +++ b/src/main/resources/templates/gluon/elements/Add.ftl @@ -1,5 +1,3 @@ -<#-- TODO: May put this in an extra HybridBlock --> -<#assign mode = definition_mode.toString()> <#if mode == "FORWARD_FUNCTION"> ${element.name} = ${tc.join(element.inputs, " + ")} </#if> \ No newline at end of file diff --git a/src/main/resources/templates/gluon/elements/BatchNorm.ftl b/src/main/resources/templates/gluon/elements/BatchNorm.ftl index 4a4b652f..890322b7 100644 --- a/src/main/resources/templates/gluon/elements/BatchNorm.ftl +++ b/src/main/resources/templates/gluon/elements/BatchNorm.ftl @@ -1,4 +1,3 @@ -<#assign mode = definition_mode.toString()> <#assign input = element.inputs[0]> <#-- TODO: Find solution for the CNNArch fix_gamma parameter of BatchNorm. Gluon does not provide this parameter--> <#if mode == "ARCHITECTURE_DEFINITION"> diff --git a/src/main/resources/templates/gluon/elements/Concatenate.ftl b/src/main/resources/templates/gluon/elements/Concatenate.ftl index f840b6a8..b477a1e9 100644 --- a/src/main/resources/templates/gluon/elements/Concatenate.ftl +++ b/src/main/resources/templates/gluon/elements/Concatenate.ftl @@ -1,4 +1,3 @@ -<#assign mode = definition_mode.toString()> <#if mode == "ARCHITECTURE_DEFINITION"> self.${element.name} = Concatenate(dim=1) <#include "OutputShape.ftl"> diff --git a/src/main/resources/templates/gluon/elements/Convolution.ftl b/src/main/resources/templates/gluon/elements/Convolution.ftl index 252f24e8..11701268 100644 --- a/src/main/resources/templates/gluon/elements/Convolution.ftl +++ b/src/main/resources/templates/gluon/elements/Convolution.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#if mode == "ARCHITECTURE_DEFINITION"> <#if element.padding??> self.${element.name}padding = Padding(padding=(${tc.join(element.padding, ",")})) diff --git a/src/main/resources/templates/gluon/elements/Dropout.ftl b/src/main/resources/templates/gluon/elements/Dropout.ftl index 0dbe1bd9..1b35794f 100644 --- a/src/main/resources/templates/gluon/elements/Dropout.ftl +++ b/src/main/resources/templates/gluon/elements/Dropout.ftl @@ -1,4 +1,3 @@ -<#assign mode = definition_mode.toString()> <#assign rate = element.p?c> <#assign input = element.inputs[0]> <#if mode == "ARCHITECTURE_DEFINITION"> diff --git a/src/main/resources/templates/gluon/elements/Flatten.ftl b/src/main/resources/templates/gluon/elements/Flatten.ftl index 4702fff3..bcafbec5 100644 --- a/src/main/resources/templates/gluon/elements/Flatten.ftl +++ b/src/main/resources/templates/gluon/elements/Flatten.ftl @@ -1,4 +1,3 @@ -<#assign mode = definition_mode.toString()> <#assign input = element.inputs[0]> <#if mode == "ARCHITECTURE_DEFINITION"> self.${element.name} = gluon.nn.Flatten() diff --git a/src/main/resources/templates/gluon/elements/FullyConnected.ftl b/src/main/resources/templates/gluon/elements/FullyConnected.ftl index fede0154..79004595 100644 --- a/src/main/resources/templates/gluon/elements/FullyConnected.ftl +++ b/src/main/resources/templates/gluon/elements/FullyConnected.ftl @@ -2,7 +2,6 @@ <#assign input = element.inputs[0]> <#assign units = element.units?c> <#assign use_bias = element.noBias?string("False","True")> -<#assign mode = definition_mode.toString()> <#if mode == "ARCHITECTURE_DEFINITION"> <#if flatten> self.${element.name}flatten = gluon.nn.Flatten() diff --git a/src/main/resources/templates/gluon/elements/Get.ftl b/src/main/resources/templates/gluon/elements/Get.ftl index 043c679c..36a2e648 100644 --- a/src/main/resources/templates/gluon/elements/Get.ftl +++ b/src/main/resources/templates/gluon/elements/Get.ftl @@ -1,4 +1,3 @@ -<#assign mode = definition_mode.toString()> <#if mode == "FORWARD_FUNCTION"> ${element.name} = ${element.inputs[element.index]} </#if> \ No newline at end of file diff --git a/src/main/resources/templates/gluon/elements/GlobalPooling.ftl b/src/main/resources/templates/gluon/elements/GlobalPooling.ftl index e2251e65..3004b10d 100644 --- a/src/main/resources/templates/gluon/elements/GlobalPooling.ftl +++ b/src/main/resources/templates/gluon/elements/GlobalPooling.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#assign poolType = element.poolType> <#if poolType == "avg"> <#assign poolFunctionType = "Avg"> diff --git a/src/main/resources/templates/gluon/elements/Input.ftl b/src/main/resources/templates/gluon/elements/Input.ftl index 2cb8c7e9..067390de 100644 --- a/src/main/resources/templates/gluon/elements/Input.ftl +++ b/src/main/resources/templates/gluon/elements/Input.ftl @@ -1,4 +1,3 @@ -<#assign mode = definition_mode.toString()> <#if mode == "ARCHITECTURE_DEFINITION"> if data_mean: assert(data_std) diff --git a/src/main/resources/templates/gluon/elements/Lrn.ftl b/src/main/resources/templates/gluon/elements/Lrn.ftl index e186877c..b827006b 100644 --- a/src/main/resources/templates/gluon/elements/Lrn.ftl +++ b/src/main/resources/templates/gluon/elements/Lrn.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#if mode == "FORWARD_FUNCTION"> ${element.name} = F.LRN(data=${input}, alpha=${element.alpha?c}, diff --git a/src/main/resources/templates/gluon/elements/OneHot.ftl b/src/main/resources/templates/gluon/elements/OneHot.ftl index 70193469..40991a3a 100644 --- a/src/main/resources/templates/gluon/elements/OneHot.ftl +++ b/src/main/resources/templates/gluon/elements/OneHot.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#assign size = element.size> <#if mode == "ARCHITECTURE_DEFINITION"> self.${element.name} = OneHot(size=${size}) diff --git a/src/main/resources/templates/gluon/elements/Output.ftl b/src/main/resources/templates/gluon/elements/Output.ftl index 8f13d2d5..bf282c0c 100644 --- a/src/main/resources/templates/gluon/elements/Output.ftl +++ b/src/main/resources/templates/gluon/elements/Output.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#if mode == "ARCHITECTURE_DEFINITION"> <#if element.softmaxOutput> self.last_layers['${element.name}'] = 'softmax' @@ -12,9 +11,5 @@ </#if> </#if> <#if mode == "FORWARD_FUNCTION"> - <#if tc.architectureOutputs?size gt 1> outputs.append(${input}) - <#else> - return ${input} - </#if> </#if> diff --git a/src/main/resources/templates/gluon/elements/Pooling.ftl b/src/main/resources/templates/gluon/elements/Pooling.ftl index 84badf83..1d1cc9f3 100644 --- a/src/main/resources/templates/gluon/elements/Pooling.ftl +++ b/src/main/resources/templates/gluon/elements/Pooling.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#assign poolType = element.poolType> <#assign poolSize = "(" + tc.join(element.kernel, ",") + ")"> <#assign strides = "(" + tc.join(element.stride, ",") + ")"> diff --git a/src/main/resources/templates/gluon/elements/Relu.ftl b/src/main/resources/templates/gluon/elements/Relu.ftl index 34be9428..e71f42dd 100644 --- a/src/main/resources/templates/gluon/elements/Relu.ftl +++ b/src/main/resources/templates/gluon/elements/Relu.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#if mode == "ARCHITECTURE_DEFINITION"> self.${element.name} = gluon.nn.Activation(activation='relu') </#if> diff --git a/src/main/resources/templates/gluon/elements/Sigmoid.ftl b/src/main/resources/templates/gluon/elements/Sigmoid.ftl index d4ca5818..d8878609 100644 --- a/src/main/resources/templates/gluon/elements/Sigmoid.ftl +++ b/src/main/resources/templates/gluon/elements/Sigmoid.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#if mode == "ARCHITECTURE_DEFINITION"> self.${element.name} = gluon.nn.Activation(activation='sigmoid') </#if> diff --git a/src/main/resources/templates/gluon/elements/Softmax.ftl b/src/main/resources/templates/gluon/elements/Softmax.ftl index 45a8a41f..4e5f7ed2 100644 --- a/src/main/resources/templates/gluon/elements/Softmax.ftl +++ b/src/main/resources/templates/gluon/elements/Softmax.ftl @@ -1,6 +1,5 @@ <#-- This template is not used if the followiing architecture element is an output. See Output.ftl --> <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#if mode == "ARCHITECTURE_DEFINITION"> self.${element.name} = Softmax() </#if> diff --git a/src/main/resources/templates/gluon/elements/Split.ftl b/src/main/resources/templates/gluon/elements/Split.ftl index 1b466801..84ba4d16 100644 --- a/src/main/resources/templates/gluon/elements/Split.ftl +++ b/src/main/resources/templates/gluon/elements/Split.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#assign num_outputs = element.numOutputs?c> <#if mode == "ARCHITECTURE_DEFINITION"> self.${element.name} = Split(num_outputs=${num_outputs}, axis=1) diff --git a/src/main/resources/templates/gluon/elements/Tanh.ftl b/src/main/resources/templates/gluon/elements/Tanh.ftl index e5f0c9be..b6bd3b88 100644 --- a/src/main/resources/templates/gluon/elements/Tanh.ftl +++ b/src/main/resources/templates/gluon/elements/Tanh.ftl @@ -1,5 +1,4 @@ <#assign input = element.inputs[0]> -<#assign mode = definition_mode.toString()> <#if mode == "ARCHITECTURE_DEFINITION"> self.${element.name} = gluon.nn.Activation(activation='tanh') </#if> diff --git a/src/main/resources/templates/gluon/execute.ftl b/src/main/resources/templates/gluon/execute.ftl index 0a725613..fd8bd696 100644 --- a/src/main/resources/templates/gluon/execute.ftl +++ b/src/main/resources/templates/gluon/execute.ftl @@ -1,11 +1,14 @@ <#list tc.architecture.outputs as output> - <#assign shape = output.definition.type.dimensions> - vector<float> CNN_${tc.getName(output)}(<#list shape as dim>${dim?c}<#if dim?has_next>*</#if></#list>); + vector<float> CNN_${tc.getName(output)}(<#list output.definition.type.dimensions as dim>${dim?c}<#sep>*</#list>); </#list> - _cnn_.predict(<#list tc.architecture.inputs as input>CNNTranslator::translate(${input.name}<#if input.arrayAccess.isPresent()>[${input.arrayAccess.get().intValue.get()?c}]</#if>), - </#list><#list tc.architecture.outputs as output>CNN_${tc.getName(output)}<#if output?has_next>, - </#if></#list>); +<#list tc.architecture.streams as stream> +<#if stream.isNetwork()> + _predictor_${stream?index}_.predict(<#list stream.getFirstAtomicElements() as input>CNNTranslator::translate(${input.name}<#if input.arrayAccess.isPresent()>[${input.arrayAccess.get().intValue.get()?c}]</#if>), + </#list><#list stream.getLastAtomicElements() as output>CNN_${tc.getName(output)}<#sep>, + </#list>); +</#if> +</#list> <#list tc.architecture.outputs as output> <#assign shape = output.definition.type.dimensions> diff --git a/src/test/java/de/monticore/lang/monticar/cnnarch/gluongenerator/GenerationTest.java b/src/test/java/de/monticore/lang/monticar/cnnarch/gluongenerator/GenerationTest.java index 3b4b3af7..5da6b5c3 100644 --- a/src/test/java/de/monticore/lang/monticar/cnnarch/gluongenerator/GenerationTest.java +++ b/src/test/java/de/monticore/lang/monticar/cnnarch/gluongenerator/GenerationTest.java @@ -136,25 +136,12 @@ public class GenerationTest extends AbstractSymtabTest { assertTrue(Log.getFindings().isEmpty()); } - @Test - public void testMultipleOutputs() throws IOException, TemplateException { - Log.getFindings().clear(); - String[] args = {"-m", "src/test/resources/invalid_tests", "-r", "MultipleOutputs"}; - CNNArch2GluonCli.main(args); - assertTrue(Log.getFindings().size() == 2); - } - @Test public void testMultipleStreams() throws IOException, TemplateException { Log.getFindings().clear(); - String[] args = {"-m", "src/test/resources/invalid_tests", "-r", "MultipleStreams"}; - exit.expectSystemExit(); - exit.checkAssertionAfterwards(new Assertion() { - public void checkAssertion() { - assertTrue(Log.getFindings().size() == 2); - } - }); + String[] args = {"-m", "src/test/resources/valid_tests", "-r", "MultipleStreams"}; CNNArch2GluonCli.main(args); + assertTrue(Log.getFindings().isEmpty()); } @Test @@ -277,6 +264,7 @@ public class GenerationTest extends AbstractSymtabTest { Arrays.asList("FindArmadillo.cmake")); } + @Ignore @Test public void testDdpgConfig() { Log.getFindings().clear(); @@ -306,6 +294,7 @@ public class GenerationTest extends AbstractSymtabTest { ); } + @Ignore @Test public void testRosDdpgConfig() { Log.getFindings().clear(); diff --git a/src/test/resources/invalid_tests/MultipleOutputs.cnna b/src/test/resources/invalid_tests/MultipleOutputs.cnna deleted file mode 100644 index a7b7eff8..00000000 --- a/src/test/resources/invalid_tests/MultipleOutputs.cnna +++ /dev/null @@ -1,21 +0,0 @@ -architecture MultipleOutputs{ - def input Q(-oo:+oo)^{10} data - def output Q(0:1)^{4} pred[2] - - data -> - FullyConnected(units=128, no_bias=true) -> - Tanh() -> - ( - FullyConnected(units=16, no_bias=true) -> - Tanh() -> - FullyConnected(units=4, no_bias=true) -> - Softmax() - | - FullyConnected(units=16, no_bias=true) -> - Tanh() -> - FullyConnected(units=4, no_bias=true) -> - Softmax() - ) -> - pred; - -} \ No newline at end of file diff --git a/src/test/resources/invalid_tests/data_paths.txt b/src/test/resources/invalid_tests/data_paths.txt index f117f244..e69de29b 100644 --- a/src/test/resources/invalid_tests/data_paths.txt +++ b/src/test/resources/invalid_tests/data_paths.txt @@ -1,2 +0,0 @@ -MultipleStreams data/MultipleStreams -MultipleOutputs data/MultipleOutputs \ No newline at end of file diff --git a/src/test/resources/target_code/CNNCreator_Alexnet.py b/src/test/resources/target_code/CNNCreator_Alexnet.py index d4c631d2..eb72dd0a 100644 --- a/src/test/resources/target_code/CNNCreator_Alexnet.py +++ b/src/test/resources/target_code/CNNCreator_Alexnet.py @@ -1,55 +1,59 @@ import mxnet as mx import logging import os -from CNNNet_Alexnet import Net +from CNNNet_Alexnet import Net_0 class CNNCreator_Alexnet: _model_dir_ = "model/Alexnet/" _model_prefix_ = "model" - _input_shapes_ = [(3,224,224,)] def __init__(self): self.weight_initializer = mx.init.Normal() - self.net = None - - def get_input_shapes(self): - return self._input_shapes_ + self.networks = {} def load(self, context): - lastEpoch = 0 - param_file = None - - try: - os.remove(self._model_dir_ + self._model_prefix_ + "_newest-0000.params") - except OSError: - pass - try: - os.remove(self._model_dir_ + self._model_prefix_ + "_newest-symbol.json") - except OSError: - pass - - if os.path.isdir(self._model_dir_): - for file in os.listdir(self._model_dir_): - if ".params" in file and self._model_prefix_ in file: - epochStr = file.replace(".params","").replace(self._model_prefix_ + "-","") - epoch = int(epochStr) - if epoch > lastEpoch: - lastEpoch = epoch - param_file = file - if param_file is None: - return 0 - else: - logging.info("Loading checkpoint: " + param_file) - self.net.load_parameters(self._model_dir_ + param_file) - return lastEpoch + earliestLastEpoch = None + + for i, network in self.networks.items(): + lastEpoch = 0 + param_file = None + + try: + os.remove(self._model_dir_ + self._model_prefix_ + "_" + str(i) + "_newest-0000.params") + except OSError: + pass + try: + os.remove(self._model_dir_ + self._model_prefix_ + "_" + str(i) + "_newest-symbol.json") + except OSError: + pass + + if os.path.isdir(self._model_dir_): + for file in os.listdir(self._model_dir_): + if ".params" in file and self._model_prefix_ + "_" + str(i) in file: + epochStr = file.replace(".params","").replace(self._model_prefix_ + "_" + str(i) + "-","") + epoch = int(epochStr) + if epoch > lastEpoch: + lastEpoch = epoch + param_file = file + if param_file is None: + earliestLastEpoch = 0 + else: + logging.info("Loading checkpoint: " + param_file) + network.load_parameters(self._model_dir_ + param_file) + + if earliestLastEpoch == None or lastEpoch < earliestLastEpoch: + earliestLastEpoch = lastEpoch + + return earliestLastEpoch def construct(self, context, data_mean=None, data_std=None): - self.net = Net(data_mean=data_mean, data_std=data_std) - self.net.collect_params().initialize(self.weight_initializer, ctx=context) - self.net.hybridize() - self.net(mx.nd.zeros((1,) + self._input_shapes_[0], ctx=context)) + self.networks[0] = Net_0(data_mean=data_mean, data_std=data_std) + self.networks[0].collect_params().initialize(self.weight_initializer, ctx=context) + self.networks[0].hybridize() + self.networks[0](mx.nd.zeros((1, 3,224,224,), ctx=context)) if not os.path.exists(self._model_dir_): os.makedirs(self._model_dir_) - self.net.export(self._model_dir_ + self._model_prefix_, epoch=0) + for i, network in self.networks.items(): + network.export(self._model_dir_ + self._model_prefix_ + "_" + str(i), epoch=0) diff --git a/src/test/resources/target_code/CNNCreator_CifarClassifierNetwork.py b/src/test/resources/target_code/CNNCreator_CifarClassifierNetwork.py index 64464bc2..a9de51e1 100644 --- a/src/test/resources/target_code/CNNCreator_CifarClassifierNetwork.py +++ b/src/test/resources/target_code/CNNCreator_CifarClassifierNetwork.py @@ -1,55 +1,59 @@ import mxnet as mx import logging import os -from CNNNet_CifarClassifierNetwork import Net +from CNNNet_CifarClassifierNetwork import Net_0 class CNNCreator_CifarClassifierNetwork: _model_dir_ = "model/CifarClassifierNetwork/" _model_prefix_ = "model" - _input_shapes_ = [(3,32,32,)] def __init__(self): self.weight_initializer = mx.init.Normal() - self.net = None - - def get_input_shapes(self): - return self._input_shapes_ + self.networks = {} def load(self, context): - lastEpoch = 0 - param_file = None - - try: - os.remove(self._model_dir_ + self._model_prefix_ + "_newest-0000.params") - except OSError: - pass - try: - os.remove(self._model_dir_ + self._model_prefix_ + "_newest-symbol.json") - except OSError: - pass - - if os.path.isdir(self._model_dir_): - for file in os.listdir(self._model_dir_): - if ".params" in file and self._model_prefix_ in file: - epochStr = file.replace(".params","").replace(self._model_prefix_ + "-","") - epoch = int(epochStr) - if epoch > lastEpoch: - lastEpoch = epoch - param_file = file - if param_file is None: - return 0 - else: - logging.info("Loading checkpoint: " + param_file) - self.net.load_parameters(self._model_dir_ + param_file) - return lastEpoch + earliestLastEpoch = None + + for i, network in self.networks.items(): + lastEpoch = 0 + param_file = None + + try: + os.remove(self._model_dir_ + self._model_prefix_ + "_" + str(i) + "_newest-0000.params") + except OSError: + pass + try: + os.remove(self._model_dir_ + self._model_prefix_ + "_" + str(i) + "_newest-symbol.json") + except OSError: + pass + + if os.path.isdir(self._model_dir_): + for file in os.listdir(self._model_dir_): + if ".params" in file and self._model_prefix_ + "_" + str(i) in file: + epochStr = file.replace(".params","").replace(self._model_prefix_ + "_" + str(i) + "-","") + epoch = int(epochStr) + if epoch > lastEpoch: + lastEpoch = epoch + param_file = file + if param_file is None: + earliestLastEpoch = 0 + else: + logging.info("Loading checkpoint: " + param_file) + network.load_parameters(self._model_dir_ + param_file) + + if earliestLastEpoch == None or lastEpoch < earliestLastEpoch: + earliestLastEpoch = lastEpoch + + return earliestLastEpoch def construct(self, context, data_mean=None, data_std=None): - self.net = Net(data_mean=data_mean, data_std=data_std) - self.net.collect_params().initialize(self.weight_initializer, ctx=context) - self.net.hybridize() - self.net(mx.nd.zeros((1,) + self._input_shapes_[0], ctx=context)) + self.networks[0] = Net_0(data_mean=data_mean, data_std=data_std) + self.networks[0].collect_params().initialize(self.weight_initializer, ctx=context) + self.networks[0].hybridize() + self.networks[0](mx.nd.zeros((1, 3,32,32,), ctx=context)) if not os.path.exists(self._model_dir_): os.makedirs(self._model_dir_) - self.net.export(self._model_dir_ + self._model_prefix_, epoch=0) + for i, network in self.networks.items(): + network.export(self._model_dir_ + self._model_prefix_ + "_" + str(i), epoch=0) diff --git a/src/test/resources/target_code/CNNCreator_VGG16.py b/src/test/resources/target_code/CNNCreator_VGG16.py index d8ea0fd7..786b24e0 100644 --- a/src/test/resources/target_code/CNNCreator_VGG16.py +++ b/src/test/resources/target_code/CNNCreator_VGG16.py @@ -1,55 +1,59 @@ import mxnet as mx import logging import os -from CNNNet_VGG16 import Net +from CNNNet_VGG16 import Net_0 class CNNCreator_VGG16: _model_dir_ = "model/VGG16/" _model_prefix_ = "model" - _input_shapes_ = [(3,224,224,)] def __init__(self): self.weight_initializer = mx.init.Normal() - self.net = None - - def get_input_shapes(self): - return self._input_shapes_ + self.networks = {} def load(self, context): - lastEpoch = 0 - param_file = None - - try: - os.remove(self._model_dir_ + self._model_prefix_ + "_newest-0000.params") - except OSError: - pass - try: - os.remove(self._model_dir_ + self._model_prefix_ + "_newest-symbol.json") - except OSError: - pass - - if os.path.isdir(self._model_dir_): - for file in os.listdir(self._model_dir_): - if ".params" in file and self._model_prefix_ in file: - epochStr = file.replace(".params","").replace(self._model_prefix_ + "-","") - epoch = int(epochStr) - if epoch > lastEpoch: - lastEpoch = epoch - param_file = file - if param_file is None: - return 0 - else: - logging.info("Loading checkpoint: " + param_file) - self.net.load_parameters(self._model_dir_ + param_file) - return lastEpoch + earliestLastEpoch = None + + for i, network in self.networks.items(): + lastEpoch = 0 + param_file = None + + try: + os.remove(self._model_dir_ + self._model_prefix_ + "_" + str(i) + "_newest-0000.params") + except OSError: + pass + try: + os.remove(self._model_dir_ + self._model_prefix_ + "_" + str(i) + "_newest-symbol.json") + except OSError: + pass + + if os.path.isdir(self._model_dir_): + for file in os.listdir(self._model_dir_): + if ".params" in file and self._model_prefix_ + "_" + str(i) in file: + epochStr = file.replace(".params","").replace(self._model_prefix_ + "_" + str(i) + "-","") + epoch = int(epochStr) + if epoch > lastEpoch: + lastEpoch = epoch + param_file = file + if param_file is None: + earliestLastEpoch = 0 + else: + logging.info("Loading checkpoint: " + param_file) + network.load_parameters(self._model_dir_ + param_file) + + if earliestLastEpoch == None or lastEpoch < earliestLastEpoch: + earliestLastEpoch = lastEpoch + + return earliestLastEpoch def construct(self, context, data_mean=None, data_std=None): - self.net = Net(data_mean=data_mean, data_std=data_std) - self.net.collect_params().initialize(self.weight_initializer, ctx=context) - self.net.hybridize() - self.net(mx.nd.zeros((1,) + self._input_shapes_[0], ctx=context)) + self.networks[0] = Net_0(data_mean=data_mean, data_std=data_std) + self.networks[0].collect_params().initialize(self.weight_initializer, ctx=context) + self.networks[0].hybridize() + self.networks[0](mx.nd.zeros((1, 3,224,224,), ctx=context)) if not os.path.exists(self._model_dir_): os.makedirs(self._model_dir_) - self.net.export(self._model_dir_ + self._model_prefix_, epoch=0) + for i, network in self.networks.items(): + network.export(self._model_dir_ + self._model_prefix_ + "_" + str(i), epoch=0) diff --git a/src/test/resources/target_code/CNNNet_Alexnet.py b/src/test/resources/target_code/CNNNet_Alexnet.py index 040d2dbc..8eca66e8 100644 --- a/src/test/resources/target_code/CNNNet_Alexnet.py +++ b/src/test/resources/target_code/CNNNet_Alexnet.py @@ -78,9 +78,9 @@ class NoNormalization(gluon.HybridBlock): return x -class Net(gluon.HybridBlock): +class Net_0(gluon.HybridBlock): def __init__(self, data_mean=None, data_std=None, **kwargs): - super(Net, self).__init__(**kwargs) + super(Net_0, self).__init__(**kwargs) self.last_layers = {} with self.name_scope(): if data_mean: @@ -209,6 +209,7 @@ class Net(gluon.HybridBlock): def hybrid_forward(self, F, data): + outputs = [] data = self.input_normalization_data(data) conv1_padding = self.conv1_padding(data) conv1_ = self.conv1_(conv1_padding) @@ -270,5 +271,6 @@ class Net(gluon.HybridBlock): relu7_ = self.relu7_(fc7_) dropout7_ = self.dropout7_(relu7_) fc8_ = self.fc8_(dropout7_) - return fc8_ + outputs.append(fc8_) + return outputs[0] diff --git a/src/test/resources/target_code/CNNNet_CifarClassifierNetwork.py b/src/test/resources/target_code/CNNNet_CifarClassifierNetwork.py index 6c92897c..30fadec8 100644 --- a/src/test/resources/target_code/CNNNet_CifarClassifierNetwork.py +++ b/src/test/resources/target_code/CNNNet_CifarClassifierNetwork.py @@ -78,9 +78,9 @@ class NoNormalization(gluon.HybridBlock): return x -class Net(gluon.HybridBlock): +class Net_0(gluon.HybridBlock): def __init__(self, data_mean=None, data_std=None, **kwargs): - super(Net, self).__init__(**kwargs) + super(Net_0, self).__init__(**kwargs) self.last_layers = {} with self.name_scope(): if data_mean: @@ -360,6 +360,7 @@ class Net(gluon.HybridBlock): def hybrid_forward(self, F, data): + outputs = [] data = self.input_normalization_data(data) conv2_1_padding = self.conv2_1_padding(data) conv2_1_ = self.conv2_1_(conv2_1_padding) @@ -463,5 +464,6 @@ class Net(gluon.HybridBlock): fc31_ = self.fc31_(globalpooling31_) dropout31_ = self.dropout31_(fc31_) fc32_ = self.fc32_(dropout31_) - return fc32_ + outputs.append(fc32_) + return outputs[0] diff --git a/src/test/resources/target_code/CNNNet_VGG16.py b/src/test/resources/target_code/CNNNet_VGG16.py index 53e31296..948dd0c1 100644 --- a/src/test/resources/target_code/CNNNet_VGG16.py +++ b/src/test/resources/target_code/CNNNet_VGG16.py @@ -78,9 +78,9 @@ class NoNormalization(gluon.HybridBlock): return x -class Net(gluon.HybridBlock): +class Net_0(gluon.HybridBlock): def __init__(self, data_mean=None, data_std=None, **kwargs): - super(Net, self).__init__(**kwargs) + super(Net_0, self).__init__(**kwargs) self.last_layers = {} with self.name_scope(): if data_mean: @@ -237,6 +237,7 @@ class Net(gluon.HybridBlock): def hybrid_forward(self, F, data): + outputs = [] data = self.input_normalization_data(data) conv1_padding = self.conv1_padding(data) conv1_ = self.conv1_(conv1_padding) @@ -290,5 +291,6 @@ class Net(gluon.HybridBlock): relu15_ = self.relu15_(fc14_) dropout15_ = self.dropout15_(relu15_) fc15_ = self.fc15_(dropout15_) - return fc15_ + outputs.append(fc15_) + return outputs[0] diff --git a/src/test/resources/target_code/CNNPredictor_Alexnet.h b/src/test/resources/target_code/CNNPredictor_Alexnet.h index 991d5ab7..c954141d 100644 --- a/src/test/resources/target_code/CNNPredictor_Alexnet.h +++ b/src/test/resources/target_code/CNNPredictor_Alexnet.h @@ -9,10 +9,10 @@ #include <CNNBufferFile.h> -class CNNPredictor_Alexnet{ +class CNNPredictor_Alexnet_0{ public: - const std::string json_file = "model/Alexnet/model_newest-symbol.json"; - const std::string param_file = "model/Alexnet/model_newest-0000.params"; + const std::string json_file = "model/Alexnet/model_0_newest-symbol.json"; + const std::string param_file = "model/Alexnet/model_0_newest-0000.params"; const std::vector<std::string> input_keys = { "data" }; @@ -21,11 +21,11 @@ public: PredictorHandle handle; - explicit CNNPredictor_Alexnet(){ + explicit CNNPredictor_Alexnet_0(){ init(json_file, param_file, input_keys, input_shapes, use_gpu); } - ~CNNPredictor_Alexnet(){ + ~CNNPredictor_Alexnet_0(){ if(handle) MXPredFree(handle); } diff --git a/src/test/resources/target_code/CNNPredictor_CifarClassifierNetwork.h b/src/test/resources/target_code/CNNPredictor_CifarClassifierNetwork.h index 8dcb0058..36b3c9f0 100644 --- a/src/test/resources/target_code/CNNPredictor_CifarClassifierNetwork.h +++ b/src/test/resources/target_code/CNNPredictor_CifarClassifierNetwork.h @@ -9,10 +9,10 @@ #include <CNNBufferFile.h> -class CNNPredictor_CifarClassifierNetwork{ +class CNNPredictor_CifarClassifierNetwork_0{ public: - const std::string json_file = "model/CifarClassifierNetwork/model_newest-symbol.json"; - const std::string param_file = "model/CifarClassifierNetwork/model_newest-0000.params"; + const std::string json_file = "model/CifarClassifierNetwork/model_0_newest-symbol.json"; + const std::string param_file = "model/CifarClassifierNetwork/model_0_newest-0000.params"; const std::vector<std::string> input_keys = { "data" }; @@ -21,11 +21,11 @@ public: PredictorHandle handle; - explicit CNNPredictor_CifarClassifierNetwork(){ + explicit CNNPredictor_CifarClassifierNetwork_0(){ init(json_file, param_file, input_keys, input_shapes, use_gpu); } - ~CNNPredictor_CifarClassifierNetwork(){ + ~CNNPredictor_CifarClassifierNetwork_0(){ if(handle) MXPredFree(handle); } diff --git a/src/test/resources/target_code/CNNPredictor_VGG16.h b/src/test/resources/target_code/CNNPredictor_VGG16.h index e90db97a..c2aea96f 100644 --- a/src/test/resources/target_code/CNNPredictor_VGG16.h +++ b/src/test/resources/target_code/CNNPredictor_VGG16.h @@ -9,10 +9,10 @@ #include <CNNBufferFile.h> -class CNNPredictor_VGG16{ +class CNNPredictor_VGG16_0{ public: - const std::string json_file = "model/VGG16/model_newest-symbol.json"; - const std::string param_file = "model/VGG16/model_newest-0000.params"; + const std::string json_file = "model/VGG16/model_0_newest-symbol.json"; + const std::string param_file = "model/VGG16/model_0_newest-0000.params"; const std::vector<std::string> input_keys = { "data" }; @@ -21,11 +21,11 @@ public: PredictorHandle handle; - explicit CNNPredictor_VGG16(){ + explicit CNNPredictor_VGG16_0(){ init(json_file, param_file, input_keys, input_shapes, use_gpu); } - ~CNNPredictor_VGG16(){ + ~CNNPredictor_VGG16_0(){ if(handle) MXPredFree(handle); } diff --git a/src/test/resources/target_code/CNNSupervisedTrainer_Alexnet.py b/src/test/resources/target_code/CNNSupervisedTrainer_Alexnet.py index 3355e664..3a121968 100644 --- a/src/test/resources/target_code/CNNSupervisedTrainer_Alexnet.py +++ b/src/test/resources/target_code/CNNSupervisedTrainer_Alexnet.py @@ -7,10 +7,10 @@ import shutil from mxnet import gluon, autograd, nd class CNNSupervisedTrainer_Alexnet: - def __init__(self, data_loader, net_constructor, net=None): + def __init__(self, data_loader, net_constructor): self._data_loader = data_loader self._net_creator = net_constructor - self._net = net + self._networks = {} def train(self, batch_size=64, num_epoch=10, @@ -45,12 +45,11 @@ class CNNSupervisedTrainer_Alexnet: train_iter, test_iter, data_mean, data_std = self._data_loader.load_data(batch_size) - if self._net is None: - if normalize: - self._net_creator.construct( - context=mx_context, data_mean=data_mean, data_std=data_std) - else: - self._net_creator.construct(context=mx_context) + + if normalize: + self._net_creator.construct(context=mx_context, data_mean=data_mean, data_std=data_std) + else: + self._net_creator.construct(context=mx_context) begin_epoch = 0 if load_checkpoint: @@ -59,7 +58,7 @@ class CNNSupervisedTrainer_Alexnet: if os.path.isdir(self._net_creator._model_dir_): shutil.rmtree(self._net_creator._model_dir_) - self._net = self._net_creator.net + self._networks = self._net_creator.networks try: os.makedirs(self._net_creator._model_dir_) @@ -67,20 +66,21 @@ class CNNSupervisedTrainer_Alexnet: if not os.path.isdir(self._net_creator._model_dir_): raise - trainer = mx.gluon.Trainer(self._net.collect_params(), optimizer, optimizer_params) + trainers = [mx.gluon.Trainer(network.collect_params(), optimizer, optimizer_params) for network in self._networks.values()] loss_functions = {} - for output_name, last_layer in self._net.last_layers.items(): - if last_layer == 'softmax': - loss_functions[output_name] = mx.gluon.loss.SoftmaxCrossEntropyLoss() - elif last_layer == 'sigmoid': - loss_functions[output_name] = mx.gluon.loss.SigmoidBinaryCrossEntropyLoss() - elif last_layer == 'linear': - loss_functions[output_name] = mx.gluon.loss.L2Loss() - else: - loss_functions[output_name] = mx.gluon.loss.L2Loss() - logging.warning("Invalid last layer, defaulting to L2 loss") + for network in self._networks.values(): + for output_name, last_layer in network.last_layers.items(): + if last_layer == 'softmax': + loss_functions[output_name] = mx.gluon.loss.SoftmaxCrossEntropyLoss() + elif last_layer == 'sigmoid': + loss_functions[output_name] = mx.gluon.loss.SigmoidBinaryCrossEntropyLoss() + elif last_layer == 'linear': + loss_functions[output_name] = mx.gluon.loss.L2Loss() + else: + loss_functions[output_name] = mx.gluon.loss.L2Loss() + logging.warning("Invalid last layer, defaulting to L2 loss") speed_period = 50 tic = None @@ -92,12 +92,14 @@ class CNNSupervisedTrainer_Alexnet: predictions_label = batch.label[0].as_in_context(mx_context) with autograd.record(): - predictions_output = self._net(data_data) + predictions_output = self._networks[0](data_data) loss = loss_functions['predictions'](predictions_output, predictions_label) loss.backward() - trainer.step(batch_size) + + for trainer in trainers: + trainer.step(batch_size) if tic is None: tic = time.time() @@ -123,7 +125,7 @@ class CNNSupervisedTrainer_Alexnet: batch.label[0].as_in_context(mx_context) ] - predictions_output = self._net(data_data) + predictions_output = self._networks[0](data_data) predictions = [ mx.nd.argmax(predictions_output, axis=1) @@ -141,8 +143,7 @@ class CNNSupervisedTrainer_Alexnet: batch.label[0].as_in_context(mx_context) ] - predictions_output = self._net(data_data) - + predictions_output = self._networks[0](data_data) predictions = [ mx.nd.argmax(predictions_output, axis=1) ] @@ -153,10 +154,12 @@ class CNNSupervisedTrainer_Alexnet: logging.info("Epoch[%d] Train: %f, Test: %f" % (epoch, train_metric_score, test_metric_score)) if (epoch - begin_epoch) % checkpoint_period == 0: - self._net.save_parameters(self.parameter_path() + '-' + str(epoch).zfill(4) + '.params') + for i, network in self._networks.items(): + network.save_parameters(self.parameter_path(i) + '-' + str(epoch).zfill(4) + '.params') - self._net.save_parameters(self.parameter_path() + '-' + str(num_epoch + begin_epoch).zfill(4) + '.params') - self._net.export(self.parameter_path() + '_newest', epoch=0) + for i, network in self._networks.items(): + network.save_parameters(self.parameter_path(i) + '-' + str(num_epoch + begin_epoch).zfill(4) + '.params') + network.export(self.parameter_path(i) + '_newest', epoch=0) - def parameter_path(self): - return self._net_creator._model_dir_ + self._net_creator._model_prefix_ \ No newline at end of file + def parameter_path(self, index): + return self._net_creator._model_dir_ + self._net_creator._model_prefix_ + '_' + str(index) \ No newline at end of file diff --git a/src/test/resources/target_code/CNNSupervisedTrainer_CifarClassifierNetwork.py b/src/test/resources/target_code/CNNSupervisedTrainer_CifarClassifierNetwork.py index 3a409511..bde71a26 100644 --- a/src/test/resources/target_code/CNNSupervisedTrainer_CifarClassifierNetwork.py +++ b/src/test/resources/target_code/CNNSupervisedTrainer_CifarClassifierNetwork.py @@ -7,10 +7,10 @@ import shutil from mxnet import gluon, autograd, nd class CNNSupervisedTrainer_CifarClassifierNetwork: - def __init__(self, data_loader, net_constructor, net=None): + def __init__(self, data_loader, net_constructor): self._data_loader = data_loader self._net_creator = net_constructor - self._net = net + self._networks = {} def train(self, batch_size=64, num_epoch=10, @@ -45,12 +45,11 @@ class CNNSupervisedTrainer_CifarClassifierNetwork: train_iter, test_iter, data_mean, data_std = self._data_loader.load_data(batch_size) - if self._net is None: - if normalize: - self._net_creator.construct( - context=mx_context, data_mean=data_mean, data_std=data_std) - else: - self._net_creator.construct(context=mx_context) + + if normalize: + self._net_creator.construct(context=mx_context, data_mean=data_mean, data_std=data_std) + else: + self._net_creator.construct(context=mx_context) begin_epoch = 0 if load_checkpoint: @@ -59,7 +58,7 @@ class CNNSupervisedTrainer_CifarClassifierNetwork: if os.path.isdir(self._net_creator._model_dir_): shutil.rmtree(self._net_creator._model_dir_) - self._net = self._net_creator.net + self._networks = self._net_creator.networks try: os.makedirs(self._net_creator._model_dir_) @@ -67,20 +66,21 @@ class CNNSupervisedTrainer_CifarClassifierNetwork: if not os.path.isdir(self._net_creator._model_dir_): raise - trainer = mx.gluon.Trainer(self._net.collect_params(), optimizer, optimizer_params) + trainers = [mx.gluon.Trainer(network.collect_params(), optimizer, optimizer_params) for network in self._networks.values()] loss_functions = {} - for output_name, last_layer in self._net.last_layers.items(): - if last_layer == 'softmax': - loss_functions[output_name] = mx.gluon.loss.SoftmaxCrossEntropyLoss() - elif last_layer == 'sigmoid': - loss_functions[output_name] = mx.gluon.loss.SigmoidBinaryCrossEntropyLoss() - elif last_layer == 'linear': - loss_functions[output_name] = mx.gluon.loss.L2Loss() - else: - loss_functions[output_name] = mx.gluon.loss.L2Loss() - logging.warning("Invalid last layer, defaulting to L2 loss") + for network in self._networks.values(): + for output_name, last_layer in network.last_layers.items(): + if last_layer == 'softmax': + loss_functions[output_name] = mx.gluon.loss.SoftmaxCrossEntropyLoss() + elif last_layer == 'sigmoid': + loss_functions[output_name] = mx.gluon.loss.SigmoidBinaryCrossEntropyLoss() + elif last_layer == 'linear': + loss_functions[output_name] = mx.gluon.loss.L2Loss() + else: + loss_functions[output_name] = mx.gluon.loss.L2Loss() + logging.warning("Invalid last layer, defaulting to L2 loss") speed_period = 50 tic = None @@ -92,12 +92,14 @@ class CNNSupervisedTrainer_CifarClassifierNetwork: softmax_label = batch.label[0].as_in_context(mx_context) with autograd.record(): - softmax_output = self._net(data_data) + softmax_output = self._networks[0](data_data) loss = loss_functions['softmax'](softmax_output, softmax_label) loss.backward() - trainer.step(batch_size) + + for trainer in trainers: + trainer.step(batch_size) if tic is None: tic = time.time() @@ -123,7 +125,7 @@ class CNNSupervisedTrainer_CifarClassifierNetwork: batch.label[0].as_in_context(mx_context) ] - softmax_output = self._net(data_data) + softmax_output = self._networks[0](data_data) predictions = [ mx.nd.argmax(softmax_output, axis=1) @@ -141,8 +143,7 @@ class CNNSupervisedTrainer_CifarClassifierNetwork: batch.label[0].as_in_context(mx_context) ] - softmax_output = self._net(data_data) - + softmax_output = self._networks[0](data_data) predictions = [ mx.nd.argmax(softmax_output, axis=1) ] @@ -153,10 +154,12 @@ class CNNSupervisedTrainer_CifarClassifierNetwork: logging.info("Epoch[%d] Train: %f, Test: %f" % (epoch, train_metric_score, test_metric_score)) if (epoch - begin_epoch) % checkpoint_period == 0: - self._net.save_parameters(self.parameter_path() + '-' + str(epoch).zfill(4) + '.params') + for i, network in self._networks.items(): + network.save_parameters(self.parameter_path(i) + '-' + str(epoch).zfill(4) + '.params') - self._net.save_parameters(self.parameter_path() + '-' + str(num_epoch + begin_epoch).zfill(4) + '.params') - self._net.export(self.parameter_path() + '_newest', epoch=0) + for i, network in self._networks.items(): + network.save_parameters(self.parameter_path(i) + '-' + str(num_epoch + begin_epoch).zfill(4) + '.params') + network.export(self.parameter_path(i) + '_newest', epoch=0) - def parameter_path(self): - return self._net_creator._model_dir_ + self._net_creator._model_prefix_ \ No newline at end of file + def parameter_path(self, index): + return self._net_creator._model_dir_ + self._net_creator._model_prefix_ + '_' + str(index) \ No newline at end of file diff --git a/src/test/resources/target_code/CNNSupervisedTrainer_VGG16.py b/src/test/resources/target_code/CNNSupervisedTrainer_VGG16.py index f4c124e2..6c27eeb2 100644 --- a/src/test/resources/target_code/CNNSupervisedTrainer_VGG16.py +++ b/src/test/resources/target_code/CNNSupervisedTrainer_VGG16.py @@ -7,10 +7,10 @@ import shutil from mxnet import gluon, autograd, nd class CNNSupervisedTrainer_VGG16: - def __init__(self, data_loader, net_constructor, net=None): + def __init__(self, data_loader, net_constructor): self._data_loader = data_loader self._net_creator = net_constructor - self._net = net + self._networks = {} def train(self, batch_size=64, num_epoch=10, @@ -45,12 +45,11 @@ class CNNSupervisedTrainer_VGG16: train_iter, test_iter, data_mean, data_std = self._data_loader.load_data(batch_size) - if self._net is None: - if normalize: - self._net_creator.construct( - context=mx_context, data_mean=data_mean, data_std=data_std) - else: - self._net_creator.construct(context=mx_context) + + if normalize: + self._net_creator.construct(context=mx_context, data_mean=data_mean, data_std=data_std) + else: + self._net_creator.construct(context=mx_context) begin_epoch = 0 if load_checkpoint: @@ -59,7 +58,7 @@ class CNNSupervisedTrainer_VGG16: if os.path.isdir(self._net_creator._model_dir_): shutil.rmtree(self._net_creator._model_dir_) - self._net = self._net_creator.net + self._networks = self._net_creator.networks try: os.makedirs(self._net_creator._model_dir_) @@ -67,20 +66,21 @@ class CNNSupervisedTrainer_VGG16: if not os.path.isdir(self._net_creator._model_dir_): raise - trainer = mx.gluon.Trainer(self._net.collect_params(), optimizer, optimizer_params) + trainers = [mx.gluon.Trainer(network.collect_params(), optimizer, optimizer_params) for network in self._networks.values()] loss_functions = {} - for output_name, last_layer in self._net.last_layers.items(): - if last_layer == 'softmax': - loss_functions[output_name] = mx.gluon.loss.SoftmaxCrossEntropyLoss() - elif last_layer == 'sigmoid': - loss_functions[output_name] = mx.gluon.loss.SigmoidBinaryCrossEntropyLoss() - elif last_layer == 'linear': - loss_functions[output_name] = mx.gluon.loss.L2Loss() - else: - loss_functions[output_name] = mx.gluon.loss.L2Loss() - logging.warning("Invalid last layer, defaulting to L2 loss") + for network in self._networks.values(): + for output_name, last_layer in network.last_layers.items(): + if last_layer == 'softmax': + loss_functions[output_name] = mx.gluon.loss.SoftmaxCrossEntropyLoss() + elif last_layer == 'sigmoid': + loss_functions[output_name] = mx.gluon.loss.SigmoidBinaryCrossEntropyLoss() + elif last_layer == 'linear': + loss_functions[output_name] = mx.gluon.loss.L2Loss() + else: + loss_functions[output_name] = mx.gluon.loss.L2Loss() + logging.warning("Invalid last layer, defaulting to L2 loss") speed_period = 50 tic = None @@ -92,12 +92,14 @@ class CNNSupervisedTrainer_VGG16: predictions_label = batch.label[0].as_in_context(mx_context) with autograd.record(): - predictions_output = self._net(data_data) + predictions_output = self._networks[0](data_data) loss = loss_functions['predictions'](predictions_output, predictions_label) loss.backward() - trainer.step(batch_size) + + for trainer in trainers: + trainer.step(batch_size) if tic is None: tic = time.time() @@ -123,7 +125,7 @@ class CNNSupervisedTrainer_VGG16: batch.label[0].as_in_context(mx_context) ] - predictions_output = self._net(data_data) + predictions_output = self._networks[0](data_data) predictions = [ mx.nd.argmax(predictions_output, axis=1) @@ -141,8 +143,7 @@ class CNNSupervisedTrainer_VGG16: batch.label[0].as_in_context(mx_context) ] - predictions_output = self._net(data_data) - + predictions_output = self._networks[0](data_data) predictions = [ mx.nd.argmax(predictions_output, axis=1) ] @@ -153,10 +154,12 @@ class CNNSupervisedTrainer_VGG16: logging.info("Epoch[%d] Train: %f, Test: %f" % (epoch, train_metric_score, test_metric_score)) if (epoch - begin_epoch) % checkpoint_period == 0: - self._net.save_parameters(self.parameter_path() + '-' + str(epoch).zfill(4) + '.params') + for i, network in self._networks.items(): + network.save_parameters(self.parameter_path(i) + '-' + str(epoch).zfill(4) + '.params') - self._net.save_parameters(self.parameter_path() + '-' + str(num_epoch + begin_epoch).zfill(4) + '.params') - self._net.export(self.parameter_path() + '_newest', epoch=0) + for i, network in self._networks.items(): + network.save_parameters(self.parameter_path(i) + '-' + str(num_epoch + begin_epoch).zfill(4) + '.params') + network.export(self.parameter_path(i) + '_newest', epoch=0) - def parameter_path(self): - return self._net_creator._model_dir_ + self._net_creator._model_prefix_ \ No newline at end of file + def parameter_path(self, index): + return self._net_creator._model_dir_ + self._net_creator._model_prefix_ + '_' + str(index) \ No newline at end of file diff --git a/src/test/resources/target_code/execute_Alexnet b/src/test/resources/target_code/execute_Alexnet index 7f1bc1b4..5b4f2f91 100644 --- a/src/test/resources/target_code/execute_Alexnet +++ b/src/test/resources/target_code/execute_Alexnet @@ -1,6 +1,6 @@ vector<float> CNN_predictions(10); - _cnn_.predict(CNNTranslator::translate(data), + _predictor_0_.predict(CNNTranslator::translate(data), CNN_predictions); - predictions = CNNTranslator::translateToCol(CNN_predictions, std::vector<size_t> {10}); \ No newline at end of file + predictions = CNNTranslator::translateToCol(CNN_predictions, std::vector<size_t> {10}); diff --git a/src/test/resources/target_code/execute_CifarClassifierNetwork b/src/test/resources/target_code/execute_CifarClassifierNetwork index 1611f85a..480919f4 100644 --- a/src/test/resources/target_code/execute_CifarClassifierNetwork +++ b/src/test/resources/target_code/execute_CifarClassifierNetwork @@ -1,6 +1,6 @@ vector<float> CNN_softmax(10); - _cnn_.predict(CNNTranslator::translate(data), + _predictor_0_.predict(CNNTranslator::translate(data), CNN_softmax); - softmax = CNNTranslator::translateToCol(CNN_softmax, std::vector<size_t> {10}); \ No newline at end of file + softmax = CNNTranslator::translateToCol(CNN_softmax, std::vector<size_t> {10}); diff --git a/src/test/resources/target_code/execute_VGG16 b/src/test/resources/target_code/execute_VGG16 index dcad53eb..8af6ff88 100644 --- a/src/test/resources/target_code/execute_VGG16 +++ b/src/test/resources/target_code/execute_VGG16 @@ -1,6 +1,6 @@ vector<float> CNN_predictions(1000); - _cnn_.predict(CNNTranslator::translate(data), + _predictor_0_.predict(CNNTranslator::translate(data), CNN_predictions); - predictions = CNNTranslator::translateToCol(CNN_predictions, std::vector<size_t> {1000}); \ No newline at end of file + predictions = CNNTranslator::translateToCol(CNN_predictions, std::vector<size_t> {1000}); diff --git a/src/test/resources/invalid_tests/MultipleStreams.cnna b/src/test/resources/valid_tests/MultipleStreams.cnna similarity index 100% rename from src/test/resources/invalid_tests/MultipleStreams.cnna rename to src/test/resources/valid_tests/MultipleStreams.cnna diff --git a/src/test/resources/valid_tests/data_paths.txt b/src/test/resources/valid_tests/data_paths.txt index 877fea8a..a4c42bba 100644 --- a/src/test/resources/valid_tests/data_paths.txt +++ b/src/test/resources/valid_tests/data_paths.txt @@ -2,6 +2,5 @@ VGG16 data/VGG16 CifarClassifierNetwork data/CifarClassifierNetwork ThreeInputCNN_M14 data/ThreeInputCNN_M14 Alexnet data/Alexnet -MultipleOutputs data/MultipleOutputs ResNeXt50 data/ResNeXt50 MultipleStreams data/MultipleStreams \ No newline at end of file -- GitLab