* Refactored infer function and function supported_attrs for the layer Interpolate. * Small change. * Deleted unneeded checks in transformations ResizeToInterpolate2D and ResizeToInterpolate3D. * Small fix in the extractor of ONNX Resize. * Now the extractor of TF ResizeBilinear generates Interpolate-1 again, because 'axis' in final version of Interpolate-4 specification is an input but is not attribute. * Now the extractor of TF ResizeNearest generates Interpolate-1 again, because 'axis' in final version of Interpolate-4 specification is an input but is not attribute. * Added static method get_axis into class Interpolate. * Refactored class CanBeFused in the transformation InterpolateSequenceToInterpolate. * Fixed transformation InterpolateSequenceToInterpolate according to the last version of the specification of Interpolate-4. * Started to write support of Interpolate-4 in the transformation InterpolateWithConcat. * Added support for Interpolate-4 into the transformation InterpolateWithConcat. * Added support for Interpolate-4 into the transformation InterpolateConcat. * Added support for Interpolate-4 into the transformation InterpolateReshapeWA. * Added support for Interpolate-4 into the transformation InterpolateTranspose. * Started to add test for opset4 case of the transformation InterpolateSequenceToInterpolate. * Added test for InterpolateSequenceToInterpolate (test_2d_interpolate_sequence_1_opset4_case). * Added test for InterpolateSequenceToInterpolate (test_2d_interpolate_sequence_4_opset4_case). * Added another test for InterpolateSequenceToInterpolate (test_2d_interpolate_sequence_5_opset4_case). * Added another test for InterpolateSequenceToInterpolate (test_3d_interpolate_sequence_1_opset4_case). * Finished addition of tests for opset4 case of InterpolateSequenceToInterpolate. * Small change. * Now opset is only opset1 or opset4 in the transformation InterpolateTranspose. * Small fixes in transformations ResizeToInterpolate2D and ResizeToInterpolate3D. * Deleted reading of unused ONNX attributes. * Fixed docstring of the transformation InterpolateV1ToInterpolateV4. * Added node name in assert about axes input. * Fixes in the definition of the operation ONNXResize11. * Now Interpolate-4 cannot have 'extension' as opset. * Now the transformation InterpolateV1ToInterpolateV4 uses find_and_replace_pattern but not replace_sub_graph. * Fixed tests for transformations InterpolateReshapeWA and InterpolateConcat. * Fixed some tests. * Rewritten operation Interpolate-4 class according to new variant of documentation. * Some fixes in ONNXResize11 operation class. * Now the transformation ONNXResize11ToInterpolate generates Interpolate-4 with 4 inputs. * Now the transformation UpsampleToResample generates Interpolate-4 with 4 inputs. * Now the transformation NearestNeighborUpsampling generates Interpolate-4 with 4 inputs. * Now transformations ResizeToInterpolate2D and ResizeToInterpolate3D generate Interpolate-4 with 4 inputs. * Now the transformation SplitConcatPairToInterpolate generates Interpolate-4 with 4 inputs. * Now the transformation UnsqueezeTileReshapeBlockToInterpolate generates Interpolate-4 with 4 inputs. * Now the transformation InterpolateV1ToInterpolateV4 generates Interpolate-4 with 4 inputs. * Some fixes. * Fixed the transformation InterpolateSequenceToInterpolate according to new variant of Interpolate-4 specification. * Fixed typos. * Added shape_calculation_mode to supported_attrs. * Small fixes. * Added operation ONNXResize10 and the transformation ONNXResize10ToInterpolate4. * Fixed function correct_scales_using_dst_shape. * Some fixes in InterpolateSequenceToInterpolate. * Fixed bug in the method __call__ of the class CanBeFused: now self.accumulated_axes is correctly cleared in all cases. * Small change. * Fixed tests for the transformation SplitConcatPairToInterpolate. * Now transformations InterpolateWithConcat, InterpolateReshapeWA, InterpolateConcat support Interpolate-4. * Fixed the transformation InterpolateTranspose for the case of Interpolate-4. * Written the back transformation InterpolateV4AxesCorrection to convert 'axes' input of Interpolate-4 from NHWC to NCHW layout. * Added PermuteInput in Interpolate-4 infer. * Fixed typos. * Deleted the transformation InterpolateAxesCorrection. * Now Interpolate-4 permutes axis, not shape in input port 3. * Small fix. * Some fix. * Fixed bug in the transformation UpsampleToResample. * Added some debug prints. * Added more debug prints. * Now ONNX Upsample-9 operation is read as ONNXResize10. * Small fix. * Small fixes. * Fixed tests for the transformation SplitConcatPairToInterpolate. * Deleted debug prints. * Deleted some debug prints. * Fixes in the transformation UnsqueezeTileReshapeBlockToInterpolate and its tests. * Small fix in the transformation InterpolateSequenceToInterpolate. * Started to write nGraph transformation to convert Interpolate-1 to Interpolate-4. * Deleted redundant files. * Small fixes. * Small fix. * Written draft of the transformation Interpolate-1 -> Interpolate-4. * Small fix. * Now ONNX Importer reads Resize-10 as Interpolate-4. * Fixes in the test onnx_model_resize10_import_only. * Small fix in the test for the conversion Interpolate-1 -> Interpolate-4. * Small fixes. * Fixed NGraphReaderTests for Interpolate. * Some fixes. * Deleted class for Resample operation. * Fix in the transformation NearestNeighborUpsampling: fixed precision of the input 'scales' of generated Interpolate-4. * Fixed typo. * Now the TF operations ResizeBilinear is readed as internal MO operation TFResizeBilinear. This internal operation is converted into Interpolate-4. * Small fix in BOM-file. * Added checks of existence of attributes of TF ResizeBilinear operation. * Small fixes in the conversion of the internal MO operation TFResizeBilinear to Interpolate-4. * Small fixes. * Small fixes. * Now the transformation ONNXResize10ToInterpolateV4 calculates sizes input as input_shape * (scales + epsilon). * Added the internal MO operation TFResizeNearestNeighbor. * Fixes in the transformation SplitConcatPairToInterpolate and its tests. * Fixes in the transformation UnsqueezeTileReshapeBlockToInterpolate and its tests. * Written the transformation that converts the internal operation TFResizeNearestNeighbor into Interpolate-4. * Now MO reads the TF operation ResizeNearestNeighbor as the internal MO operation TFResizeNearestNeighbor. * Small fix. * Now the specification of Interpolate-4 clarifies that the mode linear_onnx supports only 2D or 4D input tensors. * Small fix. * Some fixes. * Moved the transformation ONNXResize10ToInterpolateV4 to the front stage. * Deleted infer function and function supported_attrs for ONNXResize10 operation. * Deleted supported_attrs() for TFResizeBilinear and TFResizeNearestNeighbor. * Some fixes. * Fixes in the shape infer function of the nGraph operation Interpolate-4. Now 'axes' input can be non-constant. In the such case, all elements of the output shape are Dimension::dynamic(). * Deleted corner cases processing in transformations TFResizeBilinearToInterpolateV4 and TFResizeNearestNeighborToInterpolateV4. * Rewritten the function replace_resize_bilinear. * Written inner MO operation TFResize that covers TF operations ResizeBilinear and ResizeNearestNeighbor. * Now TF operations ResizeBilinear and ResizeNearestNeighbor are read as an internal operation TFResize in MO. Transformations TFResizeNearestNeighborToInterpolateV4 and TFResizeBilinearToInterpolateV4 are fused into one transformation TFResizeToInterpolateV4. * Some changes in the shape infer function of nGraph op Interpolate-4. * Small fix. * Some changes. * The transformation TFResizeToInterpolateV4 is moved to the front stage. * Deleted redundant assert. * Deleted transformations ResizeToInterpolate2D and ResizeToInterpolate3D. * Some renaming. * Small change. * Deleted .copy() in the shape infer function of the internal operation TFResize. * Small fix. * Small fixes. * Added comment about the case when the input 'axes' of Interpolate-4 is non-constant. * Written test for Interpolate-4 shape infer, for the case when the input 'axes' is non-constant and shape_calculation_mode = scales. * Some fixes. * Small fixes. * Small fix. * Added yet another test for the case of non-constant 'axes' input of Interpolate-4 (when shape_calculation_mode = sizes). * Added some comment. * Small fix. * Reverted changes for InterpolateWithConcat. * Added type checks for all inputs of nGraph operation Interpolate-4. * Added u32 and u64 to supported element types of sizes and axes inputs of nGraph operation Interpolate-4. * Fixed some functional tests. * Some changes. * Added helper function float32_array. * Now the MO transformation InterpolateV1ToInterpolate preserves names of layers. * Small fix. * Small fix. * Reverted some change. * Small fixes. * Small fix. * Small fix. * Small fix. * Small fix. * Reverted changes in the nGraph reader tests for Interpolate-1. * Some revert. * Fixed some copyright year.
282 lines
17 KiB
Python
282 lines
17 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 unittest
|
|
|
|
import numpy as np
|
|
from generator import generator, generate
|
|
|
|
from extensions.ops.interpolate import Interpolate
|
|
from mo.front.common.partial_infer.utils import int64_array
|
|
from mo.graph.graph import Node
|
|
from mo.utils.unittest.graph import build_graph
|
|
|
|
|
|
graph_node_attrs_without_axes = {
|
|
'input': {'type': 'Parameter', 'kind': 'op'},
|
|
'input_data': {'kind': 'data', 'shape': None, 'value': None},
|
|
'sizes': {'type': 'Const', 'kind': 'op', 'shape': None, 'value': None},
|
|
'sizes_data': {'kind': 'data', 'shape': None, 'value': None},
|
|
'scales': {'type': 'Const', 'kind': 'op', 'shape': None, 'value': None},
|
|
'scales_data': {'kind': 'data', 'shape': None, 'value': None},
|
|
'interpolate': {
|
|
'type': 'Interpolate', 'kind': 'op', 'mode': 'nearest', 'shape_calculation_mode': 'sizes',
|
|
'coordinate_transformation_mode': 'half_pixel', 'version': 'opset4',
|
|
'nearest_mode': 'round_prefer_floor', 'antialias': 0,
|
|
},
|
|
'interpolate_data': {'kind': 'data', 'value': None, 'shape': None},
|
|
'op_output': {'kind': 'op', 'op': 'Result'},
|
|
}
|
|
|
|
graph_edges_without_axes = [
|
|
('input', 'input_data'),
|
|
('sizes', 'sizes_data'),
|
|
('scales', 'scales_data'),
|
|
('input_data', 'interpolate', {'in': 0}),
|
|
('sizes_data', 'interpolate', {'in': 1}),
|
|
('scales_data', 'interpolate', {'in': 2}),
|
|
('interpolate', 'interpolate_data'),
|
|
('interpolate_data', 'op_output'),
|
|
]
|
|
|
|
|
|
graph_nodes_attrs = {
|
|
'input': {'type': 'Parameter', 'kind': 'op'},
|
|
'input_data': {'kind': 'data', 'shape': None, 'value': None},
|
|
'sizes': {'type': 'Const', 'kind': 'op', 'shape': None, 'value': None},
|
|
'sizes_data': {'kind': 'data', 'shape': None, 'value': None},
|
|
'scales': {'type': 'Const', 'kind': 'op', 'shape': None, 'value': None},
|
|
'scales_data': {'kind': 'data', 'shape': None, 'value': None},
|
|
'axes': {'type': 'Const', 'kind': 'op', 'shape': None, 'value': None},
|
|
'axes_data': {'kind': 'data', 'shape': None, 'value': None},
|
|
'interpolate': {
|
|
'type': 'Interpolate', 'kind': 'op', 'mode': 'nearest', 'shape_calculation_mode': 'sizes',
|
|
'coordinate_transformation_mode': 'half_pixel', 'version': 'opset4',
|
|
'nearest_mode': 'round_prefer_floor', 'antialias': 0,
|
|
},
|
|
'interpolate_data': {'kind': 'data', 'value': None, 'shape': None},
|
|
'op_output': {'kind': 'op', 'op': 'Result'},
|
|
}
|
|
|
|
graph_edges = [
|
|
('input', 'input_data'),
|
|
('sizes', 'sizes_data'),
|
|
('scales', 'scales_data'),
|
|
('axes', 'axes_data'),
|
|
('input_data', 'interpolate', {'in': 0}),
|
|
('sizes_data', 'interpolate', {'in': 1}),
|
|
('scales_data', 'interpolate', {'in': 2}),
|
|
('axes_data', 'interpolate', {'in': 3}),
|
|
('interpolate', 'interpolate_data'),
|
|
('interpolate_data', 'op_output'),
|
|
]
|
|
|
|
|
|
@generator
|
|
class TestInterpolateOp(unittest.TestCase):
|
|
@generate(*[([0], [0], [1, 3, 100, 200], [1, 3, 350, 150], [350, 150], [3.5, 150 / 200], [2, 3]),
|
|
([0, 3, 10, 10], [0], [16, 7, 190, 400], [8, 10, 390, 600],
|
|
[8, 390, 600], [0.5, 390 / 200, 600 / 410], [0, 2, 3]),
|
|
([10, 5, 0, 10], [0, 4, 16, 18], [4, 33, 1024, 8000], [56, 42, 520, 8028],
|
|
[56, 520], [4.0, 0.5], [0, 2]),
|
|
([0], [0], [1, 16, 85, 470, 690], [20, 16, 40, 470, 1380],
|
|
[20, 40, 1380], [20.0, 40.0 / 85.0, 1380.0 / 690.0], [0, 2, 4]),
|
|
([4, 3, 11, 22, 5], [1, 3, 4, 8, 5], [1, 16, 85, 470, 690], [60, 22, 430, 500, 345],
|
|
[60, 430, 345], [10.0, 4.3, 345.0 / 700.0], [0, 2, 4]),
|
|
([0], [0], [5, 77, 444, 88, 6050], [100, 308, 4440, 44, 6050],
|
|
[100, 308, 4440, 44], [20.0, 4.0, 10.0, 0.5], [0, 1, 2, 3]),
|
|
([0], [0], [1, 100, 200], [1, 350, 150], [350, 150], [3.5, 150 / 200], [1, 2]),
|
|
([0, 3, 10], [0], [16, 7, 190], [8, 10, 390], [8, 390], [0.5, 390 / 200], [0, 2]),
|
|
([10, 0, 10], [0, 16, 18], [4, 1024, 8000], [56, 520, 8028], [56, 520], [4.0, 0.5], [0, 1]),
|
|
([0], [0], [1, 690], [20, 1380], [20, 1380], [20.0, 1380.0 / 690.0], [0, 1]),
|
|
([4, 3, 11, 22, 5, 0], [1, 3, 4, 8, 5, 0], [1, 16, 85, 470, 690, 349], [60, 22, 430, 500, 345, 349],
|
|
[60, 430, 345], [10.0, 4.3, 345.0 / 700.0], [0, 2, 4])
|
|
])
|
|
def test_interpolate4_using_sizes(self, pads_begin, pads_end, input_shape, output_shape, sizes, scales, axes):
|
|
graph = build_graph(nodes_attrs=graph_nodes_attrs,
|
|
edges=graph_edges,
|
|
update_attributes={
|
|
'input_data': {'shape': input_shape},
|
|
'sizes': {'shape': int64_array(sizes).shape, 'value': int64_array(sizes)},
|
|
'sizes_data': {'shape': int64_array(sizes).shape, 'value': int64_array(sizes)},
|
|
'scales': {'shape': np.array(scales).shape, 'value': np.array(scales)},
|
|
'scales_data': {'shape': np.array(scales).shape, 'value': np.array(scales)},
|
|
'axes': {'shape': int64_array(axes).shape, 'value': int64_array(axes)},
|
|
'axes_data': {'shape': int64_array(axes).shape, 'value': int64_array(axes)},
|
|
'interpolate': {'pads_begin': int64_array(pads_begin),
|
|
'pads_end': int64_array(pads_end)}
|
|
})
|
|
|
|
node = Node(graph, 'interpolate')
|
|
tested_class = Interpolate(graph=graph, attrs=node.attrs())
|
|
tested_class.infer(node)
|
|
|
|
msg = "Interpolate-4 infer failed for case: sizes={}, scales={}, pads_begin={}, pads_end={}, axes={}," \
|
|
" expected_shape={}, actual_shape={}"
|
|
|
|
self.assertTrue(np.array_equal(graph.node['interpolate_data']['shape'], int64_array(output_shape)),
|
|
msg.format(sizes, scales, pads_begin, pads_end, axes, output_shape,
|
|
graph.node['interpolate_data']['shape']))
|
|
|
|
@generate(*[([0], [0], [1, 3, 100, 200], [1, 3, 350, 150], [350, 150], [3.5, 150 / 200], [2, 3]),
|
|
([0, 3, 10, 10], [0], [16, 7, 190, 400], [8, 10, 390, 600],
|
|
[8, 390, 600], [0.5, 390 / 200, 600 / 410], [0, 2, 3]),
|
|
([10, 5, 0, 10], [0, 4, 16, 18], [4, 33, 1024, 8000], [56, 42, 520, 8028],
|
|
[56, 520], [4.0, 0.5], [0, 2]),
|
|
([0], [0], [1, 16, 85, 470, 690], [20, 16, 40, 470, 1380],
|
|
[20, 40, 1380], [20.0, 40.0 / 85.0, 1380.0 / 690.0], [0, 2, 4]),
|
|
([4, 3, 11, 22, 5], [1, 3, 4, 8, 5], [1, 16, 85, 470, 690], [60, 22, 430, 500, 345],
|
|
[60, 430, 345], [10.0, 4.3, 345.0 / 700.0], [0, 2, 4]),
|
|
([0], [0], [5, 77, 444, 88, 6050], [100, 308, 4440, 44, 6050],
|
|
[100, 308, 4440, 44], [20.0, 4.0, 10.0, 0.5], [0, 1, 2, 3]),
|
|
([0], [0], [1, 100, 200], [1, 350, 150], [350, 150], [3.5, 150 / 200], [1, 2]),
|
|
([0, 3, 10], [0], [16, 7, 190], [8, 10, 390], [8, 390], [0.5, 390 / 200], [0, 2]),
|
|
([10, 0, 10], [0, 16, 18], [4, 1024, 8000], [56, 520, 8028], [56, 520], [4.0, 0.5], [0, 1]),
|
|
([0], [0], [1, 690], [20, 1380], [20, 1380], [20.0, 1380.0 / 690.0], [0, 1]),
|
|
([4, 3, 11, 22, 5, 0], [1, 3, 4, 8, 5, 0], [1, 16, 85, 470, 690, 349], [60, 22, 430, 500, 345, 349],
|
|
[60, 430, 345], [10.0, 4.3, 345.0 / 700.0], [0, 2, 4]),
|
|
([4, 3, 11, 22, 5, 0, 0], [1, 3, 4, 8, 5, 0, 0], [1, 16, 85, 470, 690, 349, 3],
|
|
[60, 22, 430, 500, 345, 349, 1],
|
|
[60, 430, 345, 1], [10.0, 4.3, 345.0 / 700.0, 1 / 3], [0, 2, 4, 6]),
|
|
([4, 3, 11, 22, 5, 0, 0], [1, 3, 4, 8, 5, 0, 0], [1, 16, 85, 470, 690, 349, 3],
|
|
[60, 22, 430, 500, 345, 349, 1],
|
|
[60, 430, 345, 1], [10.0, 4.3, 345.0 / 700.0, 0.3333333], [0, 2, 4, 6]),
|
|
])
|
|
def test_interpolate4_using_scales(self, pads_begin, pads_end, input_shape, output_shape, sizes, scales, axes):
|
|
graph = build_graph(nodes_attrs=graph_nodes_attrs,
|
|
edges=graph_edges,
|
|
update_attributes={
|
|
'input_data': {'shape': input_shape},
|
|
'sizes': {'shape': int64_array(sizes).shape, 'value': int64_array(sizes)},
|
|
'sizes_data': {'shape': int64_array(sizes).shape, 'value': int64_array(sizes)},
|
|
'scales': {'shape': np.array(scales).shape, 'value': np.array(scales)},
|
|
'scales_data': {'shape': np.array(scales).shape, 'value': np.array(scales)},
|
|
'axes': {'shape': int64_array(axes).shape, 'value': int64_array(axes)},
|
|
'axes_data': {'shape': int64_array(axes).shape, 'value': int64_array(axes)},
|
|
'interpolate': {'pads_begin': int64_array(pads_begin),
|
|
'pads_end': int64_array(pads_end),
|
|
'shape_calculation_mode': 'scales'}
|
|
})
|
|
|
|
node = Node(graph, 'interpolate')
|
|
tested_class = Interpolate(graph=graph, attrs=node.attrs())
|
|
tested_class.infer(node)
|
|
|
|
msg = "Interpolate-4 infer failed for case: sizes={}, scales={}, pads_begin={}, pads_end={}, axes={}," \
|
|
" expected_shape={}, actual_shape={}"
|
|
|
|
self.assertTrue(np.array_equal(graph.node['interpolate_data']['shape'], int64_array(output_shape)),
|
|
msg.format(sizes, scales, pads_begin, pads_end, axes, output_shape,
|
|
graph.node['interpolate_data']['shape']))
|
|
|
|
@generate(*[([0], [0], [1, 3, 100, 200], [1, 3, 350, 150], [1, 3, 350, 150], [1.0, 1.0, 3.5, 150 / 200]),
|
|
([0, 3, 10, 10], [0], [16, 7, 190, 400], [8, 10, 390, 600],
|
|
[8, 10, 390, 600], [0.5, 1.0, 390 / 200, 600 / 410]),
|
|
([10, 5, 0, 10], [0, 4, 16, 18], [4, 33, 1024, 8000], [56, 42, 520, 8028],
|
|
[56, 42, 520, 8028], [4.0, 1.0, 0.5, 1.0]),
|
|
([0], [0], [1, 16, 85, 470, 690], [20, 16, 40, 470, 1380],
|
|
[20, 16, 40, 470, 1380], [20.0, 1.0, 40.0 / 85.0, 1.0, 1380.0 / 690.0]),
|
|
([4, 3, 11, 22, 5], [1, 3, 4, 8, 5], [1, 16, 85, 470, 690], [60, 22, 430, 500, 345],
|
|
[60, 22, 430, 500, 345], [10.0, 1.0, 4.3, 1.0, 345.0 / 700.0]),
|
|
([0], [0], [5, 77, 444, 88, 6050], [100, 308, 4440, 44, 6050],
|
|
[100, 308, 4440, 44, 6050], [20.0, 4.0, 10.0, 0.5, 1.0]),
|
|
([0], [0], [1, 100, 200], [1, 350, 150], [1, 350, 150], [1.0, 3.5, 150 / 200]),
|
|
([0, 3, 10], [0], [16, 7, 190], [8, 10, 390], [8, 10, 390], [0.5, 1.0, 390 / 200]),
|
|
([10, 0, 10], [0, 16, 18], [4, 1024, 8000], [56, 520, 8028], [56, 520, 8028], [4.0, 0.5, 1.0]),
|
|
([0], [0], [1, 690], [20, 1380], [20, 1380], [20.0, 1380.0 / 690.0]),
|
|
([4, 3, 11, 22, 5, 0], [1, 3, 4, 8, 5, 0], [1, 16, 85, 470, 690, 349], [60, 22, 430, 500, 345, 349],
|
|
[60, 22, 430, 500, 345, 349], [10.0, 1.0, 4.3, 1.0, 345.0 / 700.0, 1.0]),
|
|
([4, 3, 11, 22, 5, 0, 0], [1, 3, 4, 8, 5, 0, 0], [1, 16, 85, 470, 690, 349, 3],
|
|
[60, 22, 430, 500, 345, 349, 1],
|
|
[60, 22, 430, 500, 345, 349, 1], [10.0, 1.0, 4.3, 1.0, 345.0 / 700.0, 1.0, 1 / 3]),
|
|
])
|
|
def test_interpolate4_using_sizes_without_axes(self, pads_begin, pads_end, input_shape, output_shape, sizes,
|
|
scales):
|
|
graph = build_graph(nodes_attrs=graph_node_attrs_without_axes,
|
|
edges=graph_edges_without_axes,
|
|
update_attributes={
|
|
'input_data': {'shape': input_shape},
|
|
'sizes': {'shape': int64_array(sizes).shape, 'value': int64_array(sizes)},
|
|
'sizes_data': {'shape': int64_array(sizes).shape, 'value': int64_array(sizes)},
|
|
'scales': {'shape': np.array(scales).shape, 'value': np.array(scales)},
|
|
'scales_data': {'shape': np.array(scales).shape, 'value': np.array(scales)},
|
|
'interpolate': {'pads_begin': int64_array(pads_begin),
|
|
'pads_end': int64_array(pads_end),
|
|
'shape_calculation_mode': 'sizes'}
|
|
})
|
|
|
|
node = Node(graph, 'interpolate')
|
|
tested_class = Interpolate(graph=graph, attrs=node.attrs())
|
|
tested_class.infer(node)
|
|
|
|
msg = "Interpolate-4 infer failed for case: sizes={}, scales={}, pads_begin={}, pads_end={}," \
|
|
" expected_shape={}, actual_shape={}"
|
|
|
|
self.assertTrue(np.array_equal(graph.node['interpolate_data']['shape'], int64_array(output_shape)),
|
|
msg.format(sizes, scales, pads_begin, pads_end, output_shape,
|
|
graph.node['interpolate_data']['shape']))
|
|
|
|
@generate(*[([0], [0], [1, 3, 100, 200], [1, 3, 350, 150], [1, 3, 350, 150], [1.0, 1.0, 3.5, 150 / 200]),
|
|
([0, 3, 10, 10], [0], [16, 7, 190, 400], [8, 10, 390, 600],
|
|
[8, 10, 390, 600], [0.5, 1.0, 390 / 200, 600 / 410]),
|
|
([10, 5, 0, 10], [0, 4, 16, 18], [4, 33, 1024, 8000], [56, 42, 520, 8028],
|
|
[56, 42, 520, 8028], [4.0, 1.0, 0.5, 1.0]),
|
|
([0], [0], [1, 16, 85, 470, 690], [20, 16, 40, 470, 1380],
|
|
[20, 16, 40, 470, 1380], [20.0, 1.0, 40.0 / 85.0, 1.0, 1380.0 / 690.0]),
|
|
([4, 3, 11, 22, 5], [1, 3, 4, 8, 5], [1, 16, 85, 470, 690], [60, 22, 430, 500, 345],
|
|
[60, 22, 430, 500, 345], [10.0, 1.0, 4.3, 1.0, 345.0 / 700.0]),
|
|
([0], [0], [5, 77, 444, 88, 6050], [100, 308, 4440, 44, 6050],
|
|
[100, 308, 4440, 44, 6050], [20.0, 4.0, 10.0, 0.5, 1.0]),
|
|
([0], [0], [1, 100, 200], [1, 350, 150], [1, 350, 150], [1.0, 3.5, 150 / 200]),
|
|
([0, 3, 10], [0], [16, 7, 190], [8, 10, 390], [8, 10, 390], [0.5, 1.0, 390 / 200]),
|
|
([10, 0, 10], [0, 16, 18], [4, 1024, 8000], [56, 520, 8028], [56, 520, 8028], [4.0, 0.5, 1.0]),
|
|
([0], [0], [1, 690], [20, 1380], [20, 1380], [20.0, 1380.0 / 690.0]),
|
|
([4, 3, 11, 22, 5, 0], [1, 3, 4, 8, 5, 0], [1, 16, 85, 470, 690, 349], [60, 22, 430, 500, 345, 349],
|
|
[60, 22, 430, 500, 345, 349], [10.0, 1.0, 4.3, 1.0, 345.0 / 700.0, 1.0]),
|
|
([4, 3, 11, 22, 5, 0, 0], [1, 3, 4, 8, 5, 0, 0], [1, 16, 85, 470, 690, 349, 3],
|
|
[60, 22, 430, 500, 345, 349, 1],
|
|
[60, 22, 430, 500, 345, 349, 1], [10.0, 1.0, 4.3, 1.0, 345.0 / 700.0, 1.0, 1 / 3]),
|
|
([4, 3, 11, 22, 5, 0, 0], [1, 3, 4, 8, 5, 0, 0], [1, 16, 85, 470, 690, 349, 3],
|
|
[60, 22, 430, 500, 345, 349, 1],
|
|
[60, 22, 430, 500, 345, 349, 1], [10.0, 1.0, 4.3, 1.0, 345.0 / 700.0, 1.0, 0.3333333]),
|
|
])
|
|
def test_interpolate4_using_scales_without_axes(self, pads_begin, pads_end, input_shape, output_shape, sizes,
|
|
scales):
|
|
graph = build_graph(nodes_attrs=graph_node_attrs_without_axes,
|
|
edges=graph_edges_without_axes,
|
|
update_attributes={
|
|
'input_data': {'shape': input_shape},
|
|
'sizes': {'shape': int64_array(sizes).shape, 'value': int64_array(sizes)},
|
|
'sizes_data': {'shape': int64_array(sizes).shape, 'value': int64_array(sizes)},
|
|
'scales': {'shape': np.array(scales).shape, 'value': np.array(scales)},
|
|
'scales_data': {'shape': np.array(scales).shape, 'value': np.array(scales)},
|
|
'interpolate': {'pads_begin': int64_array(pads_begin),
|
|
'pads_end': int64_array(pads_end),
|
|
'shape_calculation_mode': 'scales'}
|
|
})
|
|
|
|
node = Node(graph, 'interpolate')
|
|
tested_class = Interpolate(graph=graph, attrs=node.attrs())
|
|
tested_class.infer(node)
|
|
|
|
msg = "Interpolate-4 infer failed for case: sizes={}, scales={}, pads_begin={}, pads_end={}," \
|
|
" expected_shape={}, actual_shape={}"
|
|
|
|
self.assertTrue(np.array_equal(graph.node['interpolate_data']['shape'], int64_array(output_shape)),
|
|
msg.format(sizes, scales, pads_begin, pads_end, output_shape,
|
|
graph.node['interpolate_data']['shape']))
|