1095 lines
26 KiB
Plaintext
1095 lines
26 KiB
Plaintext
// Copyright 2017 The TensorFlow Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
// Revision History
|
|
// Version 0: Initial version.
|
|
// Version 1: Add subgraphs to schema.
|
|
// Version 2: Rename operators to conform to NN API.
|
|
// Version 3: Move buffer data from Model.Subgraph.Tensors to Model.Buffers.
|
|
|
|
namespace tflite;
|
|
|
|
// This corresponds to the version.
|
|
file_identifier "TFL3";
|
|
// File extension of any written files.
|
|
file_extension "tflite";
|
|
|
|
// IMPORTANT: All new members of tables, enums and unions must be added at the
|
|
// end to ensure backwards compatibility.
|
|
|
|
// The type of data stored in a tensor.
|
|
enum TensorType : byte {
|
|
FLOAT32 = 0,
|
|
FLOAT16 = 1,
|
|
INT32 = 2,
|
|
UINT8 = 3,
|
|
INT64 = 4,
|
|
STRING = 5,
|
|
BOOL = 6,
|
|
INT16 = 7,
|
|
COMPLEX64 = 8,
|
|
INT8 = 9,
|
|
FLOAT64 = 10,
|
|
}
|
|
|
|
// Custom quantization parameters for experimenting with new quantization
|
|
// techniques.
|
|
table CustomQuantization {
|
|
custom:[ubyte] (force_align: 16);
|
|
}
|
|
|
|
// Represents a specific quantization technique's parameters.
|
|
union QuantizationDetails {
|
|
CustomQuantization,
|
|
}
|
|
|
|
// Parameters for converting a quantized tensor back to float.
|
|
table QuantizationParameters {
|
|
// These four parameters are the asymmetric linear quantization parameters.
|
|
// Given a quantized value q, the corresponding float value f should be:
|
|
// f = scale * (q - zero_point)
|
|
// For other quantization types, the QuantizationDetails below is used.
|
|
min:[float]; // For importing back into tensorflow.
|
|
max:[float]; // For importing back into tensorflow.
|
|
scale:[float]; // For dequantizing the tensor's values.
|
|
zero_point:[long];
|
|
|
|
// If this is not none, the other quantization parameters (i.e. min, max,
|
|
// scale, zero_point fields above) are ignored and the value of the
|
|
// QuantizationDetails union should be used.
|
|
details:QuantizationDetails;
|
|
|
|
// Specifies the dimension of the Tensor's shape that the scales and
|
|
// zero_points correspond to. For example, a tensor t, with dims=[4, 3, 2, 1]
|
|
// with quantization params:
|
|
// scale=[1.0, 2.0, 3.0], zero_point=[1, 2, 3], quantization_dimension=1
|
|
// will be quantized across the second dimension of t.
|
|
// t[:, 0, :, :] will have scale[0]=1.0, zero_point[0]=1
|
|
// t[:, 1, :, :] will have scale[1]=2.0, zero_point[0]=2
|
|
// t[:, 2, :, :] will have scale[2]=3.0, zero_point[0]=3
|
|
quantized_dimension:int;
|
|
}
|
|
|
|
// Sparse tensors.
|
|
// We use a modification of the TACO format.
|
|
// Reference: http://tensor-compiler.org/kjolstad-oopsla17-tensor-compiler.pdf
|
|
//
|
|
// To encode a conceptual n-dimensional dense tensor with dims (d0, ..., dn-1),
|
|
// potentially with a k-dimensional block (0 <= k <= n) with dims
|
|
// (dn, ..., dn+k-1), the format needs to specify:
|
|
// 1. In what order to traverse these dimensions. For example, to store a 2-D
|
|
// matrix in row major order, the traversal order would be (d0, d1),
|
|
// whereas to store it in column major order, the traversal order would be
|
|
// (d1, d0). If the 2-D matrix has a 2-D inner block, the traversal order
|
|
// could be (d0, d1, d2, d3).
|
|
// 2. How each block dimension in (dn, ..., dn+k-1) maps to the original
|
|
// tensor dimension in (d0, ..., dn-1).
|
|
// 3. In the traversal order defined above, the format (dense vs. sparse) and
|
|
// index metadata for each dimension. For a dense dimension, this is just
|
|
// the size of that dimension. For a sparse dimension, it's the same as
|
|
// the compressed index defined in the Compressed Sparse Row (CSR) format.
|
|
// (http://scipy-lectures.org/advanced/scipy_sparse/csr_matrix.html)
|
|
|
|
// The storage type for a dimension. Currently we support:
|
|
// 1. DENSE: each coordinate in this dimension is stored implicitly.
|
|
// 2. SPARSE_CSR: only the coordinates with non-zero elements are stored. The
|
|
// compression technique is the same what CSR uses.
|
|
// More types like a sparse dimension with a different compression technique
|
|
// could be added to the list in the future.
|
|
enum DimensionType : byte {
|
|
DENSE = 0,
|
|
SPARSE_CSR = 1,
|
|
}
|
|
|
|
table Int32Vector {
|
|
values:[int];
|
|
}
|
|
|
|
table Uint16Vector {
|
|
values:[ushort] (force_align: 4);
|
|
}
|
|
|
|
table Uint8Vector {
|
|
values:[ubyte] (force_align: 4);
|
|
}
|
|
|
|
// Variable-typed buffer to store the index metadata for a sparse dimension.
|
|
// The widest type is Int32 instead of UInt32 because tensor's shape is a int32
|
|
// vector. We don't want the per-dimensional index to overflow that range.
|
|
union SparseIndexVector {
|
|
Int32Vector,
|
|
Uint16Vector,
|
|
Uint8Vector
|
|
}
|
|
|
|
table DimensionMetadata {
|
|
// Whether a dimension is dense or sparse.
|
|
format:DimensionType;
|
|
// Index metadata used for a dimension.
|
|
// - If format is DimensionType.DENSE then we use the dense_size field to
|
|
// store the size of that dimension. Each index in that dimension is
|
|
// stored implicitly.
|
|
// - If format is DimensionType.SPARSE_CSR then we use array_segments and
|
|
// array_indices to encode that dimension. array_segments represents how
|
|
// to segment the indices array, each segment corresponds to one element
|
|
// in the previous dimension. array_indices represents the index of the
|
|
// non-zero elements within this dimension (as those in the CSR matrix
|
|
// format, where the first array is row pointers and the second array is
|
|
// column indices).
|
|
dense_size:int;
|
|
array_segments:SparseIndexVector;
|
|
array_indices:SparseIndexVector;
|
|
}
|
|
|
|
// Parameters to encode a sparse TfLite tensor.
|
|
table SparsityParameters {
|
|
// The traversal order of the dimensions defined in the `shape` field of the
|
|
// conceptual dense tensor. For a n-dimensional tensors with dims (d0, d1,
|
|
// ..., dn-1),
|
|
// - if not block sparse, the traversal_order is just a permutation of (d0,
|
|
// ..., dn-1). For example, a 2-D matrix stored in row-major order would
|
|
// have traversal_order = (d0, d1).
|
|
// - if block sparse with a k-dimensional block (0 <= k <= n), the
|
|
// traversal_order has n + k elements. The first n elements are still a
|
|
// permutation of (d0, ..., dn-1). The lask k elements are a permutation
|
|
// of (dn, ..., dn+k-1), defining how to traverse a block internally. For
|
|
// example, a 2-D matrix with 2-D blocks, both stored in row-major order
|
|
// would have traversal_order = (d0, d1, d2, d3).
|
|
traversal_order:[int];
|
|
// For an n-dimensional tensor with a k-dimensional block (0 <= k <= n),
|
|
// stores how a block dimension in (dn, ..., dn+k-1) maps to the original
|
|
// tensor dimension in (d0, ..., dn).
|
|
// It's stored in the order of (dn, ..., dn+k-1).
|
|
// If not block-sparse, this field is NULL.
|
|
block_map:[int];
|
|
// In the traversal order defined above, the metadata needed for
|
|
// each dimension to locate the non-zero values in the original dense tensor.
|
|
// The size of the dim_metadata array = the size of the traversal_order array
|
|
// = n + k.
|
|
dim_metadata:[DimensionMetadata];
|
|
}
|
|
|
|
table Tensor {
|
|
// The tensor shape. The meaning of each entry is operator-specific but
|
|
// builtin ops use: [batch size, height, width, number of channels] (That's
|
|
// Tensorflow's NHWC).
|
|
shape:[int];
|
|
type:TensorType;
|
|
// An index that refers to the buffers table at the root of the model. Or,
|
|
// if there is no data buffer associated (i.e. intermediate results), then
|
|
// this is 0 (which refers to an always existent empty buffer).
|
|
//
|
|
// The data_buffer itself is an opaque container, with the assumption that the
|
|
// target device is little-endian. In addition, all builtin operators assume
|
|
// the memory is ordered such that if `shape` is [4, 3, 2], then index
|
|
// [i, j, k] maps to data_buffer[i*3*2 + j*2 + k].
|
|
buffer:uint;
|
|
name:string; // For debugging and importing back into tensorflow.
|
|
quantization:QuantizationParameters; // Optional.
|
|
|
|
is_variable:bool = false;
|
|
|
|
// Parameters to encode a sparse tensor. See the example in
|
|
// tensorflow/lite/testdata/sparse_tensor.json.
|
|
sparsity:SparsityParameters; // Optional.
|
|
|
|
// Encodes `shape` with unknown dimensions. Unknown dimensions are
|
|
// represented with -1.
|
|
shape_signature:[int]; // Optional.
|
|
}
|
|
|
|
// A list of builtin operators. Builtin operators are slightly faster than custom
|
|
// ones, but not by much. Moreover, while custom operators accept an opaque
|
|
// object containing configuration parameters, builtins have a predetermined
|
|
// set of acceptable options.
|
|
|
|
enum BuiltinOperator : byte {
|
|
ADD = 0,
|
|
AVERAGE_POOL_2D = 1,
|
|
CONCATENATION = 2,
|
|
CONV_2D = 3,
|
|
DEPTHWISE_CONV_2D = 4,
|
|
DEPTH_TO_SPACE = 5,
|
|
DEQUANTIZE = 6,
|
|
EMBEDDING_LOOKUP = 7,
|
|
FLOOR = 8,
|
|
FULLY_CONNECTED = 9,
|
|
HASHTABLE_LOOKUP = 10,
|
|
L2_NORMALIZATION = 11,
|
|
L2_POOL_2D = 12,
|
|
LOCAL_RESPONSE_NORMALIZATION = 13,
|
|
LOGISTIC = 14,
|
|
LSH_PROJECTION = 15,
|
|
LSTM = 16,
|
|
MAX_POOL_2D = 17,
|
|
MUL = 18,
|
|
RELU = 19,
|
|
// NOTE(aselle): RELU_N1_TO_1 used to be called RELU1, but it was renamed
|
|
// since different model developers use RELU1 in different ways. Never
|
|
// create another op called RELU1.
|
|
RELU_N1_TO_1 = 20,
|
|
RELU6 = 21,
|
|
RESHAPE = 22,
|
|
RESIZE_BILINEAR = 23,
|
|
RNN = 24,
|
|
SOFTMAX = 25,
|
|
SPACE_TO_DEPTH = 26,
|
|
SVDF = 27,
|
|
TANH = 28,
|
|
// TODO(aselle): Consider rename to CONCATENATE_EMBEDDINGS
|
|
CONCAT_EMBEDDINGS = 29,
|
|
SKIP_GRAM = 30,
|
|
CALL = 31,
|
|
CUSTOM = 32,
|
|
EMBEDDING_LOOKUP_SPARSE = 33,
|
|
PAD = 34,
|
|
UNIDIRECTIONAL_SEQUENCE_RNN = 35,
|
|
GATHER = 36,
|
|
BATCH_TO_SPACE_ND = 37,
|
|
SPACE_TO_BATCH_ND = 38,
|
|
TRANSPOSE = 39,
|
|
MEAN = 40,
|
|
SUB = 41,
|
|
DIV = 42,
|
|
SQUEEZE = 43,
|
|
UNIDIRECTIONAL_SEQUENCE_LSTM = 44,
|
|
STRIDED_SLICE = 45,
|
|
BIDIRECTIONAL_SEQUENCE_RNN = 46,
|
|
EXP = 47,
|
|
TOPK_V2 = 48,
|
|
SPLIT = 49,
|
|
LOG_SOFTMAX = 50,
|
|
// DELEGATE is a special op type for the operations which are delegated to
|
|
// other backends.
|
|
// WARNING: Experimental interface, subject to change
|
|
DELEGATE = 51,
|
|
BIDIRECTIONAL_SEQUENCE_LSTM = 52,
|
|
CAST = 53,
|
|
PRELU = 54,
|
|
MAXIMUM = 55,
|
|
ARG_MAX = 56,
|
|
MINIMUM = 57,
|
|
LESS = 58,
|
|
NEG = 59,
|
|
PADV2 = 60,
|
|
GREATER = 61,
|
|
GREATER_EQUAL = 62,
|
|
LESS_EQUAL = 63,
|
|
SELECT = 64,
|
|
SLICE = 65,
|
|
SIN = 66,
|
|
TRANSPOSE_CONV = 67,
|
|
SPARSE_TO_DENSE = 68,
|
|
TILE = 69,
|
|
EXPAND_DIMS = 70,
|
|
EQUAL = 71,
|
|
NOT_EQUAL = 72,
|
|
LOG = 73,
|
|
SUM = 74,
|
|
SQRT = 75,
|
|
RSQRT = 76,
|
|
SHAPE = 77,
|
|
POW = 78,
|
|
ARG_MIN = 79,
|
|
FAKE_QUANT = 80,
|
|
REDUCE_PROD = 81,
|
|
REDUCE_MAX = 82,
|
|
PACK = 83,
|
|
LOGICAL_OR = 84,
|
|
ONE_HOT = 85,
|
|
LOGICAL_AND = 86,
|
|
LOGICAL_NOT = 87,
|
|
UNPACK = 88,
|
|
REDUCE_MIN = 89,
|
|
FLOOR_DIV = 90,
|
|
REDUCE_ANY = 91,
|
|
SQUARE = 92,
|
|
ZEROS_LIKE = 93,
|
|
FILL = 94,
|
|
FLOOR_MOD = 95,
|
|
RANGE = 96,
|
|
RESIZE_NEAREST_NEIGHBOR = 97,
|
|
LEAKY_RELU = 98,
|
|
SQUARED_DIFFERENCE = 99,
|
|
MIRROR_PAD = 100,
|
|
ABS = 101,
|
|
SPLIT_V = 102,
|
|
UNIQUE = 103,
|
|
CEIL = 104,
|
|
REVERSE_V2 = 105,
|
|
ADD_N = 106,
|
|
GATHER_ND = 107,
|
|
COS = 108,
|
|
WHERE = 109,
|
|
RANK = 110,
|
|
ELU = 111,
|
|
REVERSE_SEQUENCE = 112,
|
|
MATRIX_DIAG = 113,
|
|
QUANTIZE = 114,
|
|
MATRIX_SET_DIAG = 115,
|
|
ROUND = 116,
|
|
HARD_SWISH = 117,
|
|
IF = 118,
|
|
WHILE = 119,
|
|
NON_MAX_SUPPRESSION_V4 = 120,
|
|
NON_MAX_SUPPRESSION_V5 = 121,
|
|
SCATTER_ND = 122,
|
|
SELECT_V2 = 123,
|
|
DENSIFY = 124,
|
|
SEGMENT_SUM = 125,
|
|
BATCH_MATMUL = 126
|
|
}
|
|
|
|
|
|
// Options for the builtin operators.
|
|
union BuiltinOptions {
|
|
Conv2DOptions,
|
|
DepthwiseConv2DOptions,
|
|
ConcatEmbeddingsOptions,
|
|
LSHProjectionOptions,
|
|
Pool2DOptions,
|
|
SVDFOptions,
|
|
RNNOptions,
|
|
FullyConnectedOptions,
|
|
SoftmaxOptions,
|
|
ConcatenationOptions,
|
|
AddOptions,
|
|
L2NormOptions,
|
|
LocalResponseNormalizationOptions,
|
|
LSTMOptions,
|
|
ResizeBilinearOptions,
|
|
CallOptions,
|
|
ReshapeOptions,
|
|
SkipGramOptions,
|
|
SpaceToDepthOptions,
|
|
EmbeddingLookupSparseOptions,
|
|
MulOptions,
|
|
PadOptions,
|
|
GatherOptions,
|
|
BatchToSpaceNDOptions,
|
|
SpaceToBatchNDOptions,
|
|
TransposeOptions,
|
|
ReducerOptions,
|
|
SubOptions,
|
|
DivOptions,
|
|
SqueezeOptions,
|
|
SequenceRNNOptions,
|
|
StridedSliceOptions,
|
|
ExpOptions,
|
|
TopKV2Options,
|
|
SplitOptions,
|
|
LogSoftmaxOptions,
|
|
CastOptions,
|
|
DequantizeOptions,
|
|
MaximumMinimumOptions,
|
|
ArgMaxOptions,
|
|
LessOptions,
|
|
NegOptions,
|
|
PadV2Options,
|
|
GreaterOptions,
|
|
GreaterEqualOptions,
|
|
LessEqualOptions,
|
|
SelectOptions,
|
|
SliceOptions,
|
|
TransposeConvOptions,
|
|
SparseToDenseOptions,
|
|
TileOptions,
|
|
ExpandDimsOptions,
|
|
EqualOptions,
|
|
NotEqualOptions,
|
|
ShapeOptions,
|
|
PowOptions,
|
|
ArgMinOptions,
|
|
FakeQuantOptions,
|
|
PackOptions,
|
|
LogicalOrOptions,
|
|
OneHotOptions,
|
|
LogicalAndOptions,
|
|
LogicalNotOptions,
|
|
UnpackOptions,
|
|
FloorDivOptions,
|
|
SquareOptions,
|
|
ZerosLikeOptions,
|
|
FillOptions,
|
|
BidirectionalSequenceLSTMOptions,
|
|
BidirectionalSequenceRNNOptions,
|
|
UnidirectionalSequenceLSTMOptions,
|
|
FloorModOptions,
|
|
RangeOptions,
|
|
ResizeNearestNeighborOptions,
|
|
LeakyReluOptions,
|
|
SquaredDifferenceOptions,
|
|
MirrorPadOptions,
|
|
AbsOptions,
|
|
SplitVOptions,
|
|
UniqueOptions,
|
|
ReverseV2Options,
|
|
AddNOptions,
|
|
GatherNdOptions,
|
|
CosOptions,
|
|
WhereOptions,
|
|
RankOptions,
|
|
ReverseSequenceOptions,
|
|
MatrixDiagOptions,
|
|
QuantizeOptions,
|
|
MatrixSetDiagOptions,
|
|
HardSwishOptions,
|
|
IfOptions,
|
|
WhileOptions,
|
|
DepthToSpaceOptions,
|
|
NonMaxSuppressionV4Options,
|
|
NonMaxSuppressionV5Options,
|
|
ScatterNdOptions,
|
|
SelectV2Options,
|
|
DensifyOptions,
|
|
SegmentSumOptions,
|
|
BatchMatMulOptions
|
|
}
|
|
|
|
enum Padding : byte { SAME, VALID }
|
|
|
|
enum ActivationFunctionType : byte {
|
|
NONE = 0,
|
|
RELU = 1,
|
|
RELU_N1_TO_1 = 2,
|
|
RELU6 = 3,
|
|
TANH = 4,
|
|
SIGN_BIT = 5,
|
|
}
|
|
|
|
table Conv2DOptions {
|
|
padding:Padding;
|
|
stride_w:int;
|
|
stride_h:int;
|
|
fused_activation_function:ActivationFunctionType;
|
|
dilation_w_factor:int = 1;
|
|
dilation_h_factor:int = 1;
|
|
}
|
|
|
|
table Pool2DOptions {
|
|
padding:Padding;
|
|
stride_w:int;
|
|
stride_h:int;
|
|
filter_width:int;
|
|
filter_height:int;
|
|
fused_activation_function:ActivationFunctionType;
|
|
}
|
|
|
|
table DepthwiseConv2DOptions {
|
|
// Parameters for DepthwiseConv version 1 or above.
|
|
padding:Padding;
|
|
stride_w:int;
|
|
stride_h:int;
|
|
// `depth_multiplier` is redundant. It's used by CPU kernels in
|
|
// TensorFlow 2.0 or below, but ignored in versions above.
|
|
// See comments in lite/c/builtin_op_data.h for more details.
|
|
depth_multiplier:int;
|
|
fused_activation_function:ActivationFunctionType;
|
|
// Parameters for DepthwiseConv version 2 or above.
|
|
dilation_w_factor:int = 1;
|
|
dilation_h_factor:int = 1;
|
|
}
|
|
|
|
table ConcatEmbeddingsOptions {
|
|
num_channels:int;
|
|
num_columns_per_channel:[int];
|
|
embedding_dim_per_channel:[int]; // This could be inferred from parameters.
|
|
}
|
|
|
|
enum LSHProjectionType: byte {
|
|
UNKNOWN = 0,
|
|
SPARSE = 1,
|
|
DENSE = 2,
|
|
}
|
|
|
|
table LSHProjectionOptions {
|
|
type: LSHProjectionType;
|
|
}
|
|
|
|
table SVDFOptions {
|
|
rank:int;
|
|
fused_activation_function:ActivationFunctionType;
|
|
// For weights-only quantization, use asymmetric quantization for non
|
|
// constant inputs at evaluation time.
|
|
asymmetric_quantize_inputs:bool;
|
|
}
|
|
|
|
// An implementation of TensorFlow RNNCell.
|
|
table RNNOptions {
|
|
fused_activation_function:ActivationFunctionType;
|
|
asymmetric_quantize_inputs:bool;
|
|
}
|
|
|
|
// An implementation of TensorFlow dynamic_rnn with RNNCell.
|
|
table SequenceRNNOptions {
|
|
time_major:bool;
|
|
fused_activation_function:ActivationFunctionType;
|
|
asymmetric_quantize_inputs:bool;
|
|
}
|
|
|
|
// An implementation of TensorFlow bidrectional_dynamic_rnn with RNNCell.
|
|
table BidirectionalSequenceRNNOptions {
|
|
time_major:bool;
|
|
fused_activation_function:ActivationFunctionType;
|
|
merge_outputs: bool;
|
|
asymmetric_quantize_inputs:bool;
|
|
}
|
|
|
|
enum FullyConnectedOptionsWeightsFormat: byte {
|
|
DEFAULT = 0,
|
|
SHUFFLED4x16INT8 = 1,
|
|
}
|
|
|
|
// An implementation of TensorFlow fully_connected (a.k.a Dense) layer.
|
|
table FullyConnectedOptions {
|
|
// Parameters for FullyConnected version 1 or above.
|
|
fused_activation_function:ActivationFunctionType;
|
|
|
|
// Parameters for FullyConnected version 2 or above.
|
|
weights_format:FullyConnectedOptionsWeightsFormat = DEFAULT;
|
|
|
|
// Parameters for FullyConnected version 5 or above.
|
|
// If set to true, then the number of dimension is preserved. Furthermore,
|
|
// all but the last dimension of the input and output shapes will be equal.
|
|
keep_num_dims: bool;
|
|
|
|
// Parameters for FullyConnected version 7 or above.
|
|
// If set to true, then weights-only op will use asymmetric quantization for
|
|
// inputs.
|
|
asymmetric_quantize_inputs: bool;
|
|
}
|
|
|
|
table SoftmaxOptions {
|
|
beta: float;
|
|
}
|
|
|
|
// An implementation of TensorFlow concat.
|
|
table ConcatenationOptions {
|
|
axis:int;
|
|
fused_activation_function:ActivationFunctionType;
|
|
}
|
|
|
|
table AddOptions {
|
|
fused_activation_function:ActivationFunctionType;
|
|
}
|
|
|
|
table MulOptions {
|
|
fused_activation_function:ActivationFunctionType;
|
|
}
|
|
|
|
table L2NormOptions {
|
|
fused_activation_function:ActivationFunctionType;
|
|
}
|
|
|
|
table LocalResponseNormalizationOptions {
|
|
radius:int;
|
|
bias:float;
|
|
alpha:float;
|
|
beta:float;
|
|
}
|
|
|
|
enum LSTMKernelType : byte {
|
|
// Full LSTM kernel which supports peephole and projection.
|
|
FULL = 0,
|
|
// Basic LSTM kernels. Equivalent to TensorFlow BasicLSTMCell.
|
|
BASIC = 1,
|
|
}
|
|
|
|
// An implementation of TensorFlow LSTMCell and CoupledInputForgetGateLSTMCell
|
|
table LSTMOptions {
|
|
// Parameters for LSTM version 1 or above.
|
|
fused_activation_function:ActivationFunctionType;
|
|
cell_clip: float; // Optional, 0.0 means no clipping
|
|
proj_clip: float; // Optional, 0.0 means no clipping
|
|
|
|
// Parameters for LSTM version 2 or above.
|
|
// Basic kernel is only supported in version 2 or above.
|
|
kernel_type: LSTMKernelType = FULL;
|
|
|
|
// Parameters for LSTM version 4 or above.
|
|
asymmetric_quantize_inputs: bool;
|
|
}
|
|
|
|
// An implementation of TensorFlow dynamic_rnn with LSTMCell.
|
|
table UnidirectionalSequenceLSTMOptions {
|
|
fused_activation_function:ActivationFunctionType;
|
|
cell_clip: float; // Optional, 0.0 means no clipping
|
|
proj_clip: float; // Optional, 0.0 means no clipping
|
|
|
|
// If true then first dimension is sequence, otherwise batch.
|
|
time_major:bool;
|
|
|
|
// Parameter for Unidirectional Sequence LSTM version 4.
|
|
asymmetric_quantize_inputs:bool;
|
|
}
|
|
|
|
table BidirectionalSequenceLSTMOptions {
|
|
// Parameters supported by version 1:
|
|
fused_activation_function:ActivationFunctionType;
|
|
cell_clip: float; // Optional, 0.0 means no clipping
|
|
proj_clip: float; // Optional, 0.0 means no clipping
|
|
|
|
// If true, store the outputs of both directions into the first output.
|
|
merge_outputs: bool;
|
|
|
|
// Parameters supported by version 2:
|
|
// If true then first dimension is sequence, otherwise batch.
|
|
// Version 1 implementations assumed time_major to be true, so this default
|
|
// value should never change.
|
|
time_major: bool = true;
|
|
|
|
// Parameters for version 3 or above.
|
|
asymmetric_quantize_inputs:bool;
|
|
}
|
|
|
|
table ResizeBilinearOptions {
|
|
new_height: int (deprecated);
|
|
new_width: int (deprecated);
|
|
align_corners: bool;
|
|
half_pixel_centers: bool;
|
|
}
|
|
|
|
table ResizeNearestNeighborOptions {
|
|
align_corners: bool;
|
|
half_pixel_centers: bool;
|
|
}
|
|
|
|
// A call operation options
|
|
table CallOptions {
|
|
// The subgraph index that needs to be called.
|
|
subgraph:uint;
|
|
}
|
|
|
|
table PadOptions {
|
|
}
|
|
|
|
table PadV2Options {
|
|
}
|
|
|
|
table ReshapeOptions {
|
|
new_shape:[int];
|
|
}
|
|
|
|
table SpaceToBatchNDOptions {
|
|
}
|
|
|
|
table BatchToSpaceNDOptions {
|
|
}
|
|
|
|
table SkipGramOptions {
|
|
ngram_size: int;
|
|
max_skip_size: int;
|
|
include_all_ngrams: bool;
|
|
}
|
|
|
|
table SpaceToDepthOptions {
|
|
block_size: int;
|
|
}
|
|
|
|
table DepthToSpaceOptions {
|
|
block_size: int;
|
|
}
|
|
|
|
table SubOptions {
|
|
fused_activation_function:ActivationFunctionType;
|
|
}
|
|
|
|
table DivOptions {
|
|
fused_activation_function:ActivationFunctionType;
|
|
}
|
|
|
|
table TopKV2Options {
|
|
}
|
|
|
|
enum CombinerType : byte {
|
|
SUM = 0,
|
|
MEAN = 1,
|
|
SQRTN = 2,
|
|
}
|
|
|
|
table EmbeddingLookupSparseOptions {
|
|
combiner:CombinerType;
|
|
}
|
|
|
|
table GatherOptions {
|
|
axis: int;
|
|
}
|
|
|
|
table TransposeOptions {
|
|
}
|
|
|
|
table ExpOptions {
|
|
}
|
|
|
|
table CosOptions {
|
|
}
|
|
|
|
table ReducerOptions {
|
|
keep_dims: bool;
|
|
}
|
|
|
|
table SqueezeOptions {
|
|
squeeze_dims:[int];
|
|
}
|
|
|
|
table SplitOptions {
|
|
num_splits: int;
|
|
}
|
|
|
|
table SplitVOptions {
|
|
num_splits: int;
|
|
}
|
|
|
|
table StridedSliceOptions {
|
|
begin_mask: int;
|
|
end_mask: int;
|
|
ellipsis_mask: int;
|
|
new_axis_mask: int;
|
|
shrink_axis_mask: int;
|
|
}
|
|
|
|
table LogSoftmaxOptions {
|
|
}
|
|
|
|
table CastOptions {
|
|
in_data_type: TensorType;
|
|
out_data_type: TensorType;
|
|
}
|
|
|
|
table DequantizeOptions {
|
|
}
|
|
|
|
table MaximumMinimumOptions {
|
|
}
|
|
|
|
table TileOptions {
|
|
}
|
|
|
|
table ArgMaxOptions {
|
|
output_type : TensorType;
|
|
}
|
|
|
|
table ArgMinOptions {
|
|
output_type : TensorType;
|
|
}
|
|
|
|
table GreaterOptions {
|
|
}
|
|
|
|
table GreaterEqualOptions {
|
|
}
|
|
|
|
table LessOptions {
|
|
}
|
|
|
|
table LessEqualOptions {
|
|
}
|
|
|
|
table NegOptions {
|
|
}
|
|
|
|
table SelectOptions {
|
|
}
|
|
|
|
table SliceOptions {
|
|
}
|
|
|
|
table TransposeConvOptions {
|
|
padding:Padding;
|
|
stride_w:int;
|
|
stride_h:int;
|
|
}
|
|
|
|
table ExpandDimsOptions {
|
|
}
|
|
|
|
table SparseToDenseOptions {
|
|
validate_indices:bool;
|
|
}
|
|
|
|
table EqualOptions {
|
|
}
|
|
|
|
table NotEqualOptions {
|
|
}
|
|
|
|
table ShapeOptions {
|
|
// Optional output type of the operation (int32 or int64). Defaults to int32.
|
|
out_type : TensorType;
|
|
}
|
|
|
|
table RankOptions {
|
|
}
|
|
|
|
table PowOptions {
|
|
}
|
|
|
|
table FakeQuantOptions {
|
|
// Parameters supported by version 1:
|
|
min:float;
|
|
max:float;
|
|
num_bits:int;
|
|
|
|
// Parameters supported by version 2:
|
|
narrow_range:bool;
|
|
}
|
|
|
|
table PackOptions {
|
|
values_count:int;
|
|
axis:int;
|
|
}
|
|
|
|
table LogicalOrOptions {
|
|
}
|
|
|
|
table OneHotOptions {
|
|
axis:int;
|
|
}
|
|
|
|
table AbsOptions {
|
|
}
|
|
|
|
|
|
table HardSwishOptions {
|
|
}
|
|
|
|
table LogicalAndOptions {
|
|
}
|
|
|
|
table LogicalNotOptions {
|
|
}
|
|
|
|
table UnpackOptions {
|
|
num:int;
|
|
axis:int;
|
|
}
|
|
|
|
table FloorDivOptions {
|
|
}
|
|
|
|
table SquareOptions {
|
|
}
|
|
|
|
table ZerosLikeOptions {
|
|
}
|
|
|
|
table FillOptions {
|
|
}
|
|
|
|
table FloorModOptions {
|
|
}
|
|
|
|
table RangeOptions {
|
|
}
|
|
|
|
table LeakyReluOptions {
|
|
alpha:float;
|
|
}
|
|
|
|
table SquaredDifferenceOptions {
|
|
}
|
|
|
|
enum MirrorPadMode : byte {
|
|
// Doesn't include borders.
|
|
REFLECT = 0,
|
|
// Includes borders.
|
|
SYMMETRIC = 1,
|
|
}
|
|
|
|
table MirrorPadOptions {
|
|
mode:MirrorPadMode;
|
|
}
|
|
|
|
table UniqueOptions {
|
|
idx_out_type:TensorType = INT32;
|
|
}
|
|
|
|
table ReverseV2Options {
|
|
}
|
|
|
|
table AddNOptions {
|
|
}
|
|
|
|
table GatherNdOptions {
|
|
}
|
|
|
|
table WhereOptions {
|
|
}
|
|
|
|
table ReverseSequenceOptions {
|
|
seq_dim:int;
|
|
batch_dim:int = 0;
|
|
}
|
|
|
|
table MatrixDiagOptions {
|
|
}
|
|
|
|
table QuantizeOptions {
|
|
}
|
|
|
|
table MatrixSetDiagOptions {
|
|
}
|
|
|
|
table IfOptions {
|
|
then_subgraph_index:int;
|
|
else_subgraph_index:int;
|
|
}
|
|
|
|
table WhileOptions {
|
|
cond_subgraph_index:int;
|
|
body_subgraph_index:int;
|
|
}
|
|
|
|
table NonMaxSuppressionV4Options {
|
|
}
|
|
|
|
table NonMaxSuppressionV5Options {
|
|
}
|
|
|
|
table ScatterNdOptions {
|
|
}
|
|
|
|
table SelectV2Options {
|
|
}
|
|
|
|
table DensifyOptions {
|
|
}
|
|
|
|
table SegmentSumOptions {
|
|
}
|
|
|
|
table BatchMatMulOptions {
|
|
adj_x:bool;
|
|
adj_y:bool;
|
|
}
|
|
|
|
// An OperatorCode can be an enum value (BuiltinOperator) if the operator is a
|
|
// builtin, or a string if the operator is custom.
|
|
table OperatorCode {
|
|
builtin_code:BuiltinOperator;
|
|
custom_code:string;
|
|
|
|
// The version of the operator. The version need to be bumped whenever new
|
|
// parameters are introduced into an op.
|
|
version:int = 1;
|
|
}
|
|
|
|
enum CustomOptionsFormat : byte {
|
|
FLEXBUFFERS = 0,
|
|
}
|
|
|
|
// An operator takes tensors as inputs and outputs. The type of operation being
|
|
// performed is determined by an index into the list of valid OperatorCodes,
|
|
// while the specifics of each operations is configured using builtin_options
|
|
// or custom_options.
|
|
table Operator {
|
|
// Index into the operator_codes array. Using an integer here avoids
|
|
// complicate map lookups.
|
|
opcode_index:uint;
|
|
|
|
// Optional input are indicated by -1.
|
|
inputs:[int];
|
|
outputs:[int];
|
|
|
|
builtin_options:BuiltinOptions;
|
|
custom_options:[ubyte];
|
|
custom_options_format:CustomOptionsFormat;
|
|
|
|
// A list of booleans indicating the input tensors which are being mutated by
|
|
// this operator.(e.g. used by RNN and LSTM).
|
|
// For example, if the "inputs" array refers to 5 tensors and the second and
|
|
// fifth are mutable variables, then this list will contain
|
|
// [false, true, false, false, true].
|
|
//
|
|
// If the list is empty, no variable is mutated in this operator.
|
|
// The list either has the same length as `inputs`, or is empty.
|
|
mutating_variable_inputs:[bool];
|
|
|
|
// A list of indices to the subgraph's "tensors" that are internal to an Op.
|
|
// Internal tensors are those that do not flow in or out of the operation,
|
|
// but instead are part of internal computation. As such, the operation's
|
|
// implementation may manage its memory more efficiently. They are needed
|
|
// however (i.e. not just an implementation detail) since they are part of the
|
|
// computation, which may require relevant metadata such as quantization
|
|
// parameters.
|
|
intermediates:[int];
|
|
}
|
|
|
|
// The root type, defining a subgraph, which typically represents an entire
|
|
// model.
|
|
table SubGraph {
|
|
// A list of all tensors used in this subgraph.
|
|
tensors:[Tensor];
|
|
|
|
// Indices of the tensors that are inputs into this subgraph. Note this is
|
|
// the list of non-static tensors that feed into the subgraph for inference.
|
|
inputs:[int];
|
|
|
|
// Indices of the tensors that are outputs out of this subgraph. Note this is
|
|
// the list of output tensors that are considered the product of the
|
|
// subgraph's inference.
|
|
outputs:[int];
|
|
|
|
// All operators, in execution order.
|
|
operators:[Operator];
|
|
|
|
// Name of this subgraph (used for debugging).
|
|
name:string;
|
|
}
|
|
|
|
// Table of raw data buffers (used for constant tensors). Referenced by tensors
|
|
// by index. The generous alignment accommodates mmap-friendly data structures.
|
|
table Buffer {
|
|
data:[ubyte] (force_align: 16);
|
|
}
|
|
|
|
table Metadata {
|
|
// A human readable string to uniquely identify a Metadata.
|
|
name:string;
|
|
// An index to the buffers table.
|
|
buffer:uint;
|
|
}
|
|
|
|
table Model {
|
|
// Version of the schema.
|
|
version:uint;
|
|
|
|
// A list of all operator codes used in this model. This is
|
|
// kept in order because operators carry an index into this
|
|
// vector.
|
|
operator_codes:[OperatorCode];
|
|
|
|
// All the subgraphs of the model. The 0th is assumed to be the main
|
|
// model.
|
|
subgraphs:[SubGraph];
|
|
|
|
// A description of the model.
|
|
description:string;
|
|
|
|
// Buffers of the model.
|
|
// Note the 0th entry of this array must be an empty buffer (sentinel).
|
|
// This is a convention so that tensors without a buffer can provide 0 as
|
|
// their buffer.
|
|
buffers:[Buffer];
|
|
|
|
// Metadata about the model. Indirects into the existings buffers list.
|
|
// Deprecated, prefer to use metadata field.
|
|
metadata_buffer:[int];
|
|
|
|
// Metadata about the model.
|
|
metadata:[Metadata];
|
|
}
|
|
|
|
root_type Model;
|