* Added Caffe Slice_ext * Added TFSlice, AttributedSlice (both with extractors and replacers), corrected SliceConverter and added unittests for all cases * added comments to each type of Slice operation; optimized shape inference; moved mxlice inside of slice.py; renamed slice_replacers * removed type annotation for get_shape_after_slice routine * replaced zeros_like with zeros * Corrected preserving node names, renamed attributes names, added tests fro slice_replacer onnx phase * Renamed slice_replacers.py * added more unittest cases * added type annotations, moved to more relevant place routines for shape calculation, and some other minor corrections * corrected a typo `normalize_slice_indices` comment * corrected shape calculation for Nonconstant inputs * corrected a few typos * corrected type declarations * corrected shape inference with rounding * refactored unit-tests for front transforms of Slice * added error raising for negative and zero shapes * removed magic_num * corrected AttributedSlice, clarified comments * fixed unit-test for AttributedSliceToSlice * typo in type hints corrected * removed supported_attrs * returned back default None for attrs of Slice
48 lines
1.8 KiB
Python
48 lines
1.8 KiB
Python
"""
|
|
Copyright (C) 2018-2020 Intel Corporation
|
|
|
|
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.
|
|
"""
|
|
|
|
import numpy as np
|
|
|
|
from mo.front.common.partial_infer.utils import int64_array
|
|
from mo.front.extractor import FrontExtractorOp
|
|
from mo.front.onnx.extractors.utils import get_onnx_opset_version
|
|
from mo.front.onnx.extractors.utils import onnx_attr
|
|
from mo.ops.slice import Slice, AttributedSlice
|
|
from mo.utils.error import Error
|
|
|
|
|
|
class SliceFrontExtractor(FrontExtractorOp):
|
|
op = 'Slice'
|
|
enabled = True
|
|
|
|
@classmethod
|
|
def extract(cls, node):
|
|
if get_onnx_opset_version(node) < 10:
|
|
starts = int64_array(onnx_attr(node, 'starts', 'ints', default=[]))
|
|
ends = int64_array(onnx_attr(node, 'ends', 'ints', default=[]))
|
|
axes = int64_array(onnx_attr(node, 'axes', 'ints', default=[]))
|
|
|
|
if len(starts) == 0 or len(ends) == 0:
|
|
raise Error("starts or/and ends are not specified for the node {}".format(node.name))
|
|
if len(axes) == 0:
|
|
axes = np.arange(len(starts), dtype=np.int)
|
|
|
|
attrs = {'axes': axes, 'starts': starts, 'ends': ends}
|
|
AttributedSlice.update_node_stat(node, attrs)
|
|
else: # onnx_opset_version >= 10
|
|
Slice.update_node_stat(node)
|
|
return cls.enabled
|