openvino/model-optimizer/unit_tests/extensions/middle/FusedBatchNormTraining_test.py

165 lines
8.4 KiB
Python

# Copyright (C) 2018-2021 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
import unittest
import numpy as np
from generator import generator, generate
from extensions.middle.FusedBatchNormTraining import FusedBatchNormTraining
from mo.front.common.partial_infer.utils import int64_array
from mo.middle.passes.eliminate import shape_inference
from mo.utils.ir_engine.compare_graphs import compare_graphs
from unit_tests.utils.graph import build_graph
nodes_attributes = {
'placeholder': {'value': None, 'shape': int64_array([3, 10, 11, 5]), 'type': 'Parameter', 'kind': 'op',
'op': 'Parameter'},
'placeholder_data': {'shape': int64_array([3, 10, 11, 5]), 'value': None, 'kind': 'data'},
'scale': {'value': np.array([2, 3.5, 4.5, 5.1, 2.6], dtype=np.float32), 'shape': int64_array([5]), 'kind': 'op',
'op': 'Const'},
'scale_data': {'value': np.array([2, 3.5, 4.5, 5.1, 2.6], dtype=np.float32), 'shape': int64_array([5]),
'kind': 'data'},
'offset': {'value': np.array([1, 2.5, 3.5, 4.1, 5.6], dtype=np.float32), 'shape': int64_array([5]), 'kind': 'op',
'op': 'Const'},
'offset_data': {'value': np.array([1, 2.5, 3.5, 4.1, 5.6], dtype=np.float32), 'shape': int64_array([5]),
'kind': 'data'},
'mean': {'value': None, 'shape': int64_array([]), 'kind': 'op', 'op': 'Const'},
'mean_data': {'value': None, 'shape': int64_array([]), 'kind': 'data'},
'variance': {'value': None, 'shape': int64_array([]), 'kind': 'op', 'op': 'Const'},
'variance_data': {'value': None, 'shape': int64_array([]), 'kind': 'data'},
'batchnorm': {'value': None, 'shape': int64_array([3, 10, 11, 5]), 'type': None, 'kind': 'op',
'op': 'FusedBatchNorm', 'is_training': True, 'eps': 1e-3},
'batchnorm_data': {'value': None, 'shape': int64_array([3, 10, 11, 5]), 'kind': 'data'},
'result': {'kind': 'op', 'op': 'Result'},
# nodes after transformation
'bn_mean': {'value': np.zeros([5]), 'shape': int64_array([5]), 'kind': 'op', 'op': 'Const'},
'bn_mean_data': {'value': np.zeros([5]), 'shape': int64_array([5]), 'kind': 'data'},
'bn_variance': {'value': np.ones([5]), 'shape': int64_array([5]), 'kind': 'op', 'op': 'Const'},
'bn_variance_data': {'value': np.ones([5]), 'shape': int64_array([5]), 'kind': 'data'},
'shapeof': {'type': 'ShapeOf', 'value': None, 'kind': 'op', 'op': 'ShapeOf'},
'shapeof_data': {'value': int64_array([3, 10, 11, 5]), 'shape': int64_array([4]), 'kind': 'data'},
'reshape_to_orig': {'type': 'Reshape', 'value': None, 'kind': 'op', 'op': 'Reshape'},
'reshape_to_orig_data': {'value': None, 'shape': None, 'kind': 'data'},
'start': {'kind': 'op', 'op': 'Const'},
'start_data': {'value': None, 'shape': None, 'kind': 'data'},
'stop': {'kind': 'op', 'op': 'Const'},
'stop_data': {'value': None, 'shape': None, 'kind': 'data'},
'step': {'kind': 'op', 'op': 'Const'},
'step_data': {'value': None, 'shape': None, 'kind': 'data'},
'mvn_axes': {'kind': 'op', 'op': 'Range'},
'mvn_axes_data': {'value': None, 'shape': None, 'kind': 'data'},
'mvn': {'type': 'MVN', 'value': None, 'kind': 'op', 'op': 'MVN', 'eps': 1e-3},
'mvn_data': {'value': None, 'shape': None, 'kind': 'data'},
'reshape_1': {'type': 'Reshape', 'value': None, 'kind': 'op', 'op': 'Reshape'},
'reshape_1_data': {'value': None, 'shape': None, 'kind': 'data'},
'reshape_1_const': {'type': 'Const', 'kind': 'op', 'op': 'Const', 'value': int64_array([1, -1, 0, 0])},
'reshape_1_const_data': {'kind': 'data', 'value': None, 'shape': None},
}
@generator
class FusedBatchNormTrainingTest(unittest.TestCase):
@generate(*[
'FusedBatchNorm', 'FusedBatchNormV2', 'FusedBatchNormV3',
])
def test_transformation(self, op: str):
graph = build_graph(nodes_attributes,
[('placeholder', 'placeholder_data', {}),
('scale', 'scale_data'),
('offset', 'offset_data'),
('mean', 'mean_data'),
('variance', 'variance_data'),
('placeholder_data', 'batchnorm', {'in': 0}),
('scale_data', 'batchnorm', {'in': 1}),
('offset_data', 'batchnorm', {'in': 2}),
('mean_data', 'batchnorm', {'in': 3}),
('variance_data', 'batchnorm', {'in': 4}),
('batchnorm', 'batchnorm_data'),
('batchnorm_data', 'result'),
],
{}, nodes_with_edges_only=True)
graph.nodes['batchnorm']['op'] = op
graph_ref = build_graph(nodes_attributes,
[('placeholder', 'placeholder_data', {}),
('scale', 'scale_data'),
('offset', 'offset_data'),
('bn_mean', 'bn_mean_data'),
('bn_variance', 'bn_variance_data'),
('scale_data', 'batchnorm', {'in': 1}),
('offset_data', 'batchnorm', {'in': 2}),
('bn_mean_data', 'batchnorm', {'in': 3}),
('bn_variance_data', 'batchnorm', {'in': 4}),
('placeholder_data', 'reshape_1', {'in': 0}),
('reshape_1_const', 'reshape_1_const_data'),
('reshape_1_const_data', 'reshape_1', {'in': 1}),
('reshape_1', 'reshape_1_data', {}),
('reshape_1_data', 'mvn', {'in': 0}),
('mvn', 'mvn_data'),
('mvn_data', 'reshape_to_orig', {'in': 0}),
('start', 'start_data'),
('start_data', 'mvn_axes'),
('stop', 'stop_data'),
('stop_data', 'mvn_axes'),
('step', 'step_data'),
('step_data', 'mvn_axes'),
('mvn_axes', 'mvn_axes_data'),
('mvn_axes_data', 'mvn'),
('placeholder_data', 'shapeof', {'in': 0}),
('shapeof', 'shapeof_data'),
('shapeof_data', 'reshape_to_orig', {'in': 1}),
('reshape_to_orig', 'reshape_to_orig_data'),
('reshape_to_orig_data', 'batchnorm', {'in': 0}),
('batchnorm', 'batchnorm_data'),
('batchnorm_data', 'result'),
],
{'batchnorm': {'is_training': False},
}, nodes_with_edges_only=True)
FusedBatchNormTraining().find_and_replace_pattern(graph)
shape_inference(graph)
graph_ref.nodes['batchnorm']['op'] = op
(flag, resp) = compare_graphs(graph, graph_ref, 'result', check_op_attrs=True)
self.assertTrue(flag, resp)
def test_non_training(self):
graph = build_graph(nodes_attributes,
[('placeholder', 'placeholder_data', {}),
('scale', 'scale_data'),
('offset', 'offset_data'),
('mean', 'mean_data'),
('variance', 'variance_data'),
('placeholder_data', 'batchnorm', {'in': 0}),
('scale_data', 'batchnorm', {'in': 1}),
('offset_data', 'batchnorm', {'in': 2}),
('mean_data', 'batchnorm', {'in': 3}),
('variance_data', 'batchnorm', {'in': 4}),
('batchnorm', 'batchnorm_data'),
('batchnorm_data', 'result'),
],
{'batchnorm': {'is_training': False}}, nodes_with_edges_only=True)
graph_ref = graph.copy()
FusedBatchNormTraining().find_and_replace_pattern(graph)
shape_inference(graph)
(flag, resp) = compare_graphs(graph, graph_ref, 'result', check_op_attrs=True)
self.assertTrue(flag, resp)