[Core] Fix Pad shape inference for Edge and Reflect modes (#14185)

Signed-off-by: Kazantsev, Roman <roman.kazantsev@intel.com>

Signed-off-by: Kazantsev, Roman <roman.kazantsev@intel.com>
This commit is contained in:
Roman Kazantsev 2022-11-24 14:54:51 +03:00 committed by GitHub
parent fa76c1df10
commit e082d183b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 1 deletions

View File

@ -110,7 +110,7 @@ void shape_infer(const Pad* op,
const auto& dim = arg_shape[i].get_length();
output_shape[i] = static_cast<size_t>(begin + dim + end);
if (i > 1) {
if (begin > 0 || end > 0) {
NODE_VALIDATION_CHECK(op,
pad_mode != op::PadMode::EDGE || arg_shape[i].get_length() >= 1,
"EDGE padding mode requires an input of dimension of "

View File

@ -213,3 +213,21 @@ TEST(type_prop, pad_v1_dynamic_output_with_static_rank) {
auto pad = make_shared<op::v1::Pad>(arg, pads_begin, pads_end, arg_pad_value, op::PadMode::CONSTANT);
ASSERT_EQ(pad->get_output_partial_shape(0), PartialShape::dynamic(3));
}
TEST(type_prop, pad_v1_any_dim_for_padding_reflect) {
auto arg = make_shared<op::Parameter>(element::f32, Shape{1, 48, 48, 1});
auto pads_begin = make_shared<op::Constant>(element::i64, Shape{4}, std::vector<int64_t>{0, 1, 1, 0});
auto pads_end = make_shared<op::Constant>(element::i64, Shape{4}, std::vector<int64_t>{0, 1, 1, 0});
auto pad = make_shared<op::v1::Pad>(arg, pads_begin, pads_end, op::PadMode::REFLECT);
ASSERT_TRUE(pad->get_output_partial_shape(0).same_scheme(PartialShape{1, 50, 50, 1}));
}
TEST(type_prop, pad_v1_any_dim_for_padding_edge) {
auto arg = make_shared<op::Parameter>(element::f32, PartialShape{1, 48, Dimension::dynamic(), 1});
auto pads_begin = make_shared<op::Constant>(element::i64, Shape{4}, std::vector<int64_t>{1, 2, 0, 0});
auto pads_end = make_shared<op::Constant>(element::i64, Shape{4}, std::vector<int64_t>{0, 3, 0, 0});
auto pad = make_shared<op::v1::Pad>(arg, pads_begin, pads_end, op::PadMode::EDGE);
ASSERT_TRUE(pad->get_output_partial_shape(0).same_scheme(PartialShape{2, 53, Dimension::dynamic(), 1}));
}