[MO] add reinterp_shape for StridedSlice (#9622)
* added reinterp_shape for StridedSlice * package_BOM update * corrected unit-tests * returned removed tests
This commit is contained in:
1 parent
d5b74b0c6b
commit
73e9eb4c61
5 files changed
+70
-235
No files matched your search
@@ -817,7 +817,6 @@ openvino/tools/mo/middle/sparse_reshape.py
|
||||
openvino/tools/mo/middle/split_tdnn_memoryoffset.py
|
||||
openvino/tools/mo/middle/SplitConcatPairToInterpolate.py
|
||||
openvino/tools/mo/middle/StridedSliceNormalizer.py
|
||||
openvino/tools/mo/middle/StridedSliceReplacer.py
|
||||
openvino/tools/mo/middle/SwapAxesMiddleReplacer.py
|
||||
openvino/tools/mo/middle/TensorIterator_utils.py
|
||||
openvino/tools/mo/middle/TensorIteratorBackEdge.py
|
||||
|
||||
@@ -113,6 +113,12 @@ class StridedSliceNormalizer(MiddleReplacementPattern):
|
||||
if node.is_in_port_connected(3):
|
||||
PermuteInputs().set_input_permutation(node.in_node(3), node, 'input:3', 'slice', 'dim_size')
|
||||
|
||||
# If there are new_axis_mask or shrink_axis_mask then StridedSlice should be performed in the
|
||||
# original layout, same as for Squeeze, Unsqueeze, Reshape, Gather
|
||||
if np.count_nonzero(node['new_axis_mask']) > 0 or np.count_nonzero(node['shrink_axis_mask']) > 0:
|
||||
node['reinterp_shape'] = True
|
||||
node['nchw_layout'] = True
|
||||
|
||||
@staticmethod
|
||||
def normalize_strided_slice(graph: Graph, node: Node):
|
||||
input_shape = node.in_port(0).data.get_shape()
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
# Copyright (C) 2018-2022 Intel Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import numpy as np
|
||||
|
||||
from openvino.tools.mo.middle.InsertLayoutPropagationTransposes import InsertLayoutPropagationTranspose
|
||||
from openvino.tools.mo.middle.StridedSliceNormalizer import StridedSliceNormalizer
|
||||
from openvino.tools.mo.front.common.partial_infer.utils import int64_array
|
||||
from openvino.tools.mo.front.tf.graph_utils import create_op_node_with_second_input
|
||||
from openvino.tools.mo.graph.graph import Graph, rename_nodes, Node
|
||||
from openvino.tools.mo.middle.replacement import MiddleReplacementPattern
|
||||
from openvino.tools.mo.ops.squeeze import Squeeze
|
||||
from openvino.tools.mo.ops.unsqueeze import Unsqueeze
|
||||
|
||||
|
||||
def replace_strided_slice(node: Node, mask: np.ndarray, op: callable):
|
||||
node_name = node.soft_get('name', node.id)
|
||||
axes = np.where(mask == 1)[0]
|
||||
new_node = create_op_node_with_second_input(node.graph, op, int64_array(axes))
|
||||
node.in_port(0).get_connection().set_destination(new_node.in_port(0))
|
||||
node.out_port(0).get_connection().set_source(new_node.out_port(0))
|
||||
|
||||
rename_nodes([(node, node_name + '/ShouldBeDeleted'), (new_node, node_name)])
|
||||
node.graph.remove_node(node.id)
|
||||
|
||||
|
||||
class ReplaceStridedSliceWithSqueezeUnsqueeze(MiddleReplacementPattern):
|
||||
r"""
|
||||
The transformation replaces StridedSlice with a Squeeze/Unsqueeze node if StridedSlice executes like a Squeeze/Unsqueeze
|
||||
and does not slice values. This is necessary if StridedSlice is to be executed in original N(D)HWC layout, because
|
||||
the operation does not have reinterp_shape attribute and MO can not insert NC(D)HW -> N(D)HWC Transpose in
|
||||
openvino/tools/mo/middle/InsertLayoutPropagationTransposes.py.
|
||||
"""
|
||||
enabled = True
|
||||
|
||||
graph_condition = [lambda graph: graph.graph['layout'] == 'NHWC']
|
||||
|
||||
def run_before(self):
|
||||
return [InsertLayoutPropagationTranspose]
|
||||
|
||||
def run_after(self):
|
||||
return [StridedSliceNormalizer]
|
||||
|
||||
def find_and_replace_pattern(self, graph: Graph):
|
||||
for node in graph.get_op_nodes(op='StridedSlice'):
|
||||
input_shape = node.in_port(0).data.get_shape()
|
||||
output_shape = node.out_port(0).data.get_shape()
|
||||
|
||||
if np.prod(input_shape) != np.prod(output_shape):
|
||||
continue
|
||||
|
||||
shrink_axis_mask = node.soft_get('shrink_axis_mask', np.zeros(len(input_shape), dtype=np.bool))
|
||||
new_axis_mask = node.soft_get('new_axis_mask', np.zeros(len(input_shape), dtype=np.bool))
|
||||
|
||||
is_shrink_axis_mask = any(x == 1 for x in shrink_axis_mask)
|
||||
is_new_axis_mask = any(x == 1 for x in new_axis_mask)
|
||||
|
||||
if is_shrink_axis_mask and is_new_axis_mask:
|
||||
# TODO: make it in a separate ticket
|
||||
continue
|
||||
elif is_shrink_axis_mask and not is_new_axis_mask:
|
||||
replace_strided_slice(node, shrink_axis_mask, Squeeze)
|
||||
elif not is_shrink_axis_mask and is_new_axis_mask:
|
||||
replace_strided_slice(node, new_axis_mask, Unsqueeze)
|
||||
@@ -33,6 +33,7 @@ edges_without_strides = (
|
||||
*connect('strided_slice', 'res')
|
||||
)
|
||||
|
||||
|
||||
class TestStridedSliceNormalizer(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_extend_inputs(self):
|
||||
@@ -190,7 +191,6 @@ class TestStridedSliceNormalizer(unittest.TestCase):
|
||||
**regular_op_with_empty_data('begin_concat',
|
||||
{'op': 'Concat', 'infer': concat_infer, 'axis': 0, 'dim_attrs': {}}),
|
||||
|
||||
|
||||
**valued_const_with_data('end', int64_array([4, 0, 5])),
|
||||
**valued_const_with_data('split_axis_end', int64_array(0)),
|
||||
**valued_const_with_data('splits_lengths_end', int64_array([ellipsis_start, -1])),
|
||||
@@ -286,7 +286,6 @@ class TestStridedSliceNormalizer(unittest.TestCase):
|
||||
**regular_op_with_empty_data('begin_concat',
|
||||
{'op': 'Concat', 'infer': concat_infer, 'axis': 0, 'dim_attrs': {}}),
|
||||
|
||||
|
||||
**valued_const_with_data('end', int64_array([4, 0, 5])),
|
||||
**valued_const_with_data('split_axis_end', int64_array(0)),
|
||||
**valued_const_with_data('splits_lengths_end', int64_array([ellipsis_start, -1])),
|
||||
@@ -396,7 +395,7 @@ class TestStridedSliceShapeInferAfterNormalizer(unittest.TestCase):
|
||||
def test_strided_slice_infer_after_normalizer_4(
|
||||
self, # inp[1:34, :, :, :2] begin mask is (1,) so only one value can be specified
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 35, 2),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(1, 0, 0, ), end_mask=(1, 0, 0, 1),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(1, 0, 0,), end_mask=(1, 0, 0, 1),
|
||||
shrink_axis_mask=(0, 1), new_axis_mask=(0,), ellipsis_mask=(0,)
|
||||
):
|
||||
self.run_infer_test(inp, ref_res, begin, end, strides,
|
||||
@@ -405,7 +404,8 @@ class TestStridedSliceShapeInferAfterNormalizer(unittest.TestCase):
|
||||
def test_strided_slice_infer_after_normalizer_5(
|
||||
self, # inp[:, :, :, :] since all begin and end masks are zero
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 35, 35, 3),
|
||||
begin=(1, 10, 10, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(0, 0, 0, 0), end_mask=(0, 0, 0, 0),
|
||||
begin=(1, 10, 10, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(0, 0, 0, 0),
|
||||
end_mask=(0, 0, 0, 0),
|
||||
shrink_axis_mask=(0,), new_axis_mask=(0,), ellipsis_mask=(0,)
|
||||
):
|
||||
self.run_infer_test(inp, ref_res, begin, end, strides,
|
||||
@@ -469,7 +469,8 @@ class TestStridedSliceShapeInferAfterNormalizer(unittest.TestCase):
|
||||
def test_strided_slice_infer_after_normalizer_12(
|
||||
self, # inp[0, :34, 20, :2]
|
||||
inp=(1, 35, 35, 3), ref_res=(34, 2),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(0, 1, 1, 1), end_mask=(0, 1, 1, 1),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(0, 1, 1, 1),
|
||||
end_mask=(0, 1, 1, 1),
|
||||
shrink_axis_mask=(1, 0, 1, 0), new_axis_mask=(0,), ellipsis_mask=(0,)
|
||||
):
|
||||
self.run_infer_test(inp, ref_res, begin, end, strides,
|
||||
@@ -1590,6 +1591,8 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
from openvino.tools.mo.middle.ApplyPermutations import ApplyPermutation
|
||||
from openvino.tools.mo.middle.MergeNodesPermutations import MergeNodesPermutations
|
||||
from openvino.tools.mo.middle.ApplyNHWCtoNCHWpermutation import ApplyNHWCtoNCHWpermutation
|
||||
from openvino.tools.mo.middle.InsertLayoutPropagationTransposes import InsertLayoutPropagationTranspose
|
||||
from openvino.tools.mo.middle.MarkSubgraphsWithCorrectLayout import MarkSubGraphsWithCorrectLayout
|
||||
nodes = {
|
||||
**regular_op_with_shaped_data('input', int64_array(inp), {'op': 'Parameter', 'type': 'Parameter',
|
||||
# need to specify shape in 2 places
|
||||
@@ -1598,12 +1601,13 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
**valued_const_with_data('begin', int64_array(begin)),
|
||||
**valued_const_with_data('end', int64_array(end)),
|
||||
**valued_const_with_data('strides', int64_array(strides)),
|
||||
**regular_op_with_empty_data('strided_slice', {'op': 'StridedSlice', 'type': 'StridedSlice', # need for permute
|
||||
'begin_mask': begin_mask, 'end_mask': end_mask,
|
||||
'shrink_axis_mask': shrink_axis_mask,
|
||||
'new_axis_mask': new_axis_mask,
|
||||
'ellipsis_mask': ellipsis_mask,
|
||||
'infer': StridedSlice.infer}),
|
||||
**regular_op_with_empty_data('strided_slice',
|
||||
{'op': 'StridedSlice', 'type': 'StridedSlice', # need for permute
|
||||
'begin_mask': begin_mask, 'end_mask': end_mask,
|
||||
'shrink_axis_mask': shrink_axis_mask,
|
||||
'new_axis_mask': new_axis_mask,
|
||||
'ellipsis_mask': ellipsis_mask,
|
||||
'infer': StridedSlice.infer}),
|
||||
**regular_op('res', {'kind': 'op', 'type': 'Result', 'op': 'Result', 'infer': lambda x: None})
|
||||
}
|
||||
|
||||
@@ -1614,6 +1618,8 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
graph = partial_infer(graph)
|
||||
StridedSliceNormalizer().find_and_replace_pattern(graph)
|
||||
graph = partial_infer(graph)
|
||||
MarkSubGraphsWithCorrectLayout().find_and_replace_pattern(graph)
|
||||
InsertLayoutPropagationTranspose().find_and_replace_pattern(graph)
|
||||
ApplyNHWCtoNCHWpermutation().find_and_replace_pattern(graph)
|
||||
MergeNodesPermutations().find_and_replace_pattern(graph)
|
||||
ApplyPermutation().find_and_replace_pattern(graph)
|
||||
@@ -1625,8 +1631,8 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_permute_1(
|
||||
self, # inp[0, :34, 20, :2]
|
||||
inp=(1, 35, 35, 3), ref_res=(2, 34),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1),
|
||||
inp=(1, 35, 35, 3), ref_res=(34, 2),
|
||||
begin=(0, 0, 20, 0), end=(1, 34, 21, 2), strides=(1, 1, 1, 1),
|
||||
begin_mask=(0,), end_mask=(0,),
|
||||
shrink_axis_mask=(1, 0, 1, 0), new_axis_mask=(0,),
|
||||
ellipsis_mask=(0,)
|
||||
@@ -1644,7 +1650,7 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_permute_3(
|
||||
self, # inp[1:34, 0, :, :2]
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 2, 35),
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 35, 2),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 0, 2), strides=(1, 1, 1, 1), begin_mask=(1, 1, 0, 0), end_mask=(1, 0, 0, 1),
|
||||
shrink_axis_mask=(0, 1, 0, 0), new_axis_mask=(0, 0, 0, 0), ellipsis_mask=(0, 0, 0, 0)
|
||||
):
|
||||
@@ -1652,10 +1658,12 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
begin_mask, end_mask, shrink_axis_mask, new_axis_mask, ellipsis_mask)
|
||||
|
||||
def test_strided_slice_permute_4(
|
||||
self, # inp[1:34, :, :, :2] begin mask is (1,) so only one value can be specified
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 2, 35),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(1, 0, 0, ), end_mask=(1, 0, 0, 1),
|
||||
shrink_axis_mask=(0, 1), new_axis_mask=(0,), ellipsis_mask=(0,)
|
||||
# no shrink/new axis therefore will be permuted
|
||||
# inp[0:1, :, :, :2] begin mask is (1,) so only one begin value need to be specified
|
||||
self,
|
||||
inp=(16, 35, 35, 3), ref_res=(1, 2, 35, 35),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(1, 0, 0,), end_mask=(1, 0, 0, 1),
|
||||
shrink_axis_mask=(0,), new_axis_mask=(0,), ellipsis_mask=(0,)
|
||||
):
|
||||
self.run_permute_test(inp, ref_res, begin, end, strides,
|
||||
begin_mask, end_mask, shrink_axis_mask, new_axis_mask, ellipsis_mask)
|
||||
@@ -1663,7 +1671,8 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
def test_strided_slice_permute_5(
|
||||
self, # inp[:, :, :, :] since all begin and end masks are zero
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 3, 35, 35),
|
||||
begin=(1, 10, 10, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(0, 0, 0, 0), end_mask=(0, 0, 0, 0),
|
||||
begin=(1, 10, 10, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(0, 0, 0, 0),
|
||||
end_mask=(0, 0, 0, 0),
|
||||
shrink_axis_mask=(0,), new_axis_mask=(0,), ellipsis_mask=(0,)
|
||||
):
|
||||
self.run_permute_test(inp, ref_res, begin, end, strides,
|
||||
@@ -1671,7 +1680,7 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_permute_6(
|
||||
self, # inp[0]
|
||||
inp=(1, 35, 35, 3), ref_res=(3, 35, 35),
|
||||
inp=(1, 35, 35, 3), ref_res=(35, 35, 3),
|
||||
begin=(0,), end=(1,), strides=(1,), begin_mask=(1,), end_mask=(0,),
|
||||
shrink_axis_mask=(1,), new_axis_mask=(0,), ellipsis_mask=(0,)
|
||||
):
|
||||
@@ -1680,7 +1689,7 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_permute_7(
|
||||
self, # inp[0, 20], ends can be of any value
|
||||
inp=(1, 35, 35, 3), ref_res=(3, 35),
|
||||
inp=(1, 35, 35, 3), ref_res=(35, 3),
|
||||
begin=(0, 20), end=(1, 9999), strides=(1, 1), begin_mask=(0,), end_mask=(0,),
|
||||
shrink_axis_mask=(1, 1), new_axis_mask=(0,), ellipsis_mask=(0,)
|
||||
):
|
||||
@@ -1689,7 +1698,7 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_permute_8(
|
||||
self, # inp[0, 0:34, 20:22, new_axis], both new_axis and shrink_axis are present
|
||||
inp=(1, 35, 35, 3), ref_res=(3, 34, 2, 1),
|
||||
inp=(1, 35, 35, 3), ref_res=(34, 2, 1, 3),
|
||||
begin=(0, 0, 20, 0), end=(1, 34, 22, 2), strides=(1, 1, 1, 1), begin_mask=(0,), end_mask=(0,),
|
||||
shrink_axis_mask=(1,), new_axis_mask=(0, 0, 0, 1), ellipsis_mask=(0,)
|
||||
):
|
||||
@@ -1698,7 +1707,7 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_permute_9(
|
||||
self, # inp[:, 0:4, 20, new_axis], both new_axis and shrink_axis are present
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 3, 4, 1),
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 4, 1, 3),
|
||||
begin=(0, 0, 20, 0), end=(0, 4, 0, 0), strides=(1, 1, 1, 1), begin_mask=(0, 1, 0, 0), end_mask=(0, 1, 0, 0),
|
||||
shrink_axis_mask=(0, 0, 1, 0), new_axis_mask=(0, 0, 0, 1), ellipsis_mask=(0,)
|
||||
):
|
||||
@@ -1707,7 +1716,7 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_permute_10(
|
||||
self, # inp[:, 0:4, new_axis, 20], both new_axis and shrink_axis are present
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 3, 4, 1),
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 4, 1, 3),
|
||||
begin=(0, 0, 0, 20), end=(0, 4, 0, 0), strides=(1, 1, 1, 1), begin_mask=(0, 1, 0, 0), end_mask=(0, 1, 0, 0),
|
||||
shrink_axis_mask=(0, 0, 0, 1), new_axis_mask=(0, 0, 1, 0), ellipsis_mask=(0,)
|
||||
):
|
||||
@@ -1715,9 +1724,9 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
begin_mask, end_mask, shrink_axis_mask, new_axis_mask, ellipsis_mask)
|
||||
|
||||
def test_strided_slice_permute_11(
|
||||
self, # inp[0, :, 0:34, 20:22, new_axis], both new_axis and shrink_axis are present
|
||||
inp=(1, 35, 35, 3), ref_res=(1, 3, 34, 2),
|
||||
begin=(0, 0, 0, 20, 0), end=(1, 0, 34, 22, 0), strides=(1, 1, 1, 1, 1),
|
||||
self, # inp[0, :, 0:34, 1:3, new_axis], both new_axis and shrink_axis are present
|
||||
inp=(1, 35, 35, 3), ref_res=(35, 34, 2, 1),
|
||||
begin=(0, 0, 0, 1, 0), end=(1, 0, 34, 3, 0), strides=(1, 1, 1, 1, 1),
|
||||
begin_mask=(1, 0, 1, 1, 1), end_mask=(1, 0, 1, 1, 1),
|
||||
shrink_axis_mask=(1, 0, 0, 0), new_axis_mask=(0, 0, 0, 0, 1), ellipsis_mask=(0,)
|
||||
):
|
||||
@@ -1726,8 +1735,9 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_permute_12(
|
||||
self, # inp[0, :34, 20, :2]
|
||||
inp=(1, 35, 35, 3), ref_res=(2, 34),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(0, 1, 1, 1), end_mask=(0, 1, 1, 1),
|
||||
inp=(1, 35, 35, 3), ref_res=(34, 2),
|
||||
begin=(0, 0, 0, 0), end=(1, 34, 20, 2), strides=(1, 1, 1, 1), begin_mask=(0, 1, 1, 1),
|
||||
end_mask=(0, 1, 1, 1),
|
||||
shrink_axis_mask=(1, 0, 1, 0), new_axis_mask=(0,), ellipsis_mask=(0,)
|
||||
):
|
||||
self.run_permute_test(inp, ref_res, begin, end, strides,
|
||||
@@ -1751,10 +1761,10 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
self.run_permute_test(inp, ref_res, begin, end, strides,
|
||||
begin_mask, end_mask, shrink_axis_mask, new_axis_mask, ellipsis_mask)
|
||||
|
||||
# with ellipsis
|
||||
# with ellipsis
|
||||
def test_strided_slice_permute_15(
|
||||
self, # inp[..., np.newaxis]
|
||||
inp=(1, 35, 35), ref_res=(1, 1, 35, 35),
|
||||
inp=(1, 35, 35), ref_res=(1, 35, 35, 1),
|
||||
begin=(101, 0), end=(0, 0), strides=(-1, -1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(0, 0), new_axis_mask=(0, 1), ellipsis_mask=(1, 0)
|
||||
):
|
||||
@@ -1763,7 +1773,7 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
|
||||
def test_strided_slice_permute_16(
|
||||
self, # inp_shape = (1, 720, 1080), out = inp[..., :100, None] => out_shape = (1, 720, 100, 1)
|
||||
inp=(1, 720, 1080), ref_res=(1, 1, 720, 100),
|
||||
inp=(1, 720, 1080), ref_res=(1, 720, 100, 1),
|
||||
begin=(0, 0, 0), end=(0, 100, 0), strides=(1, 1, 1), begin_mask=(0, 1, 0), end_mask=(0, 1, 0),
|
||||
shrink_axis_mask=(0,), new_axis_mask=(0, 0, 1), ellipsis_mask=(1,)
|
||||
):
|
||||
@@ -1813,11 +1823,10 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
def test_permute_auto_infer_strided_slice_2d_slice_over_4d_1(self):
|
||||
"""
|
||||
inp_shape = (1, 100, 200, 3) in NHWC, (1, 3, 100, 200) in NCHW,
|
||||
out_nhwc = inp[:, None],
|
||||
out_nchw = inp[:, :, None, :, :] => out_shape = (1, 3, 1, 100, 200)
|
||||
out_nhwc = inp[:, None] => out_shape = (1, 1, 100, 200, 3)
|
||||
"""
|
||||
self.run_permute_test(
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 3, 1, 100, 200),
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 1, 100, 200, 3),
|
||||
begin=(0, 0), end=(0, 0), strides=(1, 1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(0, 0), new_axis_mask=(0, 1), ellipsis_mask=(0, 0)
|
||||
)
|
||||
@@ -1825,11 +1834,10 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
def test_permute_auto_infer_strided_slice_2d_slice_over_4d_2(self):
|
||||
"""
|
||||
inp_shape = (1, 100, 200, 3) in NHWC, (1, 3, 100, 200) in NCHW,
|
||||
out_nhwc = inp[:, 0],
|
||||
out_nchw = inp[:, :, 0, :] => out_shape = (1, 3, 200)
|
||||
out_nhwc = inp[:, 0] => out_shape = (1, 200, 3)
|
||||
"""
|
||||
self.run_permute_test(
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 3, 200),
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 200, 3),
|
||||
begin=(0, 0), end=(0, 0), strides=(1, 1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(0, 1), new_axis_mask=(0, 0), ellipsis_mask=(0, 0)
|
||||
)
|
||||
@@ -1849,11 +1857,10 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
def test_permute_auto_infer_strided_slice_2d_slice_over_4d_4(self):
|
||||
"""
|
||||
inp_shape = (1, 100, 200, 3) in NHWC, (1, 3, 100, 200) in NCHW,
|
||||
out_nhwc = inp[..., None],
|
||||
out_nchw = inp[:, None, :, :, ...] => out_shape = (1, 1, 3, 100, 200)
|
||||
out_nhwc = inp[..., None] => out_shape = (1, 100, 200, 3, 1)
|
||||
"""
|
||||
self.run_permute_test(
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 1, 3, 100, 200),
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 100, 200, 3, 1),
|
||||
begin=(0, 0), end=(0, 0), strides=(1, 1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(0, 0), new_axis_mask=(0, 1), ellipsis_mask=(1, 0)
|
||||
)
|
||||
@@ -1873,11 +1880,11 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
def test_permute_auto_infer_strided_slice_2d_slice_over_4d_6(self):
|
||||
"""
|
||||
inp_shape = (1, 100, 200, 3) in NHWC, (1, 3, 100, 200) in NCHW,
|
||||
out_nhwc = inp[None, :],
|
||||
out_nchw = inp[None, :, :, :, :] => out_shape = (1, 1, 3, 100, 200)
|
||||
out_nhwc = inp[None, :] => out_shape = (1, 1, 100, 200, 3)
|
||||
out_nchw = inp[None, :, :, :, :] => out_shape = (1, 1, 100, 200, 3)
|
||||
"""
|
||||
self.run_permute_test(
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 1, 3, 100, 200),
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 1, 100, 200, 3),
|
||||
begin=(0, 0), end=(0, 0), strides=(1, 1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(0, 0), new_axis_mask=(1, 0), ellipsis_mask=(0, 0)
|
||||
)
|
||||
@@ -1885,11 +1892,10 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
def test_permute_auto_infer_strided_slice_2d_slice_over_4d_7(self):
|
||||
"""
|
||||
inp_shape = (1, 100, 200, 3) in NHWC, (1, 3, 100, 200) in NCHW,
|
||||
out_nhwc = inp[None, None],
|
||||
out_nchw = inp[None, :, None, :, :, :] => out_shape = (1, 1, 1, 3, 100, 200)
|
||||
out_nhwc = inp[None, None] => out_shape = (1, 1, 1, 100, 200, 3)
|
||||
"""
|
||||
self.run_permute_test(
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 1, 1, 3, 100, 200),
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 1, 1, 100, 200, 3),
|
||||
begin=(0, 0), end=(0, 0), strides=(1, 1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(0, 0), new_axis_mask=(1, 1), ellipsis_mask=(0, 0)
|
||||
)
|
||||
@@ -1897,47 +1903,43 @@ class TestStridedSlicePermute(unittest.TestCase):
|
||||
def test_permute_auto_infer_strided_slice_2d_slice_over_4d_8(self):
|
||||
"""
|
||||
inp_shape = (1, 100, 200, 3) in NHWC, (1, 3, 100, 200) in NCHW,
|
||||
out_nhwc = inp[None, 0],
|
||||
out_nchw = inp[None, :, 0, :, :] => out_shape = (1, 1, 100, 200)
|
||||
out_nhwc = inp[None, 0] => out_shape = (1, 100, 200, 3)
|
||||
"""
|
||||
self.run_permute_test(
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 1, 100, 200),
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 100, 200, 3),
|
||||
begin=(0, 0), end=(0, 0), strides=(1, 1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(0, 1), new_axis_mask=(1, 0), ellipsis_mask=(0, 0)
|
||||
)
|
||||
|
||||
def test_permute_auto_infer_strided_slice_2d_slice_over_4d_9(self):
|
||||
"""
|
||||
inp_shape = (1, 100, 200, 3) in NHWC, (1, 3, 100, 200) in NCHW,
|
||||
out_nhwc = inp[0, :],
|
||||
out_nchw = inp[0, :, :, :] => out_shape = (3, 100, 200)
|
||||
inp_shape = (1, 100, 200, 3) in NHWC
|
||||
out_nhwc = inp[0, :] => out_shape = (100, 200, 3)
|
||||
"""
|
||||
self.run_permute_test(
|
||||
inp=(1, 100, 200, 3), ref_res=(3, 100, 200),
|
||||
inp=(1, 100, 200, 3), ref_res=(100, 200, 3),
|
||||
begin=(0, 0), end=(0, 0), strides=(1, 1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(1, 0), new_axis_mask=(0, 0), ellipsis_mask=(0, 0)
|
||||
)
|
||||
|
||||
def test_permute_auto_infer_strided_slice_2d_slice_over_4d_10(self):
|
||||
"""
|
||||
inp_shape = (1, 100, 200, 3) in NHWC, (1, 3, 100, 200) in NCHW,
|
||||
out_nhwc = inp[0, None],
|
||||
out_nchw = inp[0, :, None, :, :] => out_shape = (3, 1, 100, 200)
|
||||
inp_shape = (1, 100, 200, 3) in NHWC
|
||||
out_nhwc = inp[0, None] => out_shape = (1, 100, 200, 3)
|
||||
"""
|
||||
self.run_permute_test(
|
||||
inp=(1, 100, 200, 3), ref_res=(3, 1, 100, 200),
|
||||
inp=(1, 100, 200, 3), ref_res=(1, 100, 200, 3),
|
||||
begin=(0, 0), end=(0, 0), strides=(1, 1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(1, 0), new_axis_mask=(0, 1), ellipsis_mask=(0, 0)
|
||||
)
|
||||
|
||||
def test_permute_auto_infer_strided_slice_2d_slice_over_4d_11(self):
|
||||
"""
|
||||
inp_shape = (1, 100, 200, 3) in NHWC, (1, 3, 100, 200) in NCHW,
|
||||
out_nhwc = inp[0, 0],
|
||||
out_nchw = inp[0, :, 0, :] => out_shape = (3, 200)
|
||||
inp_shape = (1, 100, 200, 3) in NHWC
|
||||
out_nhwc = inp[0, 0] => out_shape = (200, 3)
|
||||
"""
|
||||
self.run_permute_test(
|
||||
inp=(1, 100, 200, 3), ref_res=(3, 200),
|
||||
inp=(1, 100, 200, 3), ref_res=(200, 3),
|
||||
begin=(0, 0), end=(0, 0), strides=(1, 1), begin_mask=(0, 0), end_mask=(0, 0),
|
||||
shrink_axis_mask=(1, 1), new_axis_mask=(0, 0), ellipsis_mask=(0, 0)
|
||||
)
|
||||
@@ -1,108 +0,0 @@
|
||||
# Copyright (C) 2018-2022 Intel Corporation
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
import unittest
|
||||
|
||||
from openvino.tools.mo.middle.StridedSliceReplacer import ReplaceStridedSliceWithSqueezeUnsqueeze
|
||||
from openvino.tools.mo.utils.ir_engine.compare_graphs import compare_graphs
|
||||
from unit_tests.utils.graph import regular_op_with_shaped_data, regular_op_with_empty_data, shaped_const_with_data, \
|
||||
result, connect, build_graph
|
||||
|
||||
nodes = {
|
||||
**regular_op_with_shaped_data('input', [1, 3, 5, 5], {'type': 'Parameter', 'op': 'Parameter'}),
|
||||
**regular_op_with_empty_data('strided_slice', {'type': 'StridedSlice', 'op': 'StridedSlice',
|
||||
'begin_mask': [0, 0, 0, 0], 'end_mask': [0, 0, 0, 0]}),
|
||||
**shaped_const_with_data('begin', [4]),
|
||||
**shaped_const_with_data('end', [4]),
|
||||
**result('result'),
|
||||
|
||||
**regular_op_with_empty_data('squeeze', {'type': 'Squeeze', 'op': 'Squeeze'}),
|
||||
**shaped_const_with_data('squeeze_axes', None),
|
||||
|
||||
**regular_op_with_empty_data('unsqueeze', {'type': 'Unsqueeze', 'op': 'Unsqueeze'}),
|
||||
**shaped_const_with_data('unsqueeze_axes', None)
|
||||
}
|
||||
|
||||
pattern_edges = [
|
||||
*connect('input', '0:strided_slice'),
|
||||
*connect('begin', '1:strided_slice'),
|
||||
*connect('end', '2:strided_slice'),
|
||||
*connect('strided_slice', 'result')
|
||||
]
|
||||
|
||||
|
||||
class TestStridedSliceReplacer(unittest.TestCase):
|
||||
|
||||
def test_negative_different_input_and_output_shapes(self):
|
||||
graph = build_graph(
|
||||
nodes_attrs=nodes,
|
||||
edges=pattern_edges,
|
||||
update_attributes={
|
||||
'strided_slice_d': {'shape': [1, 3, 3, 3]}
|
||||
},
|
||||
nodes_with_edges_only=True
|
||||
)
|
||||
|
||||
ref_graph = graph.copy()
|
||||
|
||||
ReplaceStridedSliceWithSqueezeUnsqueeze().find_and_replace_pattern(graph)
|
||||
(flag, resp) = compare_graphs(graph, ref_graph, 'result', check_op_attrs=True)
|
||||
self.assertTrue(flag, resp)
|
||||
|
||||
def test_replace_with_squeeze(self):
|
||||
graph = build_graph(
|
||||
nodes_attrs=nodes,
|
||||
edges=pattern_edges,
|
||||
update_attributes={
|
||||
'strided_slice': {'shrink_axis_mask': [1, 0, 0, 0], 'new_axis_mask': [0, 0, 0, 0]},
|
||||
'strided_slice_d': {'shape': [3, 5, 5]}
|
||||
},
|
||||
nodes_with_edges_only=True
|
||||
)
|
||||
|
||||
ref_graph = build_graph(
|
||||
nodes_attrs=nodes,
|
||||
edges=[
|
||||
*connect('input', '0:squeeze'),
|
||||
*connect('squeeze_axes', '1:squeeze'),
|
||||
*connect('squeeze', 'result')
|
||||
],
|
||||
update_attributes={
|
||||
'squeeze_axes_d': {'value': [0]},
|
||||
'squeeze_d': {'shape': [3, 5, 5]}
|
||||
},
|
||||
nodes_with_edges_only=True
|
||||
)
|
||||
|
||||
ReplaceStridedSliceWithSqueezeUnsqueeze().find_and_replace_pattern(graph)
|
||||
(flag, resp) = compare_graphs(graph, ref_graph, 'result', check_op_attrs=True)
|
||||
self.assertTrue(flag, resp)
|
||||
|
||||
def test_replace_with_unsqueeze(self):
|
||||
graph = build_graph(
|
||||
nodes_attrs=nodes,
|
||||
edges=pattern_edges,
|
||||
update_attributes={
|
||||
'strided_slice': {'shrink_axis_mask': [0, 0, 0, 0], 'new_axis_mask': [1, 0, 0, 0]},
|
||||
'strided_slice_d': {'shape': [1, 1, 3, 5, 5]}
|
||||
},
|
||||
nodes_with_edges_only=True
|
||||
)
|
||||
|
||||
ref_graph = build_graph(
|
||||
nodes_attrs=nodes,
|
||||
edges=[
|
||||
*connect('input', '0:unsqueeze'),
|
||||
*connect('unsqueeze_axes', '1:unsqueeze'),
|
||||
*connect('unsqueeze', 'result')
|
||||
],
|
||||
update_attributes={
|
||||
'unsqueeze_axes_d': {'value': [0]},
|
||||
'unsqueeze_d': {'shape': [1, 1, 3, 5, 5]}
|
||||
},
|
||||
nodes_with_edges_only=True
|
||||
)
|
||||
|
||||
ReplaceStridedSliceWithSqueezeUnsqueeze().find_and_replace_pattern(graph)
|
||||
(flag, resp) = compare_graphs(graph, ref_graph, 'result', check_op_attrs=True)
|
||||
self.assertTrue(flag, resp)
|
||||
Reference in new issue
Block a user