AI model convert tool: Support Layer
This is a list of layers that can be converted with the CV tool.
Models consisting only of layers included in this list can be converted.
Caffe
Support version (Caffe)
V1.0
Support Layer (Caffe)
Caffe Layer Type | Comments |
---|---|
Convolution |
|
Deconvolution |
|
Pooling - MAX, AVG |
|
Crop |
|
InnerProduct |
|
LRN |
|
BatchNormalization |
|
ReLU |
|
Leaky-ReLU |
|
PReLU |
|
ELU |
|
Sigmoid |
|
TanH |
|
AbsVal |
|
Bias |
|
Scale |
|
Power |
|
Exp |
|
Log |
|
BNLL |
|
Flatten |
|
Reshape |
|
Concat |
|
Eltwise - SUM |
|
Eltwise - MAX |
|
Eltwise - PROD |
|
Reduction - SUM |
|
Reduction - MEAN |
|
Reduction - ASUM |
|
Reduction - SUMSQ |
|
Softmax |
|
Input |
|
Split | Parser maps output to input |
Slice |
|
ArgMax | Only K=1 is supported. |
Dropout | Parser maps output to input |
Tensorflow
Support version (Tensorflow)
V1.10.1 ~ V1.15
Support Layer (Tensorflow)
TensorFlow Op Type | TensorFlow Function | Comments |
---|---|---|
MatMul, BatchMatMulV2 | tf.linalg.matmul tf.matmul | adjoint_a, adjoint_b, a_is_sparse, b_is_sparse not supported |
AvgPool | tf.nn.avg_pool |
|
MaxPool | tf.nn.max_pool |
|
Conv2D | tf.nn.conv2d | Filter has to be constant |
DepthwiseConv2dNative | tf.nn.depthwise_conv2d |
|
Conv2DBackpropInput | tf.nn.conv2d_backprop_input | Assumptions:
|
Conv2DBackpropFilter | tf.nn.conv2d_backprop_filter | Assumptions:
|
LRN | tf.nn.local_response_normalization |
|
Softmax | tf.nn.softmax |
|
Reshape | tf.reshape | Pre- and Post- transpose ops are added in case reshape involves depth dim |
Sigmoid | tf.sigmoid |
|
Tanh | tf.nn.tanh |
|
| tf.nn.atrous_conv2d | Expands to SpaceToBatchND-> Conv2D -> BatchToSpaceND |
SpaceToBatchND | tf.space_to_batch_nd | [SpaceToBatchND -> Conv2D -> BatchToSpaceND] works |
BatchToSpaceND | tf.batch_to_space_nd | [SpaceToBatchND -> Conv2D -> BatchToSpaceND] works |
Const | tf.constant |
|
Placeholder | tf.placeholder |
|
Max | tf.reduce_max | keepdims supported using transpose node |
Min | tf.reduce_min | keepdims supported using transpose node |
Sum | tf.reduce_sum | keepdims supported using transpose node |
Prod | tf.reduce_prod | keepdims supported using transpose node |
Mean | tf.reduce_mean | keepdims supported using transpose node |
Squeeze | tf.squeeze | axis parameter not supported |
BatchNorm | tf.nn.batch_normalization |
|
FusedBatchNorm | tf.nn.fused_batch_norm |
|
Relu | tf.nn.relu |
|
Elu | tf.nn.elu |
|
Relu6 | tf.nn.relu6 |
|
LeakyRelu | tf.nn.leaky_relu |
|
Concat | tf.concat |
|
ConcatV2 | tf.concatv2 |
|
Add | tf.add |
|
BiasAdd | tf.nn.bias_add |
|
AddN | tf.addn |
|
Sub | tf.subtract |
|
Abs | tf.abs |
|
Neg | tf.negative |
|
Ceil | tf.ceil |
|
Floor | tf.floor |
|
Exp | tf.exp |
|
Log | tf.log |
|
Reciprocal | tf.reciprocal |
|
Pow | tf.pow |
|
Mul | tf.multiply |
|
Square | tf.square |
|
Sqrt | tf.sqrt |
|
Rsqrt | tf.rqrt |
|
Div | tf.div |
|
TrueDiv | tf.truediv |
|
RealDiv | tf.realdiv |
|
Divide | tf.divide |
|
Maximum | tf.maximum |
|
Minimum | tf.minimum |
|
Pad, MirrorPad | tf.pad | Limited support. |
Transpose | tf.transpose | conjugate = True not supported |
ResizeBilinear | tf.image.resize_bilinear |
|
ResizeNearestNeighbor | tf.image.resize_nearest_neighbor | align_corners = True not supported half_center_pixels = True not supported |
Resamp | tf.contrib.resampler |
|
Slice | tf.slice | begin and size dtype int64 not supported |
StridedSlice | tf.strided_slice |
|
Split, SplitV | tf.split | only "num_split" attr is supported |
ArgMin | tf.argmin |
|
ArgMax | tf.argmax |
|
OneHot | tf.one_hot |
|
SquaredDifference | tf.squared_difference |
|
Pack | tf.stack |
|
Unpack | tf.unstack |
|
Range | tf.range |
|
ClipByValue | tf.clip_by_value |
|
ScatterND | tf.scatter_nd | Duplicate indices values will be overwritten to the last index value. |
Gather | tf.gather | Only axis = 0 is supported |
| tf.nn.l2_normalize | Expands to math operators |
TopKV2 | tf.math.top_k |
|
Cast | tf.dtypes.saturate_cast | tf.cast might fail. |
ZerosLike | tf.zeros_like |
|
OnesLike | tf.ones_like |
|
Tile | tf.tile |
|
Softplus | tf.math.softplus |
|
Identity | tf.identity |
|
ExpandDims | tf.expand_dims |
|
FakeQuantWithMinMaxArgs | tf.fake_quant_with_min_max_args |
|
FakeQuantWithMinMaxVars | tf.fake_quant_with_min_max_vars |
|
Shape | tf.Shape |
|
CheckNumerics | tf.check_numerics |
|
NoOp | tf.no_op |
|
Assert | tf.Assert |
|
Mish |
|
|
Swish |
|
|
Sign | tf.math.sign |
|
Level Curve | Custom op |
|
FloorMod | tf.math.floormod |
|
Tensorflow Lite
Support version (Tensorflow Lite)
V1.10.1 ~
Support Layer (Tensorflow Lite)
TFLite Op | TensorFlow API | Comments |
---|---|---|
ABS | tf.abs |
|
ADD | tf.add |
|
ARG_MAX | tf.argmax |
|
ARG_MIN | tf.argmin |
|
AVERAGE_POOL_2D | tf.nn.avg_pool |
|
BATCH_MATMUL | tf.matmul |
|
BATCH_TO_SPACE | tf.batch_to_space | SpaceToBatch ->Conv ->BatchToSpace patterns are detected and fused into Conv primitive. |
CAST | tf.identity | Optimized during conversion to protobuf |
CONCATENATION | tf.concat |
|
CONV_2D | tf.nn.conv2d | Filter has to be constant. Use surgery with ConstantifyShapes to make it constant |
DENSIFY | tf.Variable | Optimized during conversion to protobuf |
DEPTHWISE_CONV_2D | tf.nn.depthwise_conv2d |
|
DEPTH_TO_SPACE | tf.nn.depth_to_space | Evaluates to multiple reshape and transpose SGL nodes |
DEQUANTIZE | tf.identity | Optimized during conversion to protobuf |
DIV | tf.divide |
|
EQUAL | tf.equal |
|
EXP | tf.exp |
|
EXPAND_DIMS | tf.expand_dims | Parser maps output to input |
FAKE_QUANT | tf.quantization.fake_quant_with_min_max_vars | Parser maps output to input with quantization information captured. |
FILL | tf.fill | Depends on fill value. Defaults to 0 |
FLOOR_DIV | tf.math.floordiv | Div followed by Floor |
FLOOR_MOD | tf.math.floormod | Mod(x,y)=x-Floor(x*Rexiprocal(y))*y |
FULLY_CONNECTED | tf.matmul | adjoint_a, adjoint_b, a_is_sparse, b_is_sparse not supported |
GATHER | tf.gather |
|
GATHER_ND | tf.gather_nd |
|
GREATER | tf.greater |
|
GREATER_EQUAL | tf.greater_equal |
|
IDENTITY | tf.identity | Optimized during conversion to protobuf |
LEAKY_RELU | tf.nn.leaky_relu |
|
LESS | tf.less |
|
LESS_EQUAL | tf.less_equal |
|
LOG | tf.math.log |
|
LOGICAL_AND | tf.logical_and |
|
LOGICAL_NOT | tf.logical_not |
|
LOGICAL_OR | tf.logical_or |
|
LOGISTIC | tf.sigmoid |
|
MAXIMUM | tf.maximum |
|
MAX_POOL_2D | tf.nn.max_pool |
|
MEAN | tf.reduce_mean |
|
MINIMUM | tf.minimum |
|
MUL | tf.multiply |
|
NEG | tf.math.negative |
|
PACK | tf.stack |
|
PAD | tf.pad |
|
PRELU | - | This op is exanded to Relu, Neg, Mul, Add in protobuf. Parser groups them into Prelu SGL |
QUANTIZE | tf.identity | Optimized during conversion to protobuf |
RANGE | tf.range | Constant SGL node created |
REDUCE_MAX | tf.reduce_max |
|
REDUCE_MIN | tf.reduce_min |
|
REDUCE_PROD | tf.reduce_prod |
|
RELU | tf.nn.relu |
|
RELU6 | tf.nn.relu6 |
|
RESHAPE | tf.reshape |
|
RESIZE_BILINEAR | tf.image.resize_bilinear |
|
RESIZE_NEAREST_NEIGHBOR | tf.image.resize_nearest_neighbor |
|
RSQRT | tf.math.rsqrt | Square Root followed by Reciprocal |
SELECT | tf.where |
|
SHAPE | tf.Shape | Shape values are computed in first pass of parser |
SLICE | tf.slice |
|
SOFTMAX | tf.nn.softmax |
|
SPACE_TO_BATCH | tf.space_to_batch | SpaceToBatch -> Conv ->BatchToSpace patterns are detected and fused into Conv primitive. |
SPACE_TO_DEPTH | tf.nn.space_to_depth |
|
SPLIT | tf.split |
|
SPLIT_V | tf.split |
|
SQRT | tf.sqrt |
|
SQUARED_DIFFERENCE | tf.math.squared_difference | Sub followed by Mul |
SQUEEZE | tf.squeeze |
|
STRIDED_SLICE | tf.strided_slice |
|
SUB | tf.subtract |
|
SUM | tf.reduce_sum |
|
TANH | tf.math.tanh |
|
TILE | tf.tile |
|
TOPK_V2 | tf.math.top_k |
|
TRANSPOSE | tf.transpose |
|
TRANSPOSE_CONV | tf.nn.conv2d_transpose | Assumptions:
|
UNPACK | tf.unstack |
|
WHERE | tf.where |
|
ZEROS_LIKE | tf.zeros_like | Fill const node with zeros |
ONNX
Support version (ONNX)
V1.3.0 ~ V1.11.0
Support Layer (ONNX)
Operator | Operator Set | Comments |
---|---|---|
Add | 1,6,7,13,14 |
|
Abs | 1,6 |
|
And | 1,7 | BitVector data-format needs to be specified for inputs using layer-level sideband. |
ArgMax | 1,11,12,13 | Since operator set 12, the 'select_last_index' attribute must be 0. |
ArgMin | 1,11,12,13 | Since operator set 12, the 'select_last_index' attribute must be 0. |
AveragePool | 1,7,10,11 | Supports up to 3 spatial dimensions. |
BatchNormalization | 1,6,7,9 |
|
Cast | 1,6,9,13 | Passthrough. |
Ceil | 1,6 |
|
Celu | 12 |
|
Constant | 1,9,11,12,13 | 'sparse_value' attribute is not supported. |
*ConstantOfShape | 9 | All inputs must be constants. |
Conv | 1,11 | All inputs except for 'X' must be constants. Supports up to 3 spatial dimensions. |
ConvTranspose | 1,11 | All inputs except for 'X' must be constants. Supports up to 3 spatial dimensions. |
Concat | 1,4,11,13 |
|
Cos | 7 |
|
Clip | 1,6,11,12,13 |
|
CumSum | 11,14 | All inputs except for 'x' must be constants. |
DepthToSpace | 1,11,13 |
|
DequantizeLinear | 10,13 | All inputs except for 'x' must be constants. |
Div | 1,6,7,13,14 |
|
Dropout | 1,6,7,10,12,13 | Passthrough. Since operator set 12, the 'training_mode' input must evaluate to false. |
Elu | 1,6 |
|
Equal | 1,7,11,13 |
|
Erf | 9,13 |
|
Exp | 1,6 |
|
Expand | 8,13 |
|
Flatten | 1,9,11,13 |
|
Floor | 1,6 |
|
Gather | 1,11,13 | Negative index values will not be interpreted correctily for dynamic ‘indices’ input. Significant rank of gathered entries cannot exceed 3, i.e. if gathering 4-dimensional entries, the outermost dimension of each entry must have size 1. |
GatherElements | 11 | 'indices' input must be a constant. |
GatherND | 11,12,13 | Negative index values will not be interpreted correctly for dynamic 'indices' input. Since operator set 12, the 'batch_dims' attribute must be 0. |
Gemm | 1,6,7,9,11,13 | 'C' input must be a constant. |
GlobalAveragePool | 1 |
|
GlobalMaxPool | 1 |
|
Greater | 1,7,9,13 |
|
GreaterOrEqual | 12,16 |
|
HardSigmoid | 1,6 |
|
HardSwish | 14 |
|
Identity | 1 | Passthrough. |
InstanceNormalization | 1,6 |
|
LeakyRelu | 1,6 |
|
Less | 1,7,9,13 |
|
LessOrEqual | 12,16 |
|
Log | 1,6 |
|
LogSoftmax | 1,11,13 |
|
LRN | 1 |
|
MatMul | 1,9 |
|
Max | 1,6,8,12,13 |
|
MaxPool | 1,8,10,11,12 |
|
Mean | 1,6,8 |
|
Min | 1,6,8,12,13 |
|
Mul | 1,6,7 |
|
Neg | 1,6 |
|
OneHot | 9,11 | All inputs except for 'indices' must be constants. |
Pad | 1,2,11,13 | If the 'mode' attribute is 'constant', padding value must be 0. Since operator set 11, all inputs except for 'data' must be constants. |
Pow | 1,7,12,13,15 |
|
PRelu | 1,6,7,9 |
|
QLinearConv | 10 | All inputs except for 'x' must be constants. Supports up to 3 spatial dimensions. |
QLinearMatMul | 10 | All inputs except for 'a' and 'b' must be constants. |
QuantizeLinear | 10,13 | All inputs except for 'x' must be constants. |
RandomUniform | 1 |
|
Reshape | 1,5,13 | Since operator set 5, the 'shape' input should be a constant. |
Reciprocal | 1,6 |
|
Relu | 1,6,13,14 |
|
ReduceL1 | 1,11,13 |
|
ReduceL2 | 1,11,13 |
|
ReduceLogSumExp | 1,11 |
|
ReduceMax | 1,11,12,13 |
|
ReduceMean | 1,11,13 |
|
ReduceMin | 1,11,12,13 |
|
ReduceProd | 1,11 |
|
ReduceSum | 1,11,13 | Since operator set 13, input tensor 'axes' must be constant. |
Resize | 10,11 | All inputs except for 'x' must be constants. |
Round | 11 | By default, halfs are rounded towards positive infinity. Rounding halfs to the nearest even integer is only supported in CV3. |
ScatterElements | 11 | 'indices' input must be a constant. |
ScatterND | 11 |
|
Selu | 1,6 |
|
*Shape | 1 | 'data' input must have constant shape. |
Sigmoid | 1,6 |
|
Sin | 7 |
|
Slice | 1,10,11,13 | All inputs except for 'data' must be constants. |
Softmax | 1,11,13 |
|
Softplus | 1 |
|
Split | 1,2,11,13 | All inputs except for 'input' must be constants. |
Sqrt | 1,6 |
|
Squeeze | 1,11,13 | Since operator set 13, the 'axes' input tensor must be a constant if it is specified. |
Sub | 1,6,7 |
|
Sum | 1,6,8 |
|
Tanh | 1,6 |
|
Tile | 1,6 |
|
TopK | 1,10,11 |
|
Transpose | 1,13 |
|
Upsample | 7,9 | All inputs except for 'X' must be constants. |
Unsqueeze | 1,11,13 | Since operator set 13, the 'axes' input tensor must be a constant if it is specified. |
Where | 9,16 |
|
(*) Some operators are not directly supported but can typically be folded/removed.