DilatedConvolutionConverter - disallow negative pads (#13055)
This commit is contained in:
@@ -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(),
|
||||
|
||||
@@ -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});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user