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