blob: e8b40bdb043d823200a01b184f67fadbfa45fa1e [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.
16
17
18# Description:
19# TensorFlow Lite mapping functions used by both reader and writer.
20# Contains a mapping from the various TensorFlow Lite enums and options structs, generated by the FlatBuffer code
21# generator, to Vela's internal format.
22
Tim Hall79d07d22020-04-27 18:20:16 +010023import struct
24
Diego Russoea6111a2020-04-14 18:41:58 +010025import numpy as np
26
Tim Hall79d07d22020-04-27 18:20:16 +010027from .data_type import DataType
Tim Hall79d07d22020-04-27 18:20:16 +010028from .tflite import Conv2DOptions
29from .tflite import DepthwiseConv2DOptions
30from .tflite import ConcatEmbeddingsOptions
31from .tflite import LSHProjectionOptions
32from .tflite import Pool2DOptions
33from .tflite import SVDFOptions
34from .tflite import RNNOptions
35from .tflite import FullyConnectedOptions
36from .tflite import SoftmaxOptions
37from .tflite import ConcatenationOptions
38from .tflite import AddOptions
39from .tflite import L2NormOptions
40from .tflite import LocalResponseNormalizationOptions
41from .tflite import LSTMOptions
42from .tflite import ResizeBilinearOptions
43from .tflite import CallOptions
44from .tflite import ReshapeOptions
45from .tflite import SkipGramOptions
46from .tflite import SpaceToDepthOptions
47from .tflite import EmbeddingLookupSparseOptions
48from .tflite import MulOptions
49from .tflite import PadOptions
50from .tflite import GatherOptions
51from .tflite import BatchToSpaceNDOptions
52from .tflite import SpaceToBatchNDOptions
53from .tflite import TransposeOptions
54from .tflite import ReducerOptions
55from .tflite import SubOptions
56from .tflite import DivOptions
57from .tflite import SqueezeOptions
58from .tflite import SequenceRNNOptions
59from .tflite import StridedSliceOptions
60from .tflite import ExpOptions
61from .tflite import TopKV2Options
62from .tflite import SplitOptions
63from .tflite import LogSoftmaxOptions
64from .tflite import CastOptions
65from .tflite import DequantizeOptions
66from .tflite import MaximumMinimumOptions
67from .tflite import ArgMaxOptions
68from .tflite import LessOptions
69from .tflite import NegOptions
70from .tflite import PadV2Options
71from .tflite import GreaterOptions
72from .tflite import GreaterEqualOptions
73from .tflite import LessEqualOptions
74from .tflite import SelectOptions
75from .tflite import SliceOptions
76from .tflite import TransposeConvOptions
77from .tflite import SparseToDenseOptions
78from .tflite import TileOptions
79from .tflite import ExpandDimsOptions
80from .tflite import EqualOptions
81from .tflite import NotEqualOptions
82from .tflite import ShapeOptions
83from .tflite import PowOptions
84from .tflite import ArgMinOptions
85from .tflite import FakeQuantOptions
86from .tflite import PackOptions
87from .tflite import LogicalOrOptions
88from .tflite import OneHotOptions
89from .tflite import LogicalAndOptions
90from .tflite import LogicalNotOptions
91from .tflite import UnpackOptions
92from .tflite import FloorDivOptions
93from .tflite import SquareOptions
94from .tflite import ZerosLikeOptions
95from .tflite import FillOptions
96from .tflite import BidirectionalSequenceLSTMOptions
97from .tflite import BidirectionalSequenceRNNOptions
98from .tflite import UnidirectionalSequenceLSTMOptions
99from .tflite import FloorModOptions
100from .tflite import RangeOptions
101from .tflite import ResizeNearestNeighborOptions
102from .tflite import LeakyReluOptions
103from .tflite import SquaredDifferenceOptions
104from .tflite import MirrorPadOptions
105from .tflite import AbsOptions
106from .tflite import SplitVOptions
107from .tflite import UniqueOptions
108from .tflite import ReverseV2Options
109from .tflite import AddNOptions
110from .tflite import GatherNdOptions
111from .tflite import CosOptions
112from .tflite import WhereOptions
113from .tflite import RankOptions
114from .tflite import ReverseSequenceOptions
115from .tflite import MatrixDiagOptions
116from .tflite import QuantizeOptions
117from .tflite import MatrixSetDiagOptions
118from .tflite import DensifyOptions
119from .tflite import DepthToSpaceOptions
120from .tflite import IfOptions
121from .tflite import NonMaxSuppressionV4Options
122from .tflite import NonMaxSuppressionV5Options
123from .tflite import ScatterNdOptions
124from .tflite import SegmentSumOptions
125from .tflite import SelectV2Options
126from .tflite import WhileOptions
Diego Russoea6111a2020-04-14 18:41:58 +0100127from .tflite.TensorType import TensorType
128from .tflite.BuiltinOperator import BuiltinOperator
129from .tflite.BuiltinOptions import BuiltinOptions
130from .tflite.Padding import Padding
131from .tflite.ActivationFunctionType import ActivationFunctionType
Tim Hall79d07d22020-04-27 18:20:16 +0100132
133
134def inverse_map(map):
135 return {v: k for k, v in map.items()}
136
137
138datatype_map = {
139 TensorType.UINT8: DataType.uint8,
140 TensorType.INT8: DataType.int8,
141 TensorType.INT16: DataType.int16,
142 TensorType.INT32: DataType.int32,
143 TensorType.INT64: DataType.int64,
144 TensorType.FLOAT16: DataType.float16,
145 TensorType.FLOAT32: DataType.float32,
146 TensorType.STRING: DataType.string,
147 TensorType.BOOL: DataType.bool,
148 # no TensorType.COMPLEX64 for now
149}
150
151datatype_inv_map = inverse_map(datatype_map)
152datatype_inv_map[DataType.quint8] = TensorType.UINT8
153
154datatype_inv_map[DataType.qint8] = TensorType.INT8
155datatype_inv_map[DataType.qint16] = TensorType.INT16
156datatype_inv_map[DataType.qint32] = TensorType.INT32
157
158
159datatype_map_numpy = {
160 TensorType.UINT8: np.uint8,
161 TensorType.INT8: np.int8,
162 TensorType.INT16: np.int16,
163 TensorType.INT32: np.int32,
164 TensorType.INT64: np.int64,
165 TensorType.FLOAT16: np.float16,
166 TensorType.FLOAT32: np.float32,
167 TensorType.BOOL: np.bool,
168}
169
170
171builtin_options_map = {
172 BuiltinOptions.Conv2DOptions: Conv2DOptions.Conv2DOptions,
173 BuiltinOptions.DepthwiseConv2DOptions: DepthwiseConv2DOptions.DepthwiseConv2DOptions,
174 BuiltinOptions.ConcatEmbeddingsOptions: ConcatEmbeddingsOptions.ConcatEmbeddingsOptions,
175 BuiltinOptions.LSHProjectionOptions: LSHProjectionOptions.LSHProjectionOptions,
176 BuiltinOptions.Pool2DOptions: Pool2DOptions.Pool2DOptions,
177 BuiltinOptions.SVDFOptions: SVDFOptions.SVDFOptions,
178 BuiltinOptions.RNNOptions: RNNOptions.RNNOptions,
179 BuiltinOptions.FullyConnectedOptions: FullyConnectedOptions.FullyConnectedOptions,
180 BuiltinOptions.SoftmaxOptions: SoftmaxOptions.SoftmaxOptions,
181 BuiltinOptions.ConcatenationOptions: ConcatenationOptions.ConcatenationOptions,
182 BuiltinOptions.AddOptions: AddOptions.AddOptions,
183 BuiltinOptions.L2NormOptions: L2NormOptions.L2NormOptions,
184 BuiltinOptions.LocalResponseNormalizationOptions: LocalResponseNormalizationOptions.LocalResponseNormalizationOptions, # noqa: E501
185 BuiltinOptions.LSTMOptions: LSTMOptions.LSTMOptions,
186 BuiltinOptions.ResizeBilinearOptions: ResizeBilinearOptions.ResizeBilinearOptions,
187 BuiltinOptions.CallOptions: CallOptions.CallOptions,
188 BuiltinOptions.ReshapeOptions: ReshapeOptions.ReshapeOptions,
189 BuiltinOptions.SkipGramOptions: SkipGramOptions.SkipGramOptions,
190 BuiltinOptions.SpaceToDepthOptions: SpaceToDepthOptions.SpaceToDepthOptions,
191 BuiltinOptions.EmbeddingLookupSparseOptions: EmbeddingLookupSparseOptions.EmbeddingLookupSparseOptions,
192 BuiltinOptions.MulOptions: MulOptions.MulOptions,
193 BuiltinOptions.PadOptions: PadOptions.PadOptions,
194 BuiltinOptions.GatherOptions: GatherOptions.GatherOptions,
195 BuiltinOptions.BatchToSpaceNDOptions: BatchToSpaceNDOptions.BatchToSpaceNDOptions,
196 BuiltinOptions.SpaceToBatchNDOptions: SpaceToBatchNDOptions.SpaceToBatchNDOptions,
197 BuiltinOptions.TransposeOptions: TransposeOptions.TransposeOptions,
198 BuiltinOptions.ReducerOptions: ReducerOptions.ReducerOptions,
199 BuiltinOptions.SubOptions: SubOptions.SubOptions,
200 BuiltinOptions.DivOptions: DivOptions.DivOptions,
201 BuiltinOptions.SqueezeOptions: SqueezeOptions.SqueezeOptions,
202 BuiltinOptions.SequenceRNNOptions: SequenceRNNOptions.SequenceRNNOptions,
203 BuiltinOptions.StridedSliceOptions: StridedSliceOptions.StridedSliceOptions,
204 BuiltinOptions.ExpOptions: ExpOptions.ExpOptions,
205 BuiltinOptions.TopKV2Options: TopKV2Options.TopKV2Options,
206 BuiltinOptions.SplitOptions: SplitOptions.SplitOptions,
207 BuiltinOptions.LogSoftmaxOptions: LogSoftmaxOptions.LogSoftmaxOptions,
208 BuiltinOptions.CastOptions: CastOptions.CastOptions,
209 BuiltinOptions.DequantizeOptions: DequantizeOptions.DequantizeOptions,
210 BuiltinOptions.MaximumMinimumOptions: MaximumMinimumOptions.MaximumMinimumOptions,
211 BuiltinOptions.ArgMaxOptions: ArgMaxOptions.ArgMaxOptions,
212 BuiltinOptions.LessOptions: LessOptions.LessOptions,
213 BuiltinOptions.NegOptions: NegOptions.NegOptions,
214 BuiltinOptions.PadV2Options: PadV2Options.PadV2Options,
215 BuiltinOptions.GreaterOptions: GreaterOptions.GreaterOptions,
216 BuiltinOptions.GreaterEqualOptions: GreaterEqualOptions.GreaterEqualOptions,
217 BuiltinOptions.LessEqualOptions: LessEqualOptions.LessEqualOptions,
218 BuiltinOptions.SelectOptions: SelectOptions.SelectOptions,
219 BuiltinOptions.SliceOptions: SliceOptions.SliceOptions,
220 BuiltinOptions.TransposeConvOptions: TransposeConvOptions.TransposeConvOptions,
221 BuiltinOptions.SparseToDenseOptions: SparseToDenseOptions.SparseToDenseOptions,
222 BuiltinOptions.TileOptions: TileOptions.TileOptions,
223 BuiltinOptions.ExpandDimsOptions: ExpandDimsOptions.ExpandDimsOptions,
224 BuiltinOptions.EqualOptions: EqualOptions.EqualOptions,
225 BuiltinOptions.NotEqualOptions: NotEqualOptions.NotEqualOptions,
226 BuiltinOptions.ShapeOptions: ShapeOptions.ShapeOptions,
227 BuiltinOptions.PowOptions: PowOptions.PowOptions,
228 BuiltinOptions.ArgMinOptions: ArgMinOptions.ArgMinOptions,
229 BuiltinOptions.FakeQuantOptions: FakeQuantOptions.FakeQuantOptions,
230 BuiltinOptions.PackOptions: PackOptions.PackOptions,
231 BuiltinOptions.LogicalOrOptions: LogicalOrOptions.LogicalOrOptions,
232 BuiltinOptions.OneHotOptions: OneHotOptions.OneHotOptions,
233 BuiltinOptions.LogicalAndOptions: LogicalAndOptions.LogicalAndOptions,
234 BuiltinOptions.LogicalNotOptions: LogicalNotOptions.LogicalNotOptions,
235 BuiltinOptions.UnpackOptions: UnpackOptions.UnpackOptions,
236 BuiltinOptions.FloorDivOptions: FloorDivOptions.FloorDivOptions,
237 BuiltinOptions.SquareOptions: SquareOptions.SquareOptions,
238 BuiltinOptions.ZerosLikeOptions: ZerosLikeOptions.ZerosLikeOptions,
239 BuiltinOptions.FillOptions: FillOptions.FillOptions,
240 BuiltinOptions.BidirectionalSequenceLSTMOptions: BidirectionalSequenceLSTMOptions.BidirectionalSequenceLSTMOptions,
241 BuiltinOptions.BidirectionalSequenceRNNOptions: BidirectionalSequenceRNNOptions.BidirectionalSequenceRNNOptions,
242 BuiltinOptions.UnidirectionalSequenceLSTMOptions: UnidirectionalSequenceLSTMOptions.UnidirectionalSequenceLSTMOptions, # noqa: E501
243 BuiltinOptions.FloorModOptions: FloorModOptions.FloorModOptions,
244 BuiltinOptions.RangeOptions: RangeOptions.RangeOptions,
245 BuiltinOptions.ResizeNearestNeighborOptions: ResizeNearestNeighborOptions.ResizeNearestNeighborOptions,
246 BuiltinOptions.LeakyReluOptions: LeakyReluOptions.LeakyReluOptions,
247 BuiltinOptions.SquaredDifferenceOptions: SquaredDifferenceOptions.SquaredDifferenceOptions,
248 BuiltinOptions.MirrorPadOptions: MirrorPadOptions.MirrorPadOptions,
249 BuiltinOptions.AbsOptions: AbsOptions.AbsOptions,
250 BuiltinOptions.SplitVOptions: SplitVOptions.SplitVOptions,
251 BuiltinOptions.UniqueOptions: UniqueOptions.UniqueOptions,
252 BuiltinOptions.ReverseV2Options: ReverseV2Options.ReverseV2Options,
253 BuiltinOptions.AddNOptions: AddNOptions.AddNOptions,
254 BuiltinOptions.GatherNdOptions: GatherNdOptions.GatherNdOptions,
255 BuiltinOptions.CosOptions: CosOptions.CosOptions,
256 BuiltinOptions.WhereOptions: WhereOptions.WhereOptions,
257 BuiltinOptions.RankOptions: RankOptions.RankOptions,
258 BuiltinOptions.ReverseSequenceOptions: ReverseSequenceOptions.ReverseSequenceOptions,
259 BuiltinOptions.MatrixDiagOptions: MatrixDiagOptions.MatrixDiagOptions,
260 BuiltinOptions.QuantizeOptions: QuantizeOptions.QuantizeOptions,
261 BuiltinOptions.MatrixSetDiagOptions: MatrixSetDiagOptions.MatrixSetDiagOptions,
262 BuiltinOptions.DensifyOptions: DensifyOptions.DensifyOptions,
263 BuiltinOptions.DepthToSpaceOptions: DepthToSpaceOptions.DepthToSpaceOptions,
264 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]
332 self.custom_opt_format = 0
333 self.members = []
334 for mem in members:
335 deserialize = identity
336 serialize = identity_serialize
337 is_vector = False
338 if isinstance(mem, tuple):
339 if len(mem) == 3:
340 mem, deserialize, serialize = mem
341 elif len(mem) == 2:
342 mem, is_vector = mem
343 deserialize = tuple
344 serialize = write_int_vector
345 else:
346 assert 0
347 underscore_mem = mem
348 camelcase_mem = underscore_to_camel_case(mem)
349 self.members.append((underscore_mem, camelcase_mem, deserialize, serialize, is_vector))
350
351 def deserialize(self, builtin_data, custom_data):
352 attrs = {}
353 if builtin_data:
354 tfattrs = self.cls()
355 tfattrs.Init(builtin_data.Bytes, builtin_data.Pos)
356 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:
380 def __init__(self):
381 self.builtin_opt_type = 0
382 self.custom_opt_format = 0
383
384 def deserialize(self, builtin_data, custom_data):
385 attrs = {}
386 attrs["custom_options"] = custom_data
387 return attrs
388
389 def serialize(self, builder, attrs):
390
391 custom_opts = attrs.get("custom_options", [])
392 custom_data = []
393
394 # Set NPU op custom options for the TensorFlow Lite custom operator
395 if custom_opts["type"] == "NpuOp":
396 custom_data = [0x01, 0x04, 0x01] # NpuOp=1, FlexbufferFormat.UINT8=4, byte length=1
397
398 custom_data_bytes = struct.pack("<{0}B".format(len(custom_data)), *custom_data)
399 custom_offset = write_byte_vector(builder, custom_data_bytes)
400
401 return None, custom_offset
402
403
404padding_map = {
405 Padding.SAME: b"SAME",
406 Padding.VALID: b"VALID",
407}
408
409padding_inv_map = inverse_map(padding_map)
410
411
412activation_function_map = {
413 ActivationFunctionType.NONE: None,
414 ActivationFunctionType.RELU: "Relu",
415 ActivationFunctionType.RELU_N1_TO_1: "ReluN1To1",
416 ActivationFunctionType.RELU6: "Relu6",
417 ActivationFunctionType.TANH: "Tanh",
418 ActivationFunctionType.SIGN_BIT: "SignBit",
419}
420
421activation_function_inv_map = inverse_map(activation_function_map)
422
423fused_act = ("fused_activation_function", activation_deserialize, activation_serialize)
424padding = ("padding", padding_deserialize, padding_serialize)
425
426pool2d_opts = OptionsSerializer(
427 "Pool2DOptions", (padding, "stride_w", "stride_h", "filter_width", "filter_height", fused_act,)
428)
429
430depthwise_opts = OptionsSerializer(
431 "DepthwiseConv2DOptions",
432 (padding, "stride_w", "stride_h", "depth_multiplier", fused_act, "dilation_w_factor", "dilation_h_factor",),
433)
434
435conv2d_opts = OptionsSerializer(
436 "Conv2DOptions", (padding, "stride_w", "stride_h", fused_act, "dilation_w_factor", "dilation_h_factor",)
437)
438
439lstm_opts = OptionsSerializer("LSTMOptions", (fused_act, "cell_clip", "proj_clip", "kernel_type"))
440
441unidir_seq_lstm_opts = OptionsSerializer(
442 "UnidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "time_major")
443)
444
445bidir_seq_lstm_opts = OptionsSerializer(
446 "BidirectionalSequenceLSTMOptions", (fused_act, "cell_clip", "proj_clip", "merge_outputs", "time_major")
447)
448
449rnn_opts = OptionsSerializer("RNNOptions", (fused_act,))
450
451seq_rnn_opts = OptionsSerializer("SequenceRNNOptions", ("time_major", fused_act,))
452
453bidir_seq_rnn_opts = OptionsSerializer("BidirectionalSequenceRNNOptions", ("time_major", fused_act, "merge_outputs",))
454
455
456reducer_opts = OptionsSerializer("ReducerOptions", ("keep_dims",))
457
458is_int_vec = True
459
460custom_prefix = "Custom_"
461
462builtin_operator_map = {
463 BuiltinOperator.ADD: ("AddAct", OptionsSerializer("AddOptions", (fused_act,))),
464 BuiltinOperator.AVERAGE_POOL_2D: ("AvgPoolAct", pool2d_opts),
465 BuiltinOperator.CONCATENATION: ("ConcatTFLite", OptionsSerializer("ConcatenationOptions", ("axis", fused_act))),
466 BuiltinOperator.CONV_2D: ("Conv2DBiasAct", conv2d_opts),
467 BuiltinOperator.DEPTHWISE_CONV_2D: ("DepthwiseConv2dBiasAct", depthwise_opts),
468 BuiltinOperator.DEPTH_TO_SPACE: ("DepthToSpace", OptionsSerializer("DepthToSpaceOptions", ("block_size",))),
469 BuiltinOperator.DEQUANTIZE: ("Dequantize", OptionsSerializer("DequantizeOptions")),
470 BuiltinOperator.EMBEDDING_LOOKUP: (None, None),
471 BuiltinOperator.FLOOR: ("Floor", None),
472 BuiltinOperator.FULLY_CONNECTED: (
473 "FullyConnectedAct",
474 OptionsSerializer("FullyConnectedOptions", (fused_act, "weights_format")),
475 ),
476 BuiltinOperator.HASHTABLE_LOOKUP: (None, None),
477 # BuiltinOperator.L2_NORMALIZATION : "L2NormAct",
478 BuiltinOperator.L2_POOL_2D: (None, pool2d_opts),
479 BuiltinOperator.LOCAL_RESPONSE_NORMALIZATION: (
480 "LRN",
481 OptionsSerializer("LocalResponseNormalizationOptions", ("radius", "bias", "alpha", "beta")),
482 ),
483 BuiltinOperator.LOGISTIC: ("Sigmoid", None),
484 # BuiltinOperator.LSH_PROJECTION : "",
485 BuiltinOperator.LSTM: ("LstmAct", lstm_opts),
486 BuiltinOperator.MAX_POOL_2D: ("MaxPool", pool2d_opts),
487 BuiltinOperator.MUL: ("MulAct", OptionsSerializer("MulOptions", (fused_act,))),
488 BuiltinOperator.RELU: ("Relu", None),
489 BuiltinOperator.RELU_N1_TO_1: (None, None),
490 BuiltinOperator.RELU6: ("Relu6", None),
491 BuiltinOperator.RESHAPE: ("Reshape", OptionsSerializer("ReshapeOptions", (("new_shape", is_int_vec),))),
492 BuiltinOperator.RESIZE_BILINEAR: (
493 "ResizeBilinear",
494 OptionsSerializer("ResizeBilinearOptions", ("align_corners", "half_pixel_centers")),
495 ),
496 BuiltinOperator.RNN: ("RnnAct", rnn_opts),
497 BuiltinOperator.SOFTMAX: ("Softmax", OptionsSerializer("SoftmaxOptions", ("beta",))),
498 BuiltinOperator.SPACE_TO_DEPTH: ("SpaceToDepth", OptionsSerializer("SpaceToDepthOptions", ("block_size",))),
499 BuiltinOperator.SVDF: ("SvdfAct", OptionsSerializer("SVDFOptions", ("rank", fused_act))),
500 BuiltinOperator.TANH: ("Tanh", None),
501 # BuiltinOperator.CONCAT_EMBEDDINGS : "",
502 # BuiltinOperator.SKIP_GRAM : "",
503 # BuiltinOperator.CALL : "",
504 BuiltinOperator.EMBEDDING_LOOKUP_SPARSE: (None, OptionsSerializer("EmbeddingLookupSparseOptions", ("combiner",))),
505 BuiltinOperator.PAD: ("Pad", OptionsSerializer("PadOptions")),
506 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_RNN: ("UnidirectionalSequenceRnnAct", seq_rnn_opts),
507 BuiltinOperator.GATHER: ("GatherV2", OptionsSerializer("GatherOptions", ("axis",))),
508 BuiltinOperator.BATCH_TO_SPACE_ND: ("BatchToSpaceND", OptionsSerializer("BatchToSpaceNDOptions")),
509 BuiltinOperator.SPACE_TO_BATCH_ND: ("SpaceToBatchND", OptionsSerializer("SpaceToBatchNDOptions")),
510 BuiltinOperator.TRANSPOSE: ("Transpose", OptionsSerializer("TransposeOptions")),
511 BuiltinOperator.MEAN: ("Mean", None),
512 BuiltinOperator.SUB: ("SubAct", OptionsSerializer("SubOptions", (fused_act,))),
513 BuiltinOperator.DIV: ("DivAct", OptionsSerializer("DivOptions", (fused_act,))),
514 BuiltinOperator.SQUEEZE: ("Squeeze", OptionsSerializer("SqueezeOptions", (("squeeze_dims", is_int_vec),))),
515 BuiltinOperator.UNIDIRECTIONAL_SEQUENCE_LSTM: ("UnidirectionalSequenceLstmAct", unidir_seq_lstm_opts),
516 BuiltinOperator.STRIDED_SLICE: (
517 "StridedSlice",
518 OptionsSerializer(
519 "StridedSliceOptions", ("begin_mask", "end_mask", "ellipsis_mask", "new_axis_mask", "shrink_axis_mask")
520 ),
521 ),
522 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_RNN: ("BidirectionalSequenceRnnAct", bidir_seq_rnn_opts),
523 BuiltinOperator.EXP: ("Exp", OptionsSerializer("ExpOptions")),
524 BuiltinOperator.TOPK_V2: ("TopKV2", OptionsSerializer("TopKV2Options")),
525 BuiltinOperator.SPLIT: ("Split", OptionsSerializer("SplitOptions", ("num_splits",))),
526 BuiltinOperator.LOG_SOFTMAX: ("LogSoftmax", OptionsSerializer("LogSoftmaxOptions")),
527 # BuiltinOperator.DELEGATE : "",
528 BuiltinOperator.BIDIRECTIONAL_SEQUENCE_LSTM: ("BidirectionalSequenceLstmAct", bidir_seq_lstm_opts),
529 BuiltinOperator.CAST: (
530 "Cast",
531 OptionsSerializer(
532 "CastOptions",
533 (
534 ("in_data_type", datatype_deserialize, datatype_serialize),
535 ("out_data_type", datatype_deserialize, datatype_serialize),
536 ),
537 ),
538 ),
Tim Hall10349e72020-04-28 20:13:40 +0100539 BuiltinOperator.PRELU : ("Prelu", None),
Tim Hall79d07d22020-04-27 18:20:16 +0100540 BuiltinOperator.MAXIMUM: ("Maximum", OptionsSerializer("MaximumMinimumOptions")),
541 BuiltinOperator.ARG_MAX: (
542 "ArgMax",
543 OptionsSerializer("ArgMaxOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
544 ),
545 BuiltinOperator.MINIMUM: ("Minimum", OptionsSerializer("MaximumMinimumOptions")),
546 BuiltinOperator.LESS: ("Less", None),
547 BuiltinOperator.NEG: ("Neg", None),
548 BuiltinOperator.PADV2: ("PadV2", None),
549 BuiltinOperator.GREATER: ("Greater", None),
550 BuiltinOperator.GREATER_EQUAL: ("GreaterEqual", None),
551 BuiltinOperator.LESS_EQUAL: ("LessEqual", None),
552 BuiltinOperator.SELECT: ("Select", None),
553 BuiltinOperator.SLICE: ("Slice", None),
554 BuiltinOperator.SIN: ("Sin", None),
555 BuiltinOperator.TRANSPOSE_CONV: (
556 "Conv2DBackpropInput",
557 OptionsSerializer("TransposeConvOptions", (padding, "stride_w", "stride_h")),
558 ),
559 BuiltinOperator.SPARSE_TO_DENSE: (
560 "SparseToDense",
561 OptionsSerializer("SparseToDenseOptions", ("validate_indices",)),
562 ),
563 BuiltinOperator.TILE: ("Tile", OptionsSerializer("TileOptions")),
564 BuiltinOperator.EXPAND_DIMS: ("ExpandDims", None),
565 BuiltinOperator.EQUAL: ("Equal", None),
566 BuiltinOperator.NOT_EQUAL: ("NotEqual", None),
567 BuiltinOperator.LOG: ("Log", None),
568 BuiltinOperator.SUM: ("Sum", None),
569 BuiltinOperator.SQRT: ("Sqrt", None),
570 BuiltinOperator.RSQRT: ("Rsqrt", None),
571 BuiltinOperator.SHAPE: (
572 "Shape",
573 OptionsSerializer("ShapeOptions", (("out_type", datatype_deserialize, datatype_serialize),)),
574 ),
Tim Hall65da3792020-04-24 17:46:44 +0100575 BuiltinOperator.POW: ("Pow", None),
Tim Hall79d07d22020-04-27 18:20:16 +0100576 BuiltinOperator.ARG_MIN: (
577 "ArgMin",
578 OptionsSerializer("ArgMinOptions", (("output_type", datatype_deserialize, datatype_serialize),)),
579 ),
580 BuiltinOperator.FAKE_QUANT: (
581 "FakeQuantWithMinMaxArgs",
582 OptionsSerializer("FakeQuantOptions", ("min", "max", "num_bits", "narrow_range")),
583 ),
584 BuiltinOperator.REDUCE_PROD: ("Prod", reducer_opts),
585 BuiltinOperator.REDUCE_MAX: ("Max", reducer_opts),
586 BuiltinOperator.PACK: ("Pack", OptionsSerializer("PackOptions", ("values_count", "axis"))),
587 BuiltinOperator.LOGICAL_OR: ("LogicalOr", None),
588 BuiltinOperator.ONE_HOT: ("OneHot", OptionsSerializer("OneHotOptions", ("axis",))),
589 BuiltinOperator.LOGICAL_AND: ("LogicalAnd", None),
590 BuiltinOperator.LOGICAL_NOT: ("LogicalNot", None),
591 BuiltinOperator.UNPACK: ("Unpack", OptionsSerializer("UnpackOptions", ("num", "axis"))),
592 BuiltinOperator.REDUCE_MIN: ("Min", reducer_opts),
593 BuiltinOperator.FLOOR_DIV: ("FloorDiv", None),
594 BuiltinOperator.REDUCE_ANY: ("Any", reducer_opts),
595 BuiltinOperator.SQUARE: ("Square", None),
596 BuiltinOperator.ZEROS_LIKE: ("ZerosLike", None),
597 BuiltinOperator.FILL: ("Fill", None),
598 BuiltinOperator.FLOOR_MOD: ("FloorMod", None),
599 BuiltinOperator.RANGE: ("Range", None),
600 BuiltinOperator.RESIZE_NEAREST_NEIGHBOR: (
601 "ResizeNearestNeighbor",
602 OptionsSerializer("ResizeNearestNeighborOptions", ("align_corners",)),
603 ),
604 BuiltinOperator.LEAKY_RELU: ("LeakyRelu", OptionsSerializer("LeakyReluOptions", ("alpha",))),
605 BuiltinOperator.SQUARED_DIFFERENCE: ("SquaredDifference", None),
606 BuiltinOperator.MIRROR_PAD: ("MirrorPad", OptionsSerializer("MirrorPadOptions", ("mode",))),
607 BuiltinOperator.ABS: ("Abs", None),
608 BuiltinOperator.SPLIT_V: ("SplitV", OptionsSerializer("SplitVOptions", ("num_splits",))),
609 BuiltinOperator.UNIQUE: (
610 "Unique",
611 OptionsSerializer("UniqueOptions", (("idx_out_type", datatype_deserialize, datatype_serialize),)),
612 ),
613 BuiltinOperator.CEIL: ("Ceil", None),
614 BuiltinOperator.REVERSE_V2: ("ReverseV2", None),
615 BuiltinOperator.ADD_N: ("AddN", None),
616 BuiltinOperator.GATHER_ND: ("GatherNd", None),
617 BuiltinOperator.COS: ("Cos", None),
618 BuiltinOperator.WHERE: ("Where", None),
619 BuiltinOperator.RANK: ("Rank", None),
620 BuiltinOperator.ELU: ("Elu", None),
621 BuiltinOperator.REVERSE_SEQUENCE: (
622 "ReverseSequence",
623 OptionsSerializer("ReverseSequenceOptions", ("seq_dim", "batch_dim")),
624 ),
625 BuiltinOperator.MATRIX_DIAG: ("MatrixDiag", None),
626 BuiltinOperator.QUANTIZE: ("Quantize", None),
627 BuiltinOperator.MATRIX_SET_DIAG: ("MatrixSetDiag", None),
628 BuiltinOperator.IF: ("If", OptionsSerializer("IfOptions", ("then_subgraph_index", "else_subgraph_index"))),
629 BuiltinOperator.WHILE: ("While", OptionsSerializer("WhileOptions", ("cond_subgraph_index", "body_subgraph_index"))),
630 BuiltinOperator.NON_MAX_SUPPRESSION_V4: ("NonMaxSuppressionV4", OptionsSerializer("NonMaxSuppressionV4Options")),
631 BuiltinOperator.NON_MAX_SUPPRESSION_V5: ("NonMaxSuppressionV5", OptionsSerializer("NonMaxSuppressionV5Options")),
632 BuiltinOperator.SCATTER_ND: ("ScatterNd", OptionsSerializer("ScatterNdOptions")),
633 BuiltinOperator.SELECT_V2: ("SelectV2", OptionsSerializer("SelectV2Options")),
634 BuiltinOperator.DENSIFY: ("Densify", OptionsSerializer("DensifyOptions")),
635 BuiltinOperator.SEGMENT_SUM: ("SegmentSum", OptionsSerializer("SegmentSumOptions")),
636 BuiltinOperator.CUSTOM: (custom_prefix, CustomOptionsSerializer()),
637}
638
639builtin_operator_inv_map = {v[0]: (k, v[1]) for k, v in builtin_operator_map.items()}
640
641builtin_operator_inv_map["NpuOp"] = (BuiltinOperator.CUSTOM, CustomOptionsSerializer())