aboutsummaryrefslogtreecommitdiff
path: root/ethosu/vela/tflite_reader.py
diff options
context:
space:
mode:
authorPatrik Gustavsson <patrik.gustavsson@arm.com>2021-06-28 07:41:58 +0200
committerPatrik Gustavsson <patrik.gustavsson@arm.com>2021-07-08 10:57:25 +0200
commit8f1f9aaa58175b17cd2e505bfcdb0e40c955ea72 (patch)
tree0174f8ef15007f5e220cfc4d283046451282102e /ethosu/vela/tflite_reader.py
parent6f4955aa7097b123bbf31aae4654547bb3e3c68c (diff)
downloadethos-u-vela-8f1f9aaa58175b17cd2e505bfcdb0e40c955ea72.tar.gz
MLBEDSW-4838 Added basic TOSA support.
Added basic TOSA support, enabling Vela to read and compile a .tosa file corresponding to CONV2D + Rescale + Clamp, and writing it to an optimized .tflite file. The optimized .tflite file, will in this case, hold a commandstream where the Rescale and Clamp has been fused into the CONV2D. The optimized tflite file is not output from Vela. -Added support to read .tosa file into Vela internal structure. - Added tosa_reader.py, tosa_mapper.py and helper files stored under tosa/ - Support for this limited to ~10 ops -Added reader_util.py for functions common for TOSA and TFLite -Added tosa_graph_optimiser.py -Added support to fuse Rescale into convolution -Modified handling for padding -Added support to fuse Clamp to previous op -Added graph_optimiser_util.py -Moved functions common for TOSA/TFLite graph optimization to this file. -Renamed graph_optimiser.py to tflite_graph_optmiser.py -Added separate tosa_supported_operators.py -Added supported_operator_util.py -For functions in common for TOSA/TFLite Signed-off-by: Patrik Gustavsson <patrik.gustavsson@arm.com> Change-Id: Ic3c540504ec8c5eb4771397fdc6882050ecf33ab
Diffstat (limited to 'ethosu/vela/tflite_reader.py')
-rw-r--r--ethosu/vela/tflite_reader.py40
1 files changed, 4 insertions, 36 deletions
diff --git a/ethosu/vela/tflite_reader.py b/ethosu/vela/tflite_reader.py
index b47177f7..1a45a5ee 100644
--- a/ethosu/vela/tflite_reader.py
+++ b/ethosu/vela/tflite_reader.py
@@ -27,6 +27,9 @@ from .nn_graph import Subgraph
from .operation import create_activation_function
from .operation import Op
from .operation import Operation
+from .reader_util import clone_and_reshape_tensor
+from .reader_util import decode_str
+from .reader_util import fixup_tensors
from .tensor import QuantizationParameters
from .tensor import Tensor
from .tflite.BuiltinOperator import BuiltinOperator
@@ -37,29 +40,6 @@ from .tflite_mapping import datatype_map
from .tflite_mapping import datatype_map_numpy
-def decode_str(s):
- if s is None:
- return ""
- return s.decode("utf-8")
-
-
-def clone_and_reshape_tensor(src_tens, reorder, set_unique):
- tens = src_tens.clone("_reshape", set_unique)
- tens.shape = [src_tens.shape[idx] for idx in reorder]
- tens.bandwidth_shape = tens.shape
- tens.storage_shape = tens.shape
-
- if tens.values is not None:
- tens.values = tens.values.transpose(reorder)
-
- if tens.quant_values is not None:
- tens.quant_values = tens.quant_values.transpose(reorder)
-
- op = Operation(Op.Const, tens.name)
- op.set_output_tensor(tens)
- return tens
-
-
class TFLiteSubgraph:
def __init__(self, graph, subgraph):
self.graph = graph
@@ -74,19 +54,7 @@ class TFLiteSubgraph:
self.outputs = self.get_tensors_from_indices_remove_duplicates(subgraph.OutputsAsNumpy(), "output")
self.inputs = self.get_tensors_from_indices_remove_duplicates(subgraph.InputsAsNumpy(), "input")
-
- # Fix up tensors without operations. Generate either Placeholder or Constant ops
- for tens in self.inputs:
- if tens.ops != []:
- tens.error("This subgraph input tensor has unexpected driving operators.")
-
- op = Operation(Op.Placeholder, tens.name)
- op.set_output_tensor(tens)
-
- for tens in self.tensors:
- if not tens.ops:
- op = Operation(Op.Const, tens.name)
- op.set_output_tensor(tens)
+ fixup_tensors(self.inputs, self.tensors)
def get_tensors_from_indices_remove_duplicates(self, indices, warning_str):
tensors = []