blob: e5c3e4f61967c2c2f65681fe11129f7d0538f750 [file] [log] [blame]
Tim Hall79d07d22020-04-27 18:20:16 +01001# Copyright (C) 2020 Arm Limited or its affiliates. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
4#
5# Licensed under the Apache License, Version 2.0 (the License); you may
6# not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an AS IS BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Tim Hall79d07d22020-04-27 18:20:16 +010016# Description:
17# TensorFlow Lite mapping functions used by both reader and writer.
18# Contains a mapping from the various TensorFlow Lite enums and options structs, generated by the FlatBuffer code
19# generator, to Vela's internal format.
Tim Hall79d07d22020-04-27 18:20:16 +010020import struct
21
Diego Russoea6111a2020-04-14 18:41:58 +010022import numpy as np
23
Tim Hall79d07d22020-04-27 18:20:16 +010024from .data_type import DataType
Diego Russoe8a10452020-04-21 17:39:10 +010025from .tflite import AbsOptions
26from .tflite import AddNOptions
Tim Hall79d07d22020-04-27 18:20:16 +010027from .tflite import AddOptions
Tim Hall79d07d22020-04-27 18:20:16 +010028from .tflite import ArgMaxOptions
Tim Hall79d07d22020-04-27 18:20:16 +010029from .tflite import ArgMinOptions
Diego Russoe8a10452020-04-21 17:39:10 +010030from .tflite import BatchToSpaceNDOptions
Tim Hall79d07d22020-04-27 18:20:16 +010031from .tflite import BidirectionalSequenceLSTMOptions
32from .tflite import BidirectionalSequenceRNNOptions
Diego Russoe8a10452020-04-21 17:39:10 +010033from .tflite import CallOptions
34from .tflite import CastOptions
35from .tflite import ConcatEmbeddingsOptions
36from .tflite import ConcatenationOptions
37from .tflite import Conv2DOptions
Tim Hall79d07d22020-04-27 18:20:16 +010038from .tflite import CosOptions
Tim Hall79d07d22020-04-27 18:20:16 +010039from .tflite import DensifyOptions
40from .tflite import DepthToSpaceOptions
Diego Russoe8a10452020-04-21 17:39:10 +010041from .tflite import DepthwiseConv2DOptions
42from .tflite import DequantizeOptions
43from .tflite import DivOptions
44from .tflite import EmbeddingLookupSparseOptions
45from .tflite import EqualOptions
46from .tflite import ExpandDimsOptions
47from .tflite import ExpOptions
48from .tflite import FakeQuantOptions
49from .tflite import FillOptions
50from .tflite import FloorDivOptions
51from .tflite import FloorModOptions
52from .tflite import FullyConnectedOptions
53from .tflite import GatherNdOptions
54from .tflite import GatherOptions
55from .tflite import GreaterEqualOptions
56from .tflite import GreaterOptions
Louis Verhaard678645b2020-06-15 15:22:47 +020057from .tflite import HardSwishOptions
Tim Hall79d07d22020-04-27 18:20:16 +010058from .tflite import IfOptions
Diego Russoe8a10452020-04-21 17:39:10 +010059from .tflite import L2NormOptions
60from .tflite import LeakyReluOptions
61from .tflite import LessEqualOptions
62from .tflite import LessOptions
63from .tflite import LocalResponseNormalizationOptions
64from .tflite import LogicalAndOptions
65from .tflite import LogicalNotOptions
66from .tflite import LogicalOrOptions
67from .tflite import LogSoftmaxOptions
68from .tflite import LSHProjectionOptions
69from .tflite import LSTMOptions
70from .tflite import MatrixDiagOptions
71from .tflite import MatrixSetDiagOptions
72from .tflite import MaximumMinimumOptions
73from .tflite import MirrorPadOptions
74from .tflite import MulOptions
75from .tflite import NegOptions
Tim Hall79d07d22020-04-27 18:20:16 +010076from .tflite import NonMaxSuppressionV4Options
77from .tflite import NonMaxSuppressionV5Options
Diego Russoe8a10452020-04-21 17:39:10 +010078from .tflite import NotEqualOptions
79from .tflite import OneHotOptions
80from .tflite import PackOptions
81from .tflite import PadOptions
82from .tflite import PadV2Options
83from .tflite import Pool2DOptions
84from .tflite import PowOptions
85from .tflite import QuantizeOptions
86from .tflite import RangeOptions
87from .tflite import RankOptions
88from .tflite import ReducerOptions
89from .tflite import ReshapeOptions
90from .tflite import ResizeBilinearOptions
91from .tflite import ResizeNearestNeighborOptions
92from .tflite import ReverseSequenceOptions
93from .tflite import ReverseV2Options
94from .tflite import RNNOptions
Tim Hall79d07d22020-04-27 18:20:16 +010095from .tflite import ScatterNdOptions
96from .tflite import SegmentSumOptions
Diego Russoe8a10452020-04-21 17:39:10 +010097from .tflite import SelectOptions
Tim Hall79d07d22020-04-27 18:20:16 +010098from .tflite import SelectV2Options
Diego Russoe8a10452020-04-21 17:39:10 +010099from .tflite import SequenceRNNOptions
100from .tflite import ShapeOptions
101from .tflite import SkipGramOptions
102from .tflite import SliceOptions
103from .tflite import SoftmaxOptions
104from .tflite import SpaceToBatchNDOptions
105from .tflite import SpaceToDepthOptions
106from .tflite import SparseToDenseOptions
107from .tflite import SplitOptions
108from .tflite import SplitVOptions
109from .tflite import SquaredDifferenceOptions
110from .tflite import SquareOptions
111from .tflite import SqueezeOptions
112from .tflite import StridedSliceOptions
113from .tflite import SubOptions
114from .tflite import SVDFOptions
115from .tflite import TileOptions
116from .tflite import TopKV2Options
117from .tflite import TransposeConvOptions
118from .tflite import TransposeOptions
119from .tflite import UnidirectionalSequenceLSTMOptions
120from .tflite import UniqueOptions
121from .tflite import UnpackOptions
122from .tflite import WhereOptions
Tim Hall79d07d22020-04-27 18:20:16 +0100123from .tflite import WhileOptions
Diego Russoe8a10452020-04-21 17:39:10 +0100124from .tflite import ZerosLikeOptions
125from .tflite.ActivationFunctionType import ActivationFunctionType
Diego Russoea6111a2020-04-14 18:41:58 +0100126from .tflite.BuiltinOperator import BuiltinOperator
127from .tflite.BuiltinOptions import BuiltinOptions
128from .tflite.Padding import Padding
Diego Russoe8a10452020-04-21 17:39:10 +0100129from .tflite.TensorType import TensorType
Tim Hall79d07d22020-04-27 18:20:16 +0100130
131
132def inverse_map(map):
133 return {v: k for k, v in map.items()}
134
135
136datatype_map = {
137 TensorType.UINT8: DataType.uint8,
138 TensorType.INT8: DataType.int8,
139 TensorType.INT16: DataType.int16,
140 TensorType.INT32: DataType.int32,
141 TensorType.INT64: DataType.int64,
142 TensorType.FLOAT16: DataType.float16,
143 TensorType.FLOAT32: DataType.float32,
144 TensorType.STRING: DataType.string,
145 TensorType.BOOL: DataType.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200146 TensorType.COMPLEX64: DataType.complex64,
Tim Hall79d07d22020-04-27 18:20:16 +0100147}
148
149datatype_inv_map = inverse_map(datatype_map)
150datatype_inv_map[DataType.quint8] = TensorType.UINT8
151
152datatype_inv_map[DataType.qint8] = TensorType.INT8
153datatype_inv_map[DataType.qint16] = TensorType.INT16
154datatype_inv_map[DataType.qint32] = TensorType.INT32
155
156
157datatype_map_numpy = {
158 TensorType.UINT8: np.uint8,
159 TensorType.INT8: np.int8,
160 TensorType.INT16: np.int16,
161 TensorType.INT32: np.int32,
162 TensorType.INT64: np.int64,
163 TensorType.FLOAT16: np.float16,
164 TensorType.FLOAT32: np.float32,
165 TensorType.BOOL: np.bool,
Jacob Bohlinf767b932020-08-13 15:32:45 +0200166 TensorType.COMPLEX64: np.complex64,
Tim Hall79d07d22020-04-27 18:20:16 +0100167}
168
169
170builtin_options_map = {
171 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
172 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
173 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
174 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
175 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
176 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
177 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
178 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
179 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
180 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
181 BuiltinOptions.AddOptions: AddOptions.AddOptions,
182 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
183 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
184 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
185 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
186 BuiltinOptions.CallOptions: CallOptions.CallOptions,
187 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
188 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
189 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
190 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
191 BuiltinOptions.MulOptions: MulOptions.MulOptions,
192 BuiltinOptions.PadOptions: PadOptions.PadOptions,
193 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
194 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
195 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
196 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
197 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
198 BuiltinOptions.SubOptions: SubOptions.SubOptions,
199 BuiltinOptions.DivOptions: DivOptions.DivOptions,
200 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
201 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
202 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
203 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
204 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
205 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
206 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
207 BuiltinOptions.CastOptions: CastOptions.CastOptions,
208 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
209 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
210 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
211 BuiltinOptions.LessOptions: LessOptions.LessOptions,
212 BuiltinOptions.NegOptions: NegOptions.NegOptions,
213 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
214 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
215 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
216 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
217 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
218 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
219 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
220 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
221 BuiltinOptions.TileOptions: TileOptions.TileOptions,
222 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
223 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
224 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
225 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
226 BuiltinOptions.PowOptions: PowOptions.PowOptions,
227 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
228 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
229 BuiltinOptions.PackOptions: PackOptions.PackOptions,
230 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
231 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
232 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
233 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
234 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
235 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
236 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
237 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
238 BuiltinOptions.FillOptions: FillOptions.FillOptions,
239 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
240 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
241 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
242 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
243 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
244 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
245 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
246 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
247 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
248 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
249 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
250 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
251 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
252 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
253 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
254 BuiltinOptions.CosOptions: CosOptions.CosOptions,
255 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
256 BuiltinOptions.RankOptions: RankOptions.RankOptions,
257 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
258 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
259 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
260 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
261 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
262 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
Louis Verhaard678645b2020-06-15 15:22:47 +0200263 BuiltinOptions.HardSwishOptions: HardSwishOptions.HardSwishOptions,
Tim Hall79d07d22020-04-27 18:20:16 +0100264 BuiltinOptions.IfOptions: IfOptions.IfOptions,
265 BuiltinOptions.NonMaxSuppressionV4Options: NonMaxSuppressionV4Options.NonMaxSuppressionV4Options,
266 BuiltinOptions.NonMaxSuppressionV5Options: NonMaxSuppressionV5Options.NonMaxSuppressionV5Options,
267 BuiltinOptions.ScatterNdOptions: ScatterNdOptions.ScatterNdOptions,
268 BuiltinOptions.SegmentSumOptions: SegmentSumOptions.SegmentSumOptions,
269 BuiltinOptions.SelectV2Options: SelectV2Options.SelectV2Options,
270 BuiltinOptions.WhileOptions: WhileOptions.WhileOptions,
271}
272
273builtin_options_inv_map = inverse_map(builtin_options_map)
274
275
276def underscore_to_camel_case(s):
277 return "".join(x.title() for x in s.split("_"))
278
279
280def padding_deserialize(x):
281 return padding_map[x]
282
283
284def padding_serialize(builder, x):
285 return padding_inv_map[x]
286
287
288def activation_deserialize(x):
289 return activation_function_map[x]
290
291
292def activation_serialize(builder, x):
293 return activation_function_inv_map[x]
294
295
296def datatype_deserialize(x):
297 return datatype_map[x]
298
299
300def datatype_serialize(builder, x):
301 return datatype_inv_map[x]
302
303
304def identity(x):
305 return x
306
307
308def identity_serialize(builder, x):
309 return x
310
311
312def write_byte_vector(builder, v):
313 builder.StartVector(1, len(v), 1)
314 for e in v[::-1]:
315 builder.PrependByte(e)
316 return builder.EndVector(len(v))
317
318
319def write_int_vector(builder, v):
320 builder.StartVector(4, len(v), 4)
321 for e in v[::-1]:
322 builder.PrependInt32(e)
323 return builder.EndVector(len(v))
324
325
326class OptionsSerializer:
327 def __init__(self, name, members=[]):
328 self.name = name
329 self.module = globals()[self.name]
330 self.cls = getattr(self.module, self.name)
331 self.builtin_opt_type = builtin_options_inv_map[self.cls]
Tim Hall79d07d22020-04-27 18:20:16 +0100332 self.members = []
333 for mem in members:
334 deserialize = identity
335 serialize = identity_serialize
336 is_vector = False
337 if isinstance(mem, tuple):
338 if len(mem) == 3:
339 mem, deserialize, serialize = mem
340 elif len(mem) == 2:
341 mem, is_vector = mem
342 deserialize = tuple
343 serialize = write_int_vector
344 else:
345 assert 0
346 underscore_mem = mem
347 camelcase_mem = underscore_to_camel_case(mem)
348 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
349
Tim Hallc8310b12020-06-17 14:53:11 +0100350 def deserialize(self, op_data):
351 builtin_options = op_data.BuiltinOptions()
Tim Hall79d07d22020-04-27 18:20:16 +0100352 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100353 if builtin_options:
Tim Hall79d07d22020-04-27 18:20:16 +0100354 tfattrs = self.cls()
Tim Hallc8310b12020-06-17 14:53:11 +0100355 tfattrs.Init(builtin_options.Bytes, builtin_options.Pos)
Tim Hall79d07d22020-04-27 18:20:16 +0100356 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
357 fun = camelcase_mem
358 if is_vector:
359 fun += "AsNumpy"
360
361 a = deserialize(getattr(tfattrs, fun)())
362 attrs[underscore_mem] = a
363 return attrs
364
365 def serialize(self, builder, attrs):
366 ser_attrs = []
367 for underscore_mem, camelcase_mem, deserialize, serialize, is_vector in self.members:
368 a = serialize(builder, attrs[underscore_mem])
369 ser_attrs.append((camelcase_mem, a))
370
371 getattr(self.module, self.name + "Start")(builder)
372
373 for camelcase_mem, a in ser_attrs:
374 getattr(self.module, self.name + "Add" + camelcase_mem)(builder, a)
375
376 return getattr(self.module, self.name + "End")(builder), None
377
378
379class CustomOptionsSerializer:
Tim Hallc8310b12020-06-17 14:53:11 +0100380 CUSTOM_OPTIONS_NPU_OP = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
381 CUSTOM_OPTIONS_FORMAT_DEFAULT = 0
382
Tim Hall79d07d22020-04-27 18:20:16 +0100383 def __init__(self):
Tim Hall79d07d22020-04-27 18:20:16 +0100384 self.custom_opt_format = 0
385
Tim Hallc8310b12020-06-17 14:53:11 +0100386 def deserialize(self, op_data):
Tim Hall79d07d22020-04-27 18:20:16 +0100387 attrs = {}
Tim Hallc8310b12020-06-17 14:53:11 +0100388 custom_options = op_data.CustomOptionsAsNumpy()
389 attrs["custom_options"] = custom_options
390 attrs["custom_options_format"] = op_data.CustomOptionsFormat()
391
392 if np.array_equal(custom_options, self.CUSTOM_OPTIONS_NPU_OP):
393 attrs["custom_type"] = "ExistingNpuOp"
394
Tim Hall79d07d22020-04-27 18:20:16 +0100395 return attrs
396
397 def serialize(self, builder, attrs):
Tim Hallc8310b12020-06-17 14:53:11 +0100398 custom_type = attrs.get("custom_type", "")
399 self.custom_opt_format = attrs.get("custom_options_format", self.CUSTOM_OPTIONS_FORMAT_DEFAULT)
Tim Hall79d07d22020-04-27 18:20:16 +0100400
401 # Set NPU op custom options for the TensorFlow Lite custom operator
Tim Hallc8310b12020-06-17 14:53:11 +0100402 if custom_type == "NpuOp":
403 custom_options = self.CUSTOM_OPTIONS_NPU_OP
404 else:
405 custom_options = attrs.get("custom_options", [])
Tim Hall79d07d22020-04-27 18:20:16 +0100406
Tim Hallc8310b12020-06-17 14:53:11 +0100407 custom_options_bytes = struct.pack("<{0}B".format(len(custom_options)), *custom_options)
408 custom_offset = write_byte_vector(builder, custom_options_bytes)
Tim Hall79d07d22020-04-27 18:20:16 +0100409
410 return None, custom_offset
411
412
413padding_map = {
414 Padding.SAME: b"SAME",
415 Padding.VALID: b"VALID",
416}
417
418padding_inv_map = inverse_map(padding_map)
419
420
421activation_function_map = {
422 ActivationFunctionType.NONE: None,
423 ActivationFunctionType.RELU: "Relu",
424 ActivationFunctionType.RELU_N1_TO_1: "ReluN1To1",
425 ActivationFunctionType.RELU6: "Relu6",
426 ActivationFunctionType.TANH: "Tanh",
427 ActivationFunctionType.SIGN_BIT: "SignBit",
428}
429
430activation_function_inv_map = inverse_map(activation_function_map)
431
432fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
433padding = ("padding", padding_deserialize, padding_serialize)
434
435pool2d_opts = OptionsSerializer(
436 "Pool2DOptions", (padding, "stride_w", "stride_h", "filter_width", "filter_height", fused_act,)
437)
438
439depthwise_opts = OptionsSerializer(
440 "DepthwiseConv2DOptions",
441 (padding, "stride_w", "stride_h", "depth_multiplier", fused_act, "dilation_w_factor", "dilation_h_factor",),
442)
443
444conv2d_opts = OptionsSerializer(
445 "Conv2DOptions", (padding, "stride_w", "stride_h", fused_act, "dilation_w_factor", "dilation_h_factor",)
446)
447
448lstm_opts = OptionsSerializer("LSTMOptions", (fused_act, "cell_clip", "proj_clip", "kernel_type"))
449
450unidir_seq_lstm_opts = OptionsSerializer(
451 "UnidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "time_major")
452)
453
454bidir_seq_lstm_opts = OptionsSerializer(
455 "BidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "merge_outputs", "time_major")
456)
457
458rnn_opts = OptionsSerializer("RNNOptions", (fused_act,))
459
460seq_rnn_opts = OptionsSerializer("SequenceRNNOptions", ("time_major", fused_act,))
461
462bidir_seq_rnn_opts = OptionsSerializer("BidirectionalSequenceRNNOptions", ("time_major", fused_act, "merge_outputs",))
463
464
465reducer_opts = OptionsSerializer("ReducerOptions", ("keep_dims",))
466
467is_int_vec = True
468
469custom_prefix = "Custom_"
470
471builtin_operator_map = {
472 BuiltinOperator.ADD: ("AddAct", OptionsSerializer("AddOptions", (fused_act,))),
473 BuiltinOperator.AVERAGE_POOL_2D: ("AvgPoolAct", pool2d_opts),
474 BuiltinOperator.CONCATENATION: ("ConcatTFLite", OptionsSerializer("ConcatenationOptions", ("axis", fused_act))),
475 BuiltinOperator.CONV_2D: ("Conv2DBiasAct", conv2d_opts),
476 BuiltinOperator.DEPTHWISE_CONV_2D: ("DepthwiseConv2dBiasAct", depthwise_opts),
477 BuiltinOperator.DEPTH_TO_SPACE: ("DepthToSpace", OptionsSerializer("DepthToSpaceOptions", ("block_size",))),
478 BuiltinOperator.DEQUANTIZE: ("Dequantize", OptionsSerializer("DequantizeOptions")),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200479 BuiltinOperator.EMBEDDING_LOOKUP: ("EmbeddingLookup", None),
Tim Hall79d07d22020-04-27 18:20:16 +0100480 BuiltinOperator.FLOOR: ("Floor", None),
481 BuiltinOperator.FULLY_CONNECTED: (
482 "FullyConnectedAct",
483 OptionsSerializer("FullyConnectedOptions", (fused_act, "weights_format")),
484 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200485 BuiltinOperator.HASHTABLE_LOOKUP: ("HashtableLookup", None),
486 BuiltinOperator.L2_NORMALIZATION : ("L2NormAct", OptionsSerializer("L2NormOptions", (fused_act,))),
487 BuiltinOperator.L2_POOL_2D: ("L2Pool2D", pool2d_opts),
Tim Hall79d07d22020-04-27 18:20:16 +0100488 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
489 "LRN",
490 OptionsSerializer("LocalResponseNormalizationOptions", ("radius", "bias", "alpha", "beta")),
491 ),
492 BuiltinOperator.LOGISTIC: ("Sigmoid", None),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200493 BuiltinOperator.LSH_PROJECTION: ("LSHProjection", OptionsSerializer("LSHProjectionOptions", ("type",))),
Tim Hall79d07d22020-04-27 18:20:16 +0100494 BuiltinOperator.LSTM: ("LstmAct", lstm_opts),
495 BuiltinOperator.MAX_POOL_2D: ("MaxPool", pool2d_opts),
496 BuiltinOperator.MUL: ("MulAct", OptionsSerializer("MulOptions", (fused_act,))),
497 BuiltinOperator.RELU: ("Relu", None),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200498 BuiltinOperator.RELU_N1_TO_1: ("ReluN1To1", None),
Tim Hall79d07d22020-04-27 18:20:16 +0100499 BuiltinOperator.RELU6: ("Relu6", None),
500 BuiltinOperator.RESHAPE: ("Reshape", OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),))),
501 BuiltinOperator.RESIZE_BILINEAR: (
502 "ResizeBilinear",
503 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
504 ),
505 BuiltinOperator.RNN: ("RnnAct", rnn_opts),
506 BuiltinOperator.SOFTMAX: ("Softmax", OptionsSerializer("SoftmaxOptions", ("beta",))),
507 BuiltinOperator.SPACE_TO_DEPTH: ("SpaceToDepth", OptionsSerializer("SpaceToDepthOptions", ("block_size",))),
508 BuiltinOperator.SVDF: ("SvdfAct", OptionsSerializer("SVDFOptions", ("rank", fused_act))),
509 BuiltinOperator.TANH: ("Tanh", None),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200510 BuiltinOperator.CONCAT_EMBEDDINGS: (
511 "ConcatEmbeddings",
512 OptionsSerializer(
513 "ConcatEmbeddingsOptions",
514 ("num_channels", "num_columns_per_channel", "num_columns_per_channel_as_numpy",
515 "num_columns_per_channel_as_length", "embedding_dim_per_channel", "embedding_dim_per_channel_as_numpy",
516 "embedding_dim_per_channel_as_length",)
517 ),
518 ),
519 BuiltinOperator.SKIP_GRAM: (
520 "SkipGram",
521 OptionsSerializer("SkipGramOptions", ("ngram_size", "max_skip_size", "include_all_ngrams"))
522 ),
523 BuiltinOperator.CALL: ("Call", OptionsSerializer("CallOptions", ("subgraph",))),
524 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (
525 "EmbeddingLookupSparse",
526 OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",))
527 ),
Tim Hall79d07d22020-04-27 18:20:16 +0100528 BuiltinOperator.PAD: ("Pad", OptionsSerializer("PadOptions")),
529 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: ("UnidirectionalSequenceRnnAct", seq_rnn_opts),
530 BuiltinOperator.GATHER: ("GatherV2", OptionsSerializer("GatherOptions", ("axis",))),
531 BuiltinOperator.BATCH_TO_SPACE_ND: ("BatchToSpaceND", OptionsSerializer("BatchToSpaceNDOptions")),
532 BuiltinOperator.SPACE_TO_BATCH_ND: ("SpaceToBatchND", OptionsSerializer("SpaceToBatchNDOptions")),
533 BuiltinOperator.TRANSPOSE: ("Transpose", OptionsSerializer("TransposeOptions")),
534 BuiltinOperator.MEAN: ("Mean", None),
535 BuiltinOperator.SUB: ("SubAct", OptionsSerializer("SubOptions", (fused_act,))),
536 BuiltinOperator.DIV: ("DivAct", OptionsSerializer("DivOptions", (fused_act,))),
537 BuiltinOperator.SQUEEZE: ("Squeeze", OptionsSerializer("SqueezeOptions", (("squeeze_dims", is_int_vec),))),
538 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: ("UnidirectionalSequenceLstmAct", unidir_seq_lstm_opts),
539 BuiltinOperator.STRIDED_SLICE: (
540 "StridedSlice",
541 OptionsSerializer(
542 "StridedSliceOptions", ("begin_mask", "end_mask", "ellipsis_mask", "new_axis_mask", "shrink_axis_mask")
543 ),
544 ),
545 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: ("BidirectionalSequenceRnnAct", bidir_seq_rnn_opts),
546 BuiltinOperator.EXP: ("Exp", OptionsSerializer("ExpOptions")),
547 BuiltinOperator.TOPK_V2: ("TopKV2", OptionsSerializer("TopKV2Options")),
548 BuiltinOperator.SPLIT: ("Split", OptionsSerializer("SplitOptions", ("num_splits",))),
549 BuiltinOperator.LOG_SOFTMAX: ("LogSoftmax", OptionsSerializer("LogSoftmaxOptions")),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200550 BuiltinOperator.DELEGATE : ("Delegate", None),
Tim Hall79d07d22020-04-27 18:20:16 +0100551 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: ("BidirectionalSequenceLstmAct", bidir_seq_lstm_opts),
552 BuiltinOperator.CAST: (
553 "Cast",
554 OptionsSerializer(
555 "CastOptions",
556 (
557 ("in_data_type", datatype_deserialize, datatype_serialize),
558 ("out_data_type", datatype_deserialize, datatype_serialize),
559 ),
560 ),
561 ),
Tim Hallc30f4952020-06-15 20:47:35 +0100562 BuiltinOperator.PRELU: ("Prelu", None),
Tim Hall79d07d22020-04-27 18:20:16 +0100563 BuiltinOperator.MAXIMUM: ("Maximum", OptionsSerializer("MaximumMinimumOptions")),
564 BuiltinOperator.ARG_MAX: (
565 "ArgMax",
566 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
567 ),
568 BuiltinOperator.MINIMUM: ("Minimum", OptionsSerializer("MaximumMinimumOptions")),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200569 BuiltinOperator.LESS: ("Less", OptionsSerializer("LessOptions")),
570 BuiltinOperator.NEG: ("Neg", OptionsSerializer("NegOptions")),
571 BuiltinOperator.PADV2: ("PadV2", OptionsSerializer("PadV2Options")),
572 BuiltinOperator.GREATER: ("Greater", OptionsSerializer("GreaterOptions")),
573 BuiltinOperator.GREATER_EQUAL: ("GreaterEqual", OptionsSerializer("GreaterEqualOptions")),
574 BuiltinOperator.LESS_EQUAL: ("LessEqual", OptionsSerializer("LessEqualOptions")),
575 BuiltinOperator.SELECT: ("Select", OptionsSerializer("SelectOptions")),
576 BuiltinOperator.SLICE: ("Slice", OptionsSerializer("SliceOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100577 BuiltinOperator.SIN: ("Sin", None),
578 BuiltinOperator.TRANSPOSE_CONV: (
579 "Conv2DBackpropInput",
580 OptionsSerializer("TransposeConvOptions", (padding, "stride_w", "stride_h")),
581 ),
582 BuiltinOperator.SPARSE_TO_DENSE: (
583 "SparseToDense",
584 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
585 ),
586 BuiltinOperator.TILE: ("Tile", OptionsSerializer("TileOptions")),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200587 BuiltinOperator.EXPAND_DIMS: ("ExpandDims", OptionsSerializer("ExpandDimsOptions")),
588 BuiltinOperator.EQUAL: ("Equal", OptionsSerializer("EqualOptions")),
589 BuiltinOperator.NOT_EQUAL: ("NotEqual", OptionsSerializer("NotEqualOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100590 BuiltinOperator.LOG: ("Log", None),
591 BuiltinOperator.SUM: ("Sum", None),
592 BuiltinOperator.SQRT: ("Sqrt", None),
593 BuiltinOperator.RSQRT: ("Rsqrt", None),
594 BuiltinOperator.SHAPE: (
595 "Shape",
596 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
597 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200598 BuiltinOperator.POW: ("Pow", OptionsSerializer("PowOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100599 BuiltinOperator.ARG_MIN: (
600 "ArgMin",
601 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
602 ),
603 BuiltinOperator.FAKE_QUANT: (
604 "FakeQuantWithMinMaxArgs",
605 OptionsSerializer("FakeQuantOptions", ("min", "max", "num_bits", "narrow_range")),
606 ),
607 BuiltinOperator.REDUCE_PROD: ("Prod", reducer_opts),
608 BuiltinOperator.REDUCE_MAX: ("Max", reducer_opts),
609 BuiltinOperator.PACK: ("Pack", OptionsSerializer("PackOptions", ("values_count", "axis"))),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200610 BuiltinOperator.LOGICAL_OR: ("LogicalOr", OptionsSerializer("LogicalOrOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100611 BuiltinOperator.ONE_HOT: ("OneHot", OptionsSerializer("OneHotOptions", ("axis",))),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200612 BuiltinOperator.LOGICAL_AND: ("LogicalAnd", OptionsSerializer("LogicalAndOptions")),
613 BuiltinOperator.LOGICAL_NOT: ("LogicalNot", OptionsSerializer("LogicalNotOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100614 BuiltinOperator.UNPACK: ("Unpack", OptionsSerializer("UnpackOptions", ("num", "axis"))),
615 BuiltinOperator.REDUCE_MIN: ("Min", reducer_opts),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200616 BuiltinOperator.FLOOR_DIV: ("FloorDiv", OptionsSerializer("FloorDivOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100617 BuiltinOperator.REDUCE_ANY: ("Any", reducer_opts),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200618 BuiltinOperator.SQUARE: ("Square", OptionsSerializer("SquareOptions")),
619 BuiltinOperator.ZEROS_LIKE: ("ZerosLike", OptionsSerializer("ZerosLikeOptions")),
620 BuiltinOperator.FILL: ("Fill", OptionsSerializer("FillOptions")),
621 BuiltinOperator.FLOOR_MOD: ("FloorMod", OptionsSerializer("FloorModOptions")),
622 BuiltinOperator.RANGE: ("Range", OptionsSerializer("RangeOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100623 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
624 "ResizeNearestNeighbor",
625 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners",)),
626 ),
627 BuiltinOperator.LEAKY_RELU: ("LeakyRelu", OptionsSerializer("LeakyReluOptions", ("alpha",))),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200628 BuiltinOperator.SQUARED_DIFFERENCE: ("SquaredDifference", OptionsSerializer("SquaredDifferenceOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100629 BuiltinOperator.MIRROR_PAD: ("MirrorPad", OptionsSerializer("MirrorPadOptions", ("mode",))),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200630 BuiltinOperator.ABS: ("Abs", OptionsSerializer("AbsOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100631 BuiltinOperator.SPLIT_V: ("SplitV", OptionsSerializer("SplitVOptions", ("num_splits",))),
632 BuiltinOperator.UNIQUE: (
633 "Unique",
634 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
635 ),
636 BuiltinOperator.CEIL: ("Ceil", None),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200637 BuiltinOperator.REVERSE_V2: ("ReverseV2", OptionsSerializer("ReverseV2Options")),
638 BuiltinOperator.ADD_N: ("AddN", OptionsSerializer("AddNOptions")),
639 BuiltinOperator.GATHER_ND: ("GatherNd", OptionsSerializer("GatherNdOptions")),
640 BuiltinOperator.COS: ("Cos", OptionsSerializer("CosOptions")),
641 BuiltinOperator.WHERE: ("Where", OptionsSerializer("WhereOptions")),
642 BuiltinOperator.RANK: ("Rank", OptionsSerializer("RankOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100643 BuiltinOperator.ELU: ("Elu", None),
644 BuiltinOperator.REVERSE_SEQUENCE: (
645 "ReverseSequence",
646 OptionsSerializer("ReverseSequenceOptions", ("seq_dim", "batch_dim")),
647 ),
Dwight Lidmand2a972d2020-08-18 14:08:10 +0200648 BuiltinOperator.MATRIX_DIAG: ("MatrixDiag", OptionsSerializer("MatrixDiagOptions")),
649 BuiltinOperator.QUANTIZE: ("Quantize", OptionsSerializer("QuantizeOptions")),
650 BuiltinOperator.MATRIX_SET_DIAG: ("MatrixSetDiag", OptionsSerializer("MatrixSetDiagOptions")),
Louis Verhaard678645b2020-06-15 15:22:47 +0200651 BuiltinOperator.HARD_SWISH: ("HardSwish", OptionsSerializer("HardSwishOptions")),
Tim Hall79d07d22020-04-27 18:20:16 +0100652 BuiltinOperator.IF: ("If", OptionsSerializer("IfOptions", ("then_subgraph_index", "else_subgraph_index"))),
653 BuiltinOperator.WHILE: ("While", OptionsSerializer("WhileOptions", ("cond_subgraph_index", "body_subgraph_index"))),
654 BuiltinOperator.NON_MAX_SUPPRESSION_V4: ("NonMaxSuppressionV4", OptionsSerializer("NonMaxSuppressionV4Options")),
655 BuiltinOperator.NON_MAX_SUPPRESSION_V5: ("NonMaxSuppressionV5", OptionsSerializer("NonMaxSuppressionV5Options")),
656 BuiltinOperator.SCATTER_ND: ("ScatterNd", OptionsSerializer("ScatterNdOptions")),
657 BuiltinOperator.SELECT_V2: ("SelectV2", OptionsSerializer("SelectV2Options")),
658 BuiltinOperator.DENSIFY: ("Densify", OptionsSerializer("DensifyOptions")),
659 BuiltinOperator.SEGMENT_SUM: ("SegmentSum", OptionsSerializer("SegmentSumOptions")),
660 BuiltinOperator.CUSTOM: (custom_prefix, CustomOptionsSerializer()),
661}
662
663builtin_operator_inv_map = {v[0]: (k, v[1]) for k, v in builtin_operator_map.items()}
664
665builtin_operator_inv_map["NpuOp"] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer())