From 393503496e943f870695cfcf0871b76062117c43 Mon Sep 17 00:00:00 2001
From: auphelia <jakobapk@web.de>
Date: Mon, 4 Nov 2019 15:02:24 +0000
Subject: [PATCH] [Test] Test for shape inference creates now a mixed model and
 performs shape inference. Afterwards it is executed to check if it still
 works

---
 .../data/onnx/mixed-model/mixed_model.onnx    | Bin 223 -> 26803 bytes
 src/finn/transformation/infer_shapes.py       |  26 ++++++---
 tests/test_infer_shapes.py                    |  55 +++++++++++++++++-
 3 files changed, 71 insertions(+), 10 deletions(-)

diff --git a/src/finn/data/onnx/mixed-model/mixed_model.onnx b/src/finn/data/onnx/mixed-model/mixed_model.onnx
index 79b1fa97773b768aa57e7663f69368ec56a8980f..af4a861182e595e5ab7dc3e7c4d10432e09ca65d 100644
GIT binary patch
literal 26803
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
XwO_p$s{a>y8-E@yj^eTdl%)S3!=wk>

literal 223
zcmd;J6XMCw%d5~$tw_u*$Vs(2!N{e}#aPD0RgzJZTAY!elTs|il3!Y4pv31}np2V)
z0u#1kNz2U3;}YTm%YxMyDzOBm=9CI?m82Gz=;r39q~=6P0}T@r;}YRu6cXTK;$Q<}
oW*}w);V2mtYxuZ$fT}p4D%g|cz(yP5(wzm7H^3$D#3aBC0Puk-_W%F@

diff --git a/src/finn/transformation/infer_shapes.py b/src/finn/transformation/infer_shapes.py
index 5cd15fe59..62dedfaba 100644
--- a/src/finn/transformation/infer_shapes.py
+++ b/src/finn/transformation/infer_shapes.py
@@ -1,14 +1,14 @@
-import finn.core.onnx_exec as oxe
-import onnx.shape_inference as si
 import onnx.helper as helper
-from finn.core.modelwrapper import ModelWrapper
+import onnx.shape_inference as si
 
+import finn.core.onnx_exec as oxe
+from finn.core.modelwrapper import ModelWrapper
 
 
 def infer_shapes(model):
     """Ensure every tensor in the model has a specified shape (ValueInfo)."""
     for node in model.graph.node:
-        if node.domain == 'finn':
+        if node.domain == "finn":
 
             # create an empty execution context
             execution_context = model.make_empty_exec_context()
@@ -24,10 +24,18 @@ def infer_shapes(model):
             # onnx shape inference unfortunately does not take single node,
             # it can only analyze entire models -- so we create a model which solely
             # consists of our current node.
-            node_inputs = list(filter(lambda x: x.name in node.input, model.graph.input))
-            node_inputs += list(filter(lambda x: x.name in node.input, model.graph.value_info))
-            node_outputs = list(filter(lambda x: x.name in node.output, model.graph.output))
-            node_outputs += list(filter(lambda x: x.name in node.output, model.graph.value_info))
+            node_inputs = list(
+                filter(lambda x: x.name in node.input, model.graph.input)
+            )
+            node_inputs += list(
+                filter(lambda x: x.name in node.input, model.graph.value_info)
+            )
+            node_outputs = list(
+                filter(lambda x: x.name in node.output, model.graph.output)
+            )
+            node_outputs += list(
+                filter(lambda x: x.name in node.output, model.graph.value_info)
+            )
             node_graph = helper.make_graph(
                 nodes=[node],
                 name="single-node-exec",
@@ -39,10 +47,10 @@ def infer_shapes(model):
 
             node_model = ModelWrapper(node_model)
 
+            # set the corresponding tensors in the whole model
             for output in node.output:
                 model.set_tensor_shape(output, node_model.get_tensor_shape(output))
 
-
     # single-step operation, no need to call multiple times so return
     # model_was_changed = false
     return (model, False)
diff --git a/tests/test_infer_shapes.py b/tests/test_infer_shapes.py
index 2bed9d211..1dbf90d0b 100644
--- a/tests/test_infer_shapes.py
+++ b/tests/test_infer_shapes.py
@@ -1,11 +1,64 @@
 from pkgutil import get_data
 
+import numpy as np
+import onnx
+import onnx.numpy_helper as np_helper
+from onnx import TensorProto, helper
+
+import finn.core.onnx_exec as oxe
 import finn.transformation.infer_shapes as si
 from finn.core.modelwrapper import ModelWrapper
 
 
 def test_infer_shapes():
     # load the onnx model
-    raw_m = get_data("finn", "data/onnx/mixed-model/mixed_model.onnx")
+    raw_m = get_data("finn", "data/onnx/mnist-conv/model.onnx")
     model = ModelWrapper(raw_m)
+    graph = model.graph
+    node_ind = 0
+    node_dict = {}
+    for n in graph.node:
+        node_ind += 1
+        node_dict[node_ind] = n
+
+    # multi-thresholding node to be inserted between the first Relu and MaxPool node
+
+    # get Relu node to use data to make a new Relu node and delete the old one
+    Relu_node = node_dict[4]
+    assert Relu_node.op_type == "Relu", "The wrong model was chosen for the check"
+    graph.node.remove(Relu_node)
+
+    # create new tensors (thresholds as constant) and add them to the graph info
+    mt_v0 = helper.make_tensor_value_info("mt_v0", TensorProto.FLOAT, [1, 8, 28, 28])
+    mt_thresh0 = helper.make_tensor_value_info("mt_thresh0", TensorProto.FLOAT, [8, 7])
+
+    graph.value_info.append(mt_v0)
+    graph.value_info.append(mt_thresh0)
+
+    # random numbers for the thresholds
+    # thresholds for one channel have to be sorted to guarantee the correct behavior
+    mt_thresh0_values = np.empty([8, 7], dtype=np.float32)
+    for i in range(len(mt_thresh0_values)):
+        mt_thresh0_values[i] = np.sort(np.random.random_sample(7,) * 10)
+
+    model.set_initializer(mt_thresh0.name, mt_thresh0_values)
+
+    # create and insert new Relu node and one multi-thresholding node
+    new_Relu_node = helper.make_node("Relu", [Relu_node.input[0]], ["mt_v0"])
+    mt_node = helper.make_node(
+        "MultiThreshold", ["mt_v0", "mt_thresh0"], [Relu_node.output[0]], domain="finn"
+    )
+
+    graph.node.insert(4, new_Relu_node)
+    graph.node.insert(5, mt_node)
+
+    # test shape inference on mixed model
     model = model.transform_single(si.infer_shapes)
+
+    # execution with input values from mnist-conv model
+    raw_i = get_data("finn", "data/onnx/mnist-conv/test_data_set_0/input_0.pb")
+    input_tensor = onnx.load_tensor_from_string(raw_i)
+
+    # run using FINN-based execution
+    input_dict = {"Input3": np_helper.to_array(input_tensor)}
+    oxe.execute_onnx(model, input_dict)
-- 
GitLab