DilatedConvolutionConverter - disallow negative pads (#13055)

This commit is contained in:
Mateusz Tabaka
2022-09-16 00:02:44 +02:00
committed by GitHub
parent 101462100b
commit 96fb6ba4a6
2 changed files with 39 additions and 25 deletions

View File

@@ -65,11 +65,17 @@ ngraph::pass::DilatedConvolutionConverter::DilatedConvolutionConverter() {
auto crops_begin_val = crops_begin->cast_vector<std::ptrdiff_t>();
auto crops_end_val = crops_end->cast_vector<std::ptrdiff_t>();
std::vector<std::ptrdiff_t> new_pads_begin;
for (size_t i = 2; i < pads_begin_val.size(); i++)
for (size_t i = 2; i < pads_begin_val.size(); i++) {
if (pads_begin_val[i] < crops_begin_val[i])
return false;
new_pads_begin.push_back(pads_begin_val[i] - crops_begin_val[i]);
}
std::vector<std::ptrdiff_t> new_pads_end;
for (size_t i = 2; i < pads_end_val.size(); i++)
for (size_t i = 2; i < pads_end_val.size(); i++) {
if (pads_end_val[i] < crops_end_val[i])
return false;
new_pads_end.push_back(pads_end_val[i] - crops_end_val[i]);
}
auto new_conv = register_new_node<opset6::Convolution>(pattern_map.at(data_pattern),
conv->input_value(1),
conv->get_strides(),

View File

@@ -23,6 +23,36 @@ using namespace testing;
using namespace ngraph;
TEST_F(TransformationTestsF, DilatedConvolutionConverter) {
{
auto data = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 4, 10, 10});
auto filters = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 4, 3, 3});
auto space_to_batch = std::make_shared<opset6::SpaceToBatch>(data,
op::Constant::create(element::i64, Shape{4}, {1, 1, 2, 2}),
op::Constant::create(element::i64, Shape{4}, {0, 0, 2, 2}),
op::Constant::create(element::i64, Shape{4}, {0, 0, 2, 2}));
auto conv = std::make_shared<opset6::Convolution>(space_to_batch, filters,
Strides{1, 1}, CoordinateDiff{0, 0}, CoordinateDiff{0, 0}, Strides{1, 1});
auto batch_to_space = std::make_shared<opset6::BatchToSpace>(conv,
op::Constant::create(element::i64, Shape{4}, {1, 1, 2, 2}),
op::Constant::create(element::i64, Shape{4}, {0, 0, 1, 1}),
op::Constant::create(element::i64, Shape{4}, {0, 0, 1, 1}));
function = std::make_shared<Function>(NodeVector{batch_to_space}, ParameterVector{data, filters});
manager.register_pass<pass::DilatedConvolutionConverter>();
}
{
auto data = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 4, 10, 10});
auto filters = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 4, 3, 3});
auto conv = std::make_shared<opset6::Convolution>(data, filters,
Strides{1, 1}, CoordinateDiff{1, 1}, CoordinateDiff{1, 1}, Strides{2, 2}, op::PadType::EXPLICIT);
function_ref = std::make_shared<Function>(NodeVector{conv}, ParameterVector{data, filters});
}
comparator.enable(FunctionsComparator::CmpValues::CONST_VALUES);
comparator.enable(FunctionsComparator::CmpValues::ACCURACY);
comparator.enable(FunctionsComparator::CmpValues::ATTRIBUTES);
}
TEST_F(TransformationTestsF, NegativeDilatedConvolutionConverterPadsLessThanCrops) {
{
auto data = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 4, 10, 10});
auto filters = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 4, 3, 3});
@@ -40,13 +70,6 @@ TEST_F(TransformationTestsF, DilatedConvolutionConverter) {
manager.register_pass<pass::DilatedConvolutionConverter>();
}
{
auto data = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 4, 10, 10});
auto filters = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 4, 3, 3});
auto conv = std::make_shared<opset6::Convolution>(data, filters,
Strides{1, 1}, CoordinateDiff{1, 1}, CoordinateDiff{-1, -2}, Strides{2, 2}, op::PadType::EXPLICIT);
function_ref = std::make_shared<Function>(NodeVector{conv}, ParameterVector{data, filters});
}
}
TEST_F(TransformationTestsF, NegativeDilatedConvolutionConverterNonZeroPadsForNC) {
@@ -62,24 +85,9 @@ TEST_F(TransformationTestsF, NegativeDilatedConvolutionConverterNonZeroPadsForNC
auto batch_to_space = std::make_shared<opset6::BatchToSpace>(conv,
op::Constant::create(element::i64, Shape{4}, {1, 1, 2, 2}),
op::Constant::create(element::i64, Shape{4}, {0, 0, 0, 0}),
op::Constant::create(element::i64, Shape{4}, {0, 0, 2, 3}));
op::Constant::create(element::i64, Shape{4}, {0, 0, 1, 1}));
function = std::make_shared<Function>(NodeVector{batch_to_space}, ParameterVector{data, filters});
manager.register_pass<pass::DilatedConvolutionConverter>();
}
{
auto data = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 4, 10, 10});
auto filters = std::make_shared<opset6::Parameter>(element::f32, Shape{1, 5, 3, 3});
auto space_to_batch = std::make_shared<opset6::SpaceToBatch>(data,
op::Constant::create(element::i64, Shape{4}, {1, 1, 2, 2}),
op::Constant::create(element::i64, Shape{4}, {1, 1, 1, 1}),
op::Constant::create(element::i64, Shape{4}, {0, 0, 1, 1}));
auto conv = std::make_shared<opset6::Convolution>(space_to_batch, filters,
Strides{1, 1}, CoordinateDiff{0, 0}, CoordinateDiff{0, 0}, Strides{1, 1});
auto batch_to_space = std::make_shared<opset6::BatchToSpace>(conv,
op::Constant::create(element::i64, Shape{4}, {1, 1, 2, 2}),
op::Constant::create(element::i64, Shape{4}, {0, 0, 0, 0}),
op::Constant::create(element::i64, Shape{4}, {0, 0, 2, 3}));
function_ref = std::make_shared<Function>(NodeVector{batch_to_space}, ParameterVector{data, filters});
}
}