# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. # # 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. from auto_scan_test import OPConvertAutoScanTest from hypothesis import reproduce_failure import hypothesis.strategies as st import onnx from onnx import helper from onnx import TensorProto import numpy as np import unittest class TestConv2dConvert(OPConvertAutoScanTest): """ ONNX op: Conv OPset version: 7, 9 """ def sample_convert_config(self, draw): input_shape = draw( st.lists( st.integers( min_value=20, max_value=30), min_size=4, max_size=4)) kernel_size = draw( st.lists( st.integers( min_value=1, max_value=7), min_size=4, max_size=4)) data_format = "NCHW" groups = draw(st.integers(min_value=1, max_value=4)) muti1 = draw(st.integers(min_value=1, max_value=4)) kernel_size[0] = groups * muti1 input_shape[1] = kernel_size[1] * groups strides = draw( st.lists( st.integers( min_value=1, max_value=5), min_size=1, max_size=2)) if len(strides) == 1: strides = strides[0] if strides > kernel_size[2]: strides = kernel_size[2] if strides > kernel_size[3]: strides = kernel_size[3] strides = [strides, strides] else: if strides[0] > kernel_size[2]: strides[0] = kernel_size[2] if strides[1] > kernel_size[3]: strides[1] = kernel_size[3] if draw(st.booleans()): auto_pad = "NOTSET" padding = None if draw(st.booleans()): padding = draw( st.lists( st.integers( min_value=1, max_value=5), min_size=2, max_size=2)) padding = [0, 0] + padding else: padding = draw( st.lists( st.integers( min_value=1, max_value=5), min_size=4, max_size=4)) else: auto_pad = draw( st.sampled_from( ["SAME_LOWER", "SAME_UPPER", "VALID", "NOTSET"])) padding = None dilations = draw( st.lists( st.integers( min_value=1, max_value=3), min_size=2, max_size=2)) config = { "op_names": ["Conv"], "test_data_shapes": [input_shape, kernel_size], "test_data_types": [['float32'], ['float32']], "inputs_shape": [[-1, input_shape[1], -1, -1], kernel_size], "outputs_shape": [[-1, kernel_size[0], -1, -1]], "outputs_dtype": [['float32']], "opset_version": [7, 9, 14], "inputs_name": ["x", "W"], "outputs_name": ["y"], "delta": 1e-4, "rtol": 1e-4 } # Warning: # 1、SAME_UPPER and SAME_LOWER does not yet support dynamic shapes # 2、dilations only support 1 if "SAME" in auto_pad: dilations = [1, 1] config["inputs_shape"] = [input_shape, kernel_size] config["outputs_shape"] = [[ input_shape[0], kernel_size[0], int(input_shape[2] / strides[0]), int(input_shape[3] / strides[1]) ]] if not isinstance(dilations, (tuple, list)): dilations = [dilations] if not isinstance(strides, (tuple, list)): strides = [strides] attrs = { "auto_pad": auto_pad, "dilations": dilations, "group": groups, "kernel_shape": kernel_size[2:], "pads": padding, "strides": strides, } return (config, attrs) def test(self): self.run_and_statis(max_examples=30) if __name__ == "__main__": unittest.main()