diff --git a/docs/template_plugin/tests/functional/op_reference/convolution.cpp b/docs/template_plugin/tests/functional/op_reference/convolution.cpp new file mode 100644 index 00000000000000..eef16fbe03891d --- /dev/null +++ b/docs/template_plugin/tests/functional/op_reference/convolution.cpp @@ -0,0 +1,1089 @@ +// Copyright (C) 2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include + +#include "openvino/op/convolution.hpp" +#include "base_reference_test.hpp" + +using namespace reference_tests; +using namespace ov; + +namespace { +struct ConvolutionParams { + template + ConvolutionParams(const PartialShape& inputShape, const PartialShape& filterShape, const PartialShape& outputShape, + const element::Type& iType, + const std::vector& iValues, const std::vector& filterValues, const std::vector& oValues, + const Strides& strides, const CoordinateDiff& padBegin, const CoordinateDiff& padEnd, const Strides& dialations) + : inputShape(inputShape), + filterShape(filterShape), + outputShape(outputShape), + inType(iType), + filterType(iType), + outType(iType), + inputData(CreateTensor(iType, iValues)), + filterData(CreateTensor(iType, filterValues)), + refData(CreateTensor(iType, oValues)), + strides(strides), + padBegin(padBegin), + padEnd(padEnd), + dialations(dialations) {} + + template + ConvolutionParams(const PartialShape& inputShape, const PartialShape& filterShape, const PartialShape& outputShape, + const element::Type& iType, + const std::vector& iValues, const std::vector& filterValues, const std::vector& oValues, + const Strides& strides, const CoordinateDiff& padBegin, const CoordinateDiff& padEnd, const Strides& dialations, + const bool convolutionOutlining) + : inputShape(inputShape), + filterShape(filterShape), + outputShape(outputShape), + inType(iType), + filterType(iType), + outType(iType), + inputData(CreateTensor(iType, iValues)), + filterData(CreateTensor(iType, filterValues)), + refData(CreateTensor(iType, oValues)), + strides(strides), + padBegin(padBegin), + padEnd(padEnd), + dialations(dialations), + convolutionOutlining(convolutionOutlining) {} + + PartialShape inputShape; + PartialShape filterShape; + PartialShape outputShape; + ov::element::Type inType; + ov::element::Type filterType; + ov::element::Type outType; + ov::runtime::Tensor inputData; + ov::runtime::Tensor filterData; + ov::runtime::Tensor refData; + ov::Strides strides; + ov::CoordinateDiff padBegin; + ov::CoordinateDiff padEnd; + ov::Strides dialations; + bool convolutionOutlining = false; +}; + +class ReferenceConvolutionLayerTest : public testing::TestWithParam, public CommonReferenceTest { +public: + void SetUp() override { + auto params = GetParam(); + function = CreateFunction(params); + inputData = {params.inputData, params.filterData}; + refOutData = {params.refData}; + } + static std::string getTestCaseName(const testing::TestParamInfo& obj) { + auto param = obj.param; + std::ostringstream result; + result << "inputShape=" << param.inputShape << "_"; + result << "filterShape=" << param.filterShape << "_"; + result << "outputShape=" << param.outputShape << "_"; + result << "iType=" << param.inType << "_"; + result << "oType=" << param.outType << "_"; + result << "strides=" << param.strides << "_"; + result << "padBegin=" << param.padBegin << "_"; + result << "padEnd=" << param.padEnd << "_"; + result << "dialations=" << param.dialations; + if (param.convolutionOutlining == true) + result << "_convOutlining=" << param.convolutionOutlining; + return result.str(); + } + +private: + static std::shared_ptr CreateFunction(const ConvolutionParams& params) { + const op::PadType auto_pad{op::PadType::EXPLICIT}; + + const auto in = std::make_shared(params.inType, params.inputShape); + const auto filter = std::make_shared(params.inType, params.filterShape); + const auto Convolution = std::make_shared(in, + filter, + params.strides, + params.padBegin, + params.padEnd, + params.dialations, + auto_pad); + + if (params.convolutionOutlining == true) { + const auto Convolution2 = std::make_shared(Convolution, + filter, + params.strides, + params.padBegin, + params.padEnd, + params.dialations, + auto_pad); + return std::make_shared(NodeVector {Convolution2}, ParameterVector {in, filter}); + } else { + return std::make_shared(NodeVector {Convolution}, ParameterVector {in, filter}); + } + } +}; + +TEST_P(ReferenceConvolutionLayerTest, CompareWithRefs) { + Exec(); +} + +template +std::vector generateConvolutionI8Params() { + using T = typename element_type_traits::value_type; + + std::vector convolutionParams { +// --------------------- 1D convolution ------------------------------------------ +// clang-format off + ConvolutionParams(PartialShape {1, 1, 6}, + PartialShape {1, 1, 3}, + PartialShape {1, 1, 4}, + IN_ET, + std::vector{1, 3, 3, 0, 1, 2}, + std::vector{2, 0, 1}, + std::vector{5, 6, 7, 2}, + {1}, + {0}, + {0}, + {1}), + ConvolutionParams(PartialShape {1, 1, 4, 4}, + PartialShape {1, 1, 3, 3}, + PartialShape {1, 1, 2, 2}, + IN_ET, + std::vector{1, 3, 5, 7, + 7, 5, 3, 1, + 2, 4, 6, 8, + 8, 6, 4, 2}, + std::vector{1, 2, 3, + 0, 1, 0, + 3, 2, 1}, + std::vector{47, 69, + 70, 48}, + {1, 1}, + {0, 0}, + {0, 0}, + {1, 1}), + ConvolutionParams(PartialShape {1, 1, 4, 4, 4}, + PartialShape {1, 1, 3, 3, 3}, + PartialShape {1, 1, 2, 2, 2}, + IN_ET, + std::vector{ + // depth: 1 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 2 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 3 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 4 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3}, + std::vector{ + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2}, + std::vector{ + // depth: 1 + 69, 66, + 93, 78, + // depth: 2 + 69, 66, + 93, 78}, + {1, 1, 1}, + {0, 0, 0}, + {0, 0, 0}, + {1, 1, 1}) + }; + return convolutionParams; +} + +template +std::vector generateConvolutionFloatParams() { + using T = typename element_type_traits::value_type; + + std::vector convolutionParams { +// --------------------- 1D convolution ------------------------------------------ + ConvolutionParams(PartialShape {1, 1, 6}, + PartialShape {1, 1, 3}, + PartialShape {1, 1, 4}, + IN_ET, + std::vector{1, 3, 3, 0, 1, 2}, + std::vector{2, 0, 1}, + std::vector{5, 6, 7, 2}, + {1}, + {0}, + {0}, + {1}), + ConvolutionParams(PartialShape {1, 1, 4}, + PartialShape {1, 1, 3}, + PartialShape {1, 1, 4}, + IN_ET, + std::vector{1, 3, 3, 0}, + std::vector{2, 0, 1}, + std::vector{3, 5, 6, 6}, + {1}, + {1}, + {1}, + {1}), + ConvolutionParams(PartialShape {1, 1, 5}, + PartialShape {1, 1, 3}, + PartialShape {1, 1, 2}, + IN_ET, + std::vector{1, 3, 3, 0, 1}, + std::vector{2, 0, 1}, + std::vector{5, 7}, + {2}, + {0}, + {0}, + {1}), + ConvolutionParams(PartialShape {1, 1, 7}, + PartialShape {1, 1, 3}, + PartialShape {1, 1, 3}, + IN_ET, + std::vector{1, 3, 3, 0, 1, 2, 3}, + std::vector{2, 0, 1}, + std::vector{3, 8, 9}, + {1}, + {0}, + {0}, + {2}), + ConvolutionParams(PartialShape {1, 1, 7}, + PartialShape {1, 1, 3}, + PartialShape {1, 1, 4}, + IN_ET, + std::vector{1, 3, 3, 0, 1, 2, 3}, + std::vector{2, 0, 1}, + std::vector{3, 3, 9, 2}, + {2}, + {2}, + {2}, + {2}), + ConvolutionParams(PartialShape {1, 2, 4}, + PartialShape {1, 2, 3}, + PartialShape {1, 1, 2}, + IN_ET, + std::vector{ + // channel 1 + 1, 3, 2, 1, + // channel 2 + 2, 2, 3, 1}, + std::vector{ + // channel 1 + 2, 0, 1, + // channel 2 + 1, 0, 2}, + std::vector{12, 11}, + {1}, + {0}, + {0}, + {1}), + ConvolutionParams(PartialShape {1, 1, 4}, + PartialShape {2, 1, 3}, + PartialShape {1, 2, 2}, + IN_ET, + std::vector{1, 3, 2, 1}, + std::vector{ + // filter 1 + 2, 0, 1, + // filter 2 + 1, 0, 2}, + std::vector{ + // channel 1 + 4, 7, + // channel 2 + 5, 5}, + {1}, + {0}, + {0}, + {1}), + ConvolutionParams(PartialShape {2, 1, 4}, + PartialShape {1, 1, 3}, + PartialShape {2, 1, 2}, + IN_ET, + std::vector{ + // batch 1 + 1, 3, 2, 1, + // batch 2 + 2, 2, 3, 1}, + std::vector{2, 0, 1}, + std::vector{ + // batch 1 + 4, 7, + // batch 2 + 7, 5}, + {1}, + {0}, + {0}, + {1}), +// --------------------- 2D convolution ------------------------------------------ + ConvolutionParams(PartialShape {1, 1, 4, 4}, + PartialShape {1, 1, 3, 3}, + PartialShape {1, 1, 2, 2}, + IN_ET, + std::vector{1, 3, 5, 7, + 7, 5, 3, 1, + 2, 4, 6, 8, + 8, 6, 4, 2}, + std::vector{1, 2, 3, + 0, 1, 0, + 3, 2, 1}, + std::vector{47, 69, + 70, 48}, + {1, 1}, + {0, 0}, + {0, 0}, + {1, 1}), + ConvolutionParams(PartialShape {1, 1, 4, 4}, + PartialShape {1, 1, 3, 3}, + PartialShape {1, 1, 4, 4}, + IN_ET, + std::vector{1, 3, 5, 7, + 7, 5, 3, 1, + 2, 4, 6, 8, + 8, 6, 4, 2}, + std::vector{1, 2, 3, + 0, 1, 0, + 2, 1, 2}, + std::vector{18, 28, 20, 14, + 28, 47, 67, 40, + 51, 60, 40, 23, + 24, 34, 44, 24}, + {1, 1}, + {1, 1}, + {1, 1}, + {1, 1}), + ConvolutionParams(PartialShape {1, 1, 5, 5}, + PartialShape {1, 1, 3, 3}, + PartialShape {1, 1, 2, 2}, + IN_ET, + std::vector{1, 3, 5, 7, 9, + 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, + 8, 6, 4, 2, 0, + 2, 4, 6, 8, 10}, + std::vector{1, 2, 3, + 1, 1, 1, + 3, 2, 1}, + std::vector{57, 94, + 66, 102}, + {2, 2}, + {0, 0}, + {0, 0}, + {1, 1}), + ConvolutionParams(PartialShape {1, 1, 7, 7}, + PartialShape {1, 1, 3, 3}, + PartialShape {1, 1, 3, 3}, + IN_ET, + std::vector{1, 3, 5, 7, 9, 11, 13, + 7, 5, 3, 1, -1, -3, -5, + 2, 4, 6, 8, 10, 12, 14, + 8, 6, 4, 2, 0, -2, -4, + 2, 4, 6, 8, 10, 12, 14, + 7, 5, 3, 1, -1, -3, -5, + 8, 6, 4, 2, 0, -2, -4}, + std::vector{1, 2, 3, + 1, 1, 0, + 3, 1, 2}, + std::vector{78, 106, 134, + 44, 16, -12, + 80, 84, 88}, + {1, 1}, + {0, 0}, + {0, 0}, + {2, 2}), + ConvolutionParams(PartialShape {1, 1, 7, 7}, + PartialShape {1, 1, 3, 3}, + PartialShape {1, 1, 4, 4}, + IN_ET, + std::vector{1, 3, 5, 7, 9, 11, 13, + 7, 5, 3, 1, -1, -3, -5, + 2, 4, 6, 8, 10, 12, 14, + 8, 6, 4, 2, 0, -2, -4, + 2, 4, 6, 8, 10, 12, 14, + 7, 5, 3, 1, -1, -3, -5, + 8, 6, 4, 2, 0, -2, -4}, + std::vector{1, 2, 3, + 1, 1, 0, + 3, 1, 2}, + std::vector{15, 38, 70, 66, + 33, 78, 134, 103, + 40, 80, 88, 58, + 30, 56, 72, 34}, + {2, 2}, + {2, 2}, + {2, 2}, + {2, 2}), + ConvolutionParams(PartialShape {1, 2, 4, 4}, + PartialShape {1, 2, 3, 3}, + PartialShape {1, 1, 2, 2}, + IN_ET, + std::vector{ + // channel 1 + 1, 3, 5, 7, + 7, 5, 3, 1, + 2, 4, 6, 8, + 8, 6, 4, 2, + // channel 2 + -1, 3, -5, 7, + 7, -5, 3, -1, + -2, 4, -6, 8, + 8, -6, 4, -2}, + std::vector{ + // channel 1 + 5, 3, 5, + 1, 3, 1, + 4, 2, 4, + // channel 2 + -5, 3, 5, + 1, -3, 1, + 4, 2, -4}, + std::vector{142, 102, + 94, 160}, + {1, 1}, + {0, 0}, + {0, 0}, + {1, 1}), + ConvolutionParams(PartialShape {1, 1, 4, 4}, + PartialShape {2, 1, 3, 3}, + PartialShape {1, 2, 2, 2}, + IN_ET, + std::vector{1, 3, 5, 7, + 7, 5, 3, 1, + 2, 4, 6, 8, + 8, 6, 4, 2}, + std::vector{ + // channel 1 + 5, 3, 5, + 1, 3, 1, + 4, 2, 4, + // channel 2 + -5, 3, 5, + 1, -3, 1, + 4, 2, -4}, + std::vector{ + // channel 1 + 104, 140, + 145, 109, + // channel 2 + 16, 28, + 19, 7}, + {1, 1}, + {0, 0}, + {0, 0}, + {1, 1}), + ConvolutionParams(PartialShape {2, 1, 4, 4}, + PartialShape {1, 1, 3, 3}, + PartialShape {2, 1, 2, 2}, + IN_ET, + std::vector{ + // batch 1 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // batch 2 + -1, 3, 2, -1, + 1, 3, -3, 1, + -2, -1, 1, 3, + 3, 2, 3, -3}, + std::vector{-5, 3, 5, + 1, -3, 1, + 4, 2, -4}, + std::vector{ + // batch 1 + 15, -15, + 23, 2, + // batch 2 + -1, -15, + -5, 6}, + {1, 1}, + {0, 0}, + {0, 0}, + {1, 1}), +// --------------------- 3D convolution ------------------------------------------ + ConvolutionParams(PartialShape {1, 1, 4, 4, 4}, + PartialShape {1, 1, 3, 3, 3}, + PartialShape {1, 1, 2, 2, 2}, + IN_ET, + std::vector{ + // depth: 1 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 2 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 3 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 4 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3}, + std::vector{ + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2}, + std::vector{ + // depth: 1 + 69, 66, + 93, 78, + // depth: 2 + 69, 66, + 93, 78}, + {1, 1, 1}, + {0, 0, 0}, + {0, 0, 0}, + {1, 1, 1}), + ConvolutionParams(PartialShape {1, 1, 4, 4, 4}, + PartialShape {1, 1, 3, 3, 3}, + PartialShape {1, 1, 4, 4, 4}, + IN_ET, + std::vector{ + // depth: 1 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 2 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 3 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 4 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3}, + std::vector{ + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2}, + std::vector{ + // depth: 1 + 16, 28, 26, 16, + 32, 46, 44, 20, + 40, 62, 52, 34, + 20, 18, 30, 20, + // depth: 2 + 24, 42, 39, 24, + 48, 69, 66, 30, + 60, 93, 78, 51, + 30, 27, 45, 30, + // depth: 3 + 24, 42, 39, 24, + 48, 69, 66, 30, + 60, 93, 78, 51, + 30, 27, 45, 30, + // depth: 4 + 16, 28, 26, 16, + 32, 46, 44, 20, + 40, 62, 52, 34, + 20, 18, 30, 20}, + {1, 1, 1}, + {1, 1, 1}, + {1, 1, 1}, + {1, 1, 1}), + ConvolutionParams(PartialShape {1, 1, 5, 5, 5}, + PartialShape {1, 1, 3, 3, 3}, + PartialShape {1, 1, 2, 2, 2}, + IN_ET, + std::vector{ + // depth: 1 + 1, 3, 2, 1, 2, + 1, 3, 3, 1, 2, + 2, 1, 1, 3, 2, + 3, 2, 3, 3, 2, + 3, 2, 3, 3, 2, + // depth: 2 + 1, 3, 2, 1, 2, + 1, 3, 3, 1, 2, + 2, 1, 1, 3, 2, + 3, 2, 3, 3, 2, + 3, 2, 3, 3, 2, + // depth: 3 + 1, 3, 2, 1, 2, + 1, 3, 3, 1, 2, + 2, 1, 1, 3, 2, + 3, 2, 3, 3, 2, + 3, 2, 3, 3, 2, + // depth: 4 + 1, 3, 2, 1, 2, + 1, 3, 3, 1, 2, + 2, 1, 1, 3, 2, + 3, 2, 3, 3, 2, + 3, 2, 3, 3, 2, + // depth: 5 + 1, 3, 2, 1, 2, + 1, 3, 3, 1, 2, + 2, 1, 1, 3, 2, + 3, 2, 3, 3, 2, + 3, 2, 3, 3, 2}, + std::vector{ + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2}, + std::vector{ + // depth: 1 + 69, 60, + 69, 87, + // depth: 2 + 69, 60, + 69, 87}, + {2, 2, 2}, + {0, 0, 0}, + {0, 0, 0}, + {1, 1, 1}), + ConvolutionParams(PartialShape {1, 1, 7, 7, 7}, + PartialShape {1, 1, 3, 3, 3}, + PartialShape {1, 1, 4, 4, 4}, + IN_ET, + std::vector{ + // depth: 1 + 1, 3, 2, 1, 1, 2, 3, + 1, 3, 3, 1, 1, 2, 3, + 2, 1, 1, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + // depth: 2 + 1, 3, 2, 1, 1, 2, 3, + 1, 3, 3, 1, 1, 2, 3, + 2, 1, 1, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + // depth: 3 + 1, 3, 2, 1, 1, 2, 3, + 1, 3, 3, 1, 1, 2, 3, + 2, 1, 1, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + // depth: 4 + 1, 3, 2, 1, 1, 2, 3, + 1, 3, 3, 1, 1, 2, 3, + 2, 1, 1, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + // depth: 5 + 1, 3, 2, 1, 1, 2, 3, + 1, 3, 3, 1, 1, 2, 3, + 2, 1, 1, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + // depth: 6 + 1, 3, 2, 1, 1, 2, 3, + 1, 3, 3, 1, 1, 2, 3, + 2, 1, 1, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + // depth: 7 + 1, 3, 2, 1, 1, 2, 3, + 1, 3, 3, 1, 1, 2, 3, + 2, 1, 1, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3, + 3, 2, 3, 3, 1, 2, 3}, + std::vector{ + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2}, + std::vector{ + // depth: 1 + 10, 18, 20, 16, + 38, 40, 54, 30, + 38, 42, 52, 30, + 36, 30, 30, 20, + // depth: 2 + 15, 27, 30, 24, + 57, 60, 81, 45, + 57, 63, 78, 45, + 54, 45, 45, 30, + // depth: 3 + 15, 27, 30, 24, + 57, 60, 81, 45, + 57, 63, 78, 45, + 54, 45, 45, 30, + // depth: 4 + 10, 18, 20, 16, + 38, 40, 54, 30, + 38, 42, 52, 30, + 36, 30, 30, 20}, + {2, 2, 2}, + {2, 2, 2}, + {2, 2, 2}, + {2, 2, 2}), + ConvolutionParams(PartialShape {1, 2, 4, 4, 4}, + PartialShape {1, 2, 3, 3, 3}, + PartialShape {1, 1, 2, 2, 2}, + IN_ET, + std::vector{ + // -- channel 1 -- + // depth: 1 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 2 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 3 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 4 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // -- channel 2 -- + // depth: 1 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 2 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 3 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 4 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3}, + std::vector{ + // -- channel 1 -- + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // -- channel 2 -- + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2}, + std::vector{ + // depth: 1 + 138, 132, + 186, 156, + // depth: 2 + 138, 132, + 186, 156}, + {1, 1, 1}, + {0, 0, 0}, + {0, 0, 0}, + {1, 1, 1}), + ConvolutionParams(PartialShape {1, 1, 4, 4, 4}, + PartialShape {2, 1, 3, 3, 3}, + PartialShape {1, 2, 2, 2, 2}, + IN_ET, + std::vector{ + // depth: 1 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 2 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 3 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 4 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3}, + std::vector{ + // -- filter 1 -- + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // -- filter 2 -- + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2}, + std::vector{ + // -- out 1 -- + // depth: 1 + 69, 66, + 93, 78, + // depth: 2 + 69, 66, + 93, 78, + // -- out 2 -- + // depth: 1 + 69, 66, + 93, 78, + // depth: 2 + 69, 66, + 93, 78}, + {1, 1, 1}, + {0, 0, 0}, + {0, 0, 0}, + {1, 1, 1}), + ConvolutionParams(PartialShape {2, 1, 4, 4, 4}, + PartialShape {1, 1, 3, 3, 3}, + PartialShape {2, 1, 2, 2, 2}, + IN_ET, + std::vector{ + // -- batch 1 -- + // depth: 1 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 2 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 3 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 4 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // -- batch 2 -- + // depth: 1 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 2 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 3 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3, + // depth: 4 + 1, 3, 2, 1, + 1, 3, 3, 1, + 2, 1, 1, 3, + 3, 2, 3, 3}, + std::vector{ + // depth: 1 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 2 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2, + // depth: 3 + 1, 2, 3, + 0, 1, 0, + 2, 1, 2}, + std::vector{ + // -- batch 1 -- + // depth: 1 + 69, 66, + 93, 78, + // depth: 2 + 69, 66, + 93, 78, + // -- batch 2 -- + // depth: 1 + 69, 66, + 93, 78, + // depth: 2 + 69, 66, + 93, 78}, + {1, 1, 1}, + {0, 0, 0}, + {0, 0, 0}, + {1, 1, 1}), +// ---------------------- other tests ------------------------------------------ + ConvolutionParams(PartialShape {1, 2, 2, 2}, + PartialShape {2, 2, 1, 1}, + PartialShape {1, 2, 2, 2}, + IN_ET, + std::vector{1, 1, 1, 1, 1, 1, 1, 1}, + std::vector{1, 1, 1, 1}, + std::vector{4, 4, 4, 4, 4, 4, 4, 4}, + {1, 1}, + {0, 0}, + {0, 0}, + {1, 1}, + true), + ConvolutionParams(PartialShape {1, 2, 2, 2}, + PartialShape {2, 2, 1, 1}, + PartialShape {1, 2, 2, 2}, + IN_ET, + std::vector{1, 2, 3, 4, 5, 6, 7, 8}, + std::vector{3, 3, 3, 3}, + std::vector{18, 24, 30, 36, 18, 24, 30, 36}, + {1, 1}, + {0, 0}, + {0, 0}, + {1, 1}), + ConvolutionParams(PartialShape {1, 1, 2, 2}, + PartialShape {1, 1, 1, 1}, + PartialShape {1, 1, 5, 5}, + IN_ET, + std::vector{1, 2, 3, 4}, + std::vector{2}, + std::vector{ + 0, 0, 0, 0, 0, + 0, 2, 4, 0, 0, + 0, 6, 8, 0, 0, + 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0}, + {1, 1}, + {1, 1}, + {2, 2}, + {1, 1}) + }; + return convolutionParams; +} +// clang-format on + +std::vector generateConvolutionCombinedParams() { + const std::vector> convolutionTypeParams { + generateConvolutionFloatParams(), + generateConvolutionFloatParams(), + generateConvolutionFloatParams(), + generateConvolutionI8Params() + }; + std::vector combinedParams; + + for (const auto& params : convolutionTypeParams) { + combinedParams.insert(combinedParams.end(), params.begin(), params.end()); + } + return combinedParams; +} + +INSTANTIATE_TEST_SUITE_P(smoke_Convolution_With_Hardcoded_Refs, ReferenceConvolutionLayerTest, + testing::ValuesIn(generateConvolutionCombinedParams()), ReferenceConvolutionLayerTest::getTestCaseName); + +} // namespace \ No newline at end of file diff --git a/ngraph/test/CMakeLists.txt b/ngraph/test/CMakeLists.txt index 67e94647d20b9c..4fb53f12770082 100644 --- a/ngraph/test/CMakeLists.txt +++ b/ngraph/test/CMakeLists.txt @@ -269,6 +269,7 @@ set(SRC visitors/op/convert.cpp visitors/op/convert_color_nv12.cpp visitors/op/convolution_backprop.cpp + visitors/op/convolution.cpp visitors/op/cos.cpp visitors/op/cosh.cpp visitors/op/ctc_loss.cpp @@ -449,7 +450,6 @@ set(MULTI_TEST_SRC backend/concat.in.cpp backend/constant.in.cpp backend/convolution_backprop.in.cpp - backend/convolution.in.cpp backend/binary_convolution.in.cpp backend/clamp.in.cpp backend/ctc_greedy_decoder.in.cpp diff --git a/ngraph/test/backend/convolution.in.cpp b/ngraph/test/backend/convolution.in.cpp deleted file mode 100644 index 99755ebb9abbbb..00000000000000 --- a/ngraph/test/backend/convolution.in.cpp +++ /dev/null @@ -1,1207 +0,0 @@ -// Copyright (C) 2018-2021 Intel Corporation -// SPDX-License-Identifier: Apache-2.0 -// - -#include "engines_util/execute_tools.hpp" -#include "engines_util/test_case.hpp" -#include "engines_util/test_engines.hpp" -#include "gtest/gtest.h" -#include "ngraph/ngraph.hpp" -#include "ngraph/runtime/tensor.hpp" -#include "runtime/backend.hpp" -#include "util/all_close.hpp" -#include "util/all_close_f.hpp" -#include "util/ndarray.hpp" -#include "util/test_control.hpp" - -using namespace std; -using namespace ngraph; - -static string s_manifest = "${MANIFEST}"; -using TestEngine = test::ENGINE_CLASS_NAME(${BACKEND_NAME}); - -static void ConvolutionTest(const std::vector& inputs, - const Shape inputs_shape, - const std::vector& filters, - const Shape filter_shape, - const std::vector& outputs, - const Shape outputs_shape, - const Strides& strides, - const CoordinateDiff& padding, - const Strides& dilations) { - const CoordinateDiff pads_begin{padding}; - const CoordinateDiff pads_end{padding}; - const op::PadType auto_pad{op::PadType::EXPLICIT}; - - auto inputs_param = make_shared(element::f32, inputs_shape); - auto filters_param = make_shared(element::f32, filter_shape); - auto conv = make_shared(inputs_param, - filters_param, - strides, - pads_begin, - pads_end, - dilations, - auto_pad); - auto f = make_shared(conv, ParameterVector{inputs_param, filters_param}); - - auto test_case = test::TestCase(f); - test_case.add_input(inputs); - test_case.add_input(filters); - test_case.add_expected_output(outputs_shape, outputs); - test_case.run(); -} - -// --------------------- 1D convolution ------------------------------------------ -// clang-format off -NGRAPH_TEST(${BACKEND_NAME}, convolution_1D_1batch_1channel) -{ - const Strides strides{1}; - const CoordinateDiff padding{0}; - const Strides dilations{1}; - - const Shape inputs_shape{1, 1, 6}; - const std::vector inputs{1.0f, 3.0f, 3.0f, 0.0f, 1.0f, 2.0f}; - - const Shape filter_shape{1, 1, 3}; - const std::vector filters{2.0f, 0.0f, 1.0f}; - - const Shape outputs_shape{1, 1, 4}; - const std::vector outputs{5.0f, 6.0f, 7.0f, 2.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_1D_1batch_1channel_padding) -{ - const Strides strides{1}; - const CoordinateDiff padding{1}; - const Strides dilations{1}; - - const Shape inputs_shape{1, 1, 4}; - const std::vector inputs{1.0f, 3.0f, 3.0f, 0.0f}; - - const Shape filter_shape{1, 1, 3}; - const std::vector filters{2.0f, 0.0f, 1.0f}; - - const Shape outputs_shape{1, 1, 4}; - const std::vector outputs{3.0f, 5.0f, 6.0f, 6.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_1D_1batch_1channel_stride) -{ - const Strides strides{2}; - const CoordinateDiff padding{0}; - const Strides dilations{1}; - - const Shape inputs_shape{1, 1, 5}; - const std::vector inputs{1.0f, 3.0f, 3.0f, 0.0f, 1.0f}; - - const Shape filter_shape{1, 1, 3}; - const std::vector filters{2.0f, 0.0f, 1.0f}; - - const Shape outputs_shape{1, 1, 2}; - const std::vector outputs{5.0f, 7.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_1D_1batch_1channel_dilation) -{ - const Strides strides{1}; - const CoordinateDiff padding{0}; - const Strides dilations{2}; - - const Shape inputs_shape{1, 1, 7}; - const std::vector inputs{1.0f, 3.0f, 3.0f, 0.0f, 1.0f, 2.0f, 3.0f}; - - const Shape filter_shape{1, 1, 3}; - const std::vector filters{2.0f, 0.0f, 1.0f}; - - const Shape outputs_shape{1, 1, 3}; - const std::vector outputs{3.0f, 8.0f, 9.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_1D_1batch_1channel_padding_stride_dilation) -{ - const Strides strides{2}; - const CoordinateDiff padding{2}; - const Strides dilations{2}; - - const Shape inputs_shape{1, 1, 7}; - const std::vector inputs{1.0f, 3.0f, 3.0f, 0.0f, 1.0f, 2.0f, 3.0f}; - - const Shape filter_shape{1, 1, 3}; - const std::vector filters{2.0f, 0.0f, 1.0f}; - - const Shape outputs_shape{1, 1, 4}; - const std::vector outputs{3.0f, 3.0f, 9.0f, 2.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_1D_1batch_2channel) -{ - const Strides strides{1}; - const CoordinateDiff padding{0}; - const Strides dilations{1}; - - const Shape inputs_shape{1, 2, 4}; - const std::vector inputs{ - // channel 1 - 1.0f, 3.0f, 2.0f, 1.0f, - // channel 2 - 2.0f, 2.0f, 3.0f, 1.0f}; - - const Shape filter_shape{1, 2, 3}; - const std::vector filters{ - // channel 1 - 2.0f, 0.0f, 1.0f, - // channel 2 - 1.0f, 0.0f, 2.0f}; - - const Shape outputs_shape{1, 1, 2}; - const std::vector outputs{12.0f, 11.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_1D_1batch_2filter) -{ - const Strides strides{1}; - const CoordinateDiff padding{0}; - const Strides dilations{1}; - - const Shape inputs_shape{1, 1, 4}; - const std::vector inputs{1.0f, 3.0f, 2.0f, 1.0f}; - - const Shape filter_shape{2, 1, 3}; - const std::vector filters{ - // filter 1 - 2.0f, 0.0f, 1.0f, - // filter 2 - 1.0f, 0.0f, 2.0f}; - - const Shape outputs_shape{1, 2, 2}; - const std::vector outputs{ - // channel 1 - 4.0f, 7.0f, - // channel 2 - 5.0f, 5.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_1D_2batch_1channel) -{ - const Strides strides{1}; - const CoordinateDiff padding{0}; - const Strides dilations{1}; - - const Shape inputs_shape{2, 1, 4}; - const std::vector inputs{ - // batch 1 - 1.0f, 3.0f, 2.0f, 1.0f, - // batch 2 - 2.0f, 2.0f, 3.0f, 1.0f}; - - const Shape filter_shape{1, 1, 3}; - const std::vector filters{2.0f, 0.0f, 1.0f}; - - const Shape outputs_shape{2, 1, 2}; - const std::vector outputs{ - // batch 1 - 4.0f, 7.0f, - // batch 2 - 7.0f, 5.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -// --------------------- 2D convolution ------------------------------------------ -NGRAPH_TEST(${BACKEND_NAME}, convolution_2D_1batch_1channel) -{ - const Strides strides{1, 1}; - const CoordinateDiff padding{0, 0}; - const Strides dilations{1, 1}; - - const Shape inputs_shape{1, 1, 4, 4}; - const std::vector inputs{1.0f, 3.0f, 5.0f, 7.0f, - 7.0f, 5.0f, 3.0f, 1.0f, - 2.0f, 4.0f, 6.0f, 8.0f, - 8.0f, 6.0f, 4.0f, 2.0f}; - - const Shape filter_shape{1, 1, 3, 3}; - const std::vector filters{1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 3.0f, 2.0f, 1.0f}; - - const Shape outputs_shape{1, 1, 2, 2}; - const std::vector outputs{47.0f, 69.0f, - 70.0f, 48.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_2D_1batch_1channel_padding) -{ - const Strides strides{1, 1}; - const CoordinateDiff padding{1, 1}; - const Strides dilations{1, 1}; - - const Shape inputs_shape{1, 1, 4, 4}; - const std::vector inputs{1.0f, 3.0f, 5.0f, 7.0f, - 7.0f, 5.0f, 3.0f, 1.0f, - 2.0f, 4.0f, 6.0f, 8.0f, - 8.0f, 6.0f, 4.0f, 2.0f}; - - const Shape filter_shape{1, 1, 3, 3}; - const std::vector filters{1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f}; - - const Shape outputs_shape{1, 1, 4, 4}; - const std::vector outputs{18.0f, 28.0f, 20.0f, 14.0f, - 28.0f, 47.0f, 67.0f, 40.0f, - 51.0f, 60.0f, 40.0f, 23.0f, - 24.0f, 34.0f, 44.0f, 24.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_2D_1batch_1channel_stride) -{ - const Strides strides{2, 2}; - const CoordinateDiff padding{0, 0}; - const Strides dilations{1, 1}; - - const Shape inputs_shape{1, 1, 5, 5}; - const std::vector inputs{1.0f, 3.0f, 5.0f, 7.0f, 9.0f, - 7.0f, 5.0f, 3.0f, 1.0f, 0.0f, - 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, - 8.0f, 6.0f, 4.0f, 2.0f, 0.0f, - 2.0f, 4.0f, 6.0f, 8.0f, 10.0f}; - - const Shape filter_shape{1, 1, 3, 3}; - const std::vector filters{1.0f, 2.0f, 3.0f, - 1.0f, 1.0f, 1.0f, - 3.0f, 2.0f, 1.0f}; - - const Shape outputs_shape{1, 1, 2, 2}; - const std::vector outputs{57.0f, 94.0f, - 66.0f, 102.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_2D_1batch_1channel_dilation) -{ - const Strides strides{1, 1}; - const CoordinateDiff padding{0, 0}; - const Strides dilations{2, 2}; - - const Shape inputs_shape{1, 1, 7, 7}; - const std::vector inputs{1.0f, 3.0f, 5.0f, 7.0f, 9.0f, 11.0f, 13.0f, - 7.0f, 5.0f, 3.0f, 1.0f, -1.0f, -3.0f, -5.0f, - 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f, 14.0f, - 8.0f, 6.0f, 4.0f, 2.0f, 0.0f, -2.0f, -4.0f, - 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f, 14.0f, - 7.0f, 5.0f, 3.0f, 1.0f, -1.0f, -3.0f, -5.0f, - 8.0f, 6.0f, 4.0f, 2.0f, 0.0f, -2.0f, -4.0f}; - - const Shape filter_shape{1, 1, 3, 3}; - const std::vector filters{1.0f, 2.0f, 3.0f, - 1.0f, 1.0f, 0.0f, - 3.0f, 1.0f, 2.0f}; - - const Shape outputs_shape{1, 1, 3, 3}; - const std::vector outputs{78.0f, 106.0f, 134.0f, - 44.0f, 16.0f, -12.0f, - 80.0f, 84.0f, 88.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_2D_1batch_1channel_padding_strides_dilation) -{ - const Strides strides{2, 2}; - const CoordinateDiff padding{2, 2}; - const Strides dilations{2, 2}; - - const Shape inputs_shape{1, 1, 7, 7}; - const std::vector inputs{1.0f, 3.0f, 5.0f, 7.0f, 9.0f, 11.0f, 13.0f, - 7.0f, 5.0f, 3.0f, 1.0f, -1.0f, -3.0f, -5.0f, - 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f, 14.0f, - 8.0f, 6.0f, 4.0f, 2.0f, 0.0f, -2.0f, -4.0f, - 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f, 14.0f, - 7.0f, 5.0f, 3.0f, 1.0f, -1.0f, -3.0f, -5.0f, - 8.0f, 6.0f, 4.0f, 2.0f, 0.0f, -2.0f, -4.0f}; - - const Shape filter_shape{1, 1, 3, 3}; - const std::vector filters{1.0f, 2.0f, 3.0f, - 1.0f, 1.0f, 0.0f, - 3.0f, 1.0f, 2.0f}; - - const Shape outputs_shape{1, 1, 4, 4}; - const std::vector outputs{15.0f, 38.0f, 70.0f, 66.0f, - 33.0f, 78.0f, 134.0f, 103.0f, - 40.0f, 80.0f, 88.0f, 58.0f, - 30.0f, 56.0f, 72.0f, 34.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_2D_1batch_2channel) -{ - const Strides strides{1, 1}; - const CoordinateDiff padding{0, 0}; - const Strides dilations{1, 1}; - - const Shape inputs_shape{1, 2, 4, 4}; - const std::vector inputs{ - // channel 1 - 1.0f, 3.0f, 5.0f, 7.0f, - 7.0f, 5.0f, 3.0f, 1.0f, - 2.0f, 4.0f, 6.0f, 8.0f, - 8.0f, 6.0f, 4.0f, 2.0f, - // channel 2 - -1.0f, 3.0f, -5.0f, 7.0f, - 7.0f, -5.0f, 3.0f, -1.0f, - -2.0f, 4.0f, -6.0f, 8.0f, - 8.0f, -6.0f, 4.0f, -2.0f}; - - const Shape filter_shape{1, 2, 3, 3}; - const std::vector filters{ - // channel 1 - 5.0f, 3.0f, 5.0f, - 1.0f, 3.0f, 1.0f, - 4.0f, 2.0f, 4.0f, - // channel 2 - -5.0f, 3.0f, 5.0f, - 1.0f, -3.0f, 1.0f, - 4.0f, 2.0f, -4.0f}; - - const Shape outputs_shape{1, 1, 2, 2}; - const std::vector outputs{142.0f, 102.0f, - 94.0f, 160.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_2D_1batch_2filter) -{ - const Strides strides{1, 1}; - const CoordinateDiff padding{0, 0}; - const Strides dilations{1, 1}; - - const Shape inputs_shape{1, 1, 4, 4}; - const std::vector inputs{ - 1.0f, 3.0f, 5.0f, 7.0f, - 7.0f, 5.0f, 3.0f, 1.0f, - 2.0f, 4.0f, 6.0f, 8.0f, - 8.0f, 6.0f, 4.0f, 2.0f}; - - const Shape filter_shape{2, 1, 3, 3}; - const std::vector filters{ - // channel 1 - 5.0f, 3.0f, 5.0f, - 1.0f, 3.0f, 1.0f, - 4.0f, 2.0f, 4.0f, - // channel 2 - -5.0f, 3.0f, 5.0f, - 1.0f, -3.0f, 1.0f, - 4.0f, 2.0f, -4.0f}; - - const Shape outputs_shape{1, 2, 2, 2}; - const std::vector outputs{ - // channel 1 - 104.0f, 140.0f, - 145.0f, 109.0f, - // channel 2 - 16.0f, 28.0f, - 19.0f, 7.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_2D_2batch_1channel) -{ - const Strides strides{1, 1}; - const CoordinateDiff padding{0, 0}; - const Strides dilations{1, 1}; - - const Shape inputs_shape{2, 1, 4, 4}; - const std::vector inputs{ - // batch 1 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // batch 2 - -1.0f, 3.0f, 2.0f, -1.0f, - 1.0f, 3.0f, -3.0f, 1.0f, - -2.0f, -1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, -3.0f}; - - const Shape filter_shape{1, 1, 3, 3}; - const std::vector filters{-5.0f, 3.0f, 5.0f, - 1.0f, -3.0f, 1.0f, - 4.0f, 2.0f, -4.0f}; - - const Shape outputs_shape{2, 1, 2, 2}; - const std::vector outputs{ - // batch 1 - 15.0f, -15.0f, - 23.0f, 2.0f, - // batch 2 - -1.0f, -15.0f, - -5.0f, 6.0f}; - - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -// --------------------- 3D convolution ------------------------------------------ -NGRAPH_TEST(${BACKEND_NAME}, convolution_3D_1batch_1channel) -{ - const Strides strides{1, 1, 1}; - const CoordinateDiff padding{0, 0, 0}; - const Strides dilations{1, 1, 1}; - - const Shape inputs_shape{1, 1, 4, 4, 4}; - const std::vector inputs{ - // depth: 1 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 2 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 3 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 4 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f - }; - - const Shape filter_shape{1, 1, 3, 3, 3}; - const std::vector filters{ - // depth: 1 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 2 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 3 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f}; - - const Shape outputs_shape{1, 1, 2, 2, 2}; - const std::vector outputs{ - // depth: 1 - 69.0f, 66.0f, - 93.0f, 78.0f, - // depth: 2 - 69.0f, 66.0f, - 93.0f, 78.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_3D_1batch_1channel_padding) -{ - const Strides strides{1, 1, 1}; - const CoordinateDiff padding{1, 1, 1}; - const Strides dilations{1, 1, 1}; - - const Shape inputs_shape{1, 1, 4, 4, 4}; - const std::vector inputs{ - // depth: 1 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 2 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 3 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 4 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f - }; - - const Shape filter_shape{1, 1, 3, 3, 3}; - const std::vector filters{ - // depth: 1 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 2 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 3 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f}; - - const Shape outputs_shape{1, 1, 4, 4, 4}; - const std::vector outputs{ - // depth: 1 - 16.0f, 28.0f, 26.0f, 16.0f, - 32.0f, 46.0f, 44.0f, 20.0f, - 40.0f, 62.0f, 52.0f, 34.0f, - 20.0f, 18.0f, 30.0f, 20.0f, - // depth: 2 - 24.0f, 42.0f, 39.0f, 24.0f, - 48.0f, 69.0f, 66.0f, 30.0f, - 60.0f, 93.0f, 78.0f, 51.0f, - 30.0f, 27.0f, 45.0f, 30.0f, - // depth: 3 - 24.0f, 42.0f, 39.0f, 24.0f, - 48.0f, 69.0f, 66.0f, 30.0f, - 60.0f, 93.0f, 78.0f, 51.0f, - 30.0f, 27.0f, 45.0f, 30.0f, - // depth: 4 - 16.0f, 28.0f, 26.0f, 16.0f, - 32.0f, 46.0f, 44.0f, 20.0f, - 40.0f, 62.0f, 52.0f, 34.0f, - 20.0f, 18.0f, 30.0f, 20.0f,}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_3D_1batch_1channel_stride) -{ - const Strides strides{2, 2, 2}; - const CoordinateDiff padding{0, 0, 0}; - const Strides dilations{1, 1, 1}; - - const Shape inputs_shape{1, 1, 5, 5, 5}; - const std::vector inputs{ - // depth: 1 - 1.0f, 3.0f, 2.0f, 1.0f, 2.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 2.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - // depth: 2 - 1.0f, 3.0f, 2.0f, 1.0f, 2.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 2.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - // depth: 3 - 1.0f, 3.0f, 2.0f, 1.0f, 2.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 2.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - // depth: 4 - 1.0f, 3.0f, 2.0f, 1.0f, 2.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 2.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - // depth: 5 - 1.0f, 3.0f, 2.0f, 1.0f, 2.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 2.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 2.0f, - }; - - const Shape filter_shape{1, 1, 3, 3, 3}; - const std::vector filters{ - // depth: 1 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 2 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 3 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f}; - - const Shape outputs_shape{1, 1, 2, 2, 2}; - const std::vector outputs{ - // depth: 1 - 69.0f, 60.0f, - 69.0f, 87.0f, - // depth: 2 - 69.0f, 60.0f, - 69.0f, 87.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_3D_1batch_1channel_padding_strides_dilation) -{ - const Strides strides{2, 2, 2}; - const CoordinateDiff padding{2, 2, 2}; - const Strides dilations{2, 2, 2}; - - const Shape inputs_shape{1, 1, 7, 7, 7}; - const std::vector inputs{ - // depth: 1 - 1.0f, 3.0f, 2.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - // depth: 2 - 1.0f, 3.0f, 2.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - // depth: 3 - 1.0f, 3.0f, 2.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - // depth: 4 - 1.0f, 3.0f, 2.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - // depth: 5 - 1.0f, 3.0f, 2.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - // depth: 6 - 1.0f, 3.0f, 2.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - // depth: 7 - 1.0f, 3.0f, 2.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 1.0f, 3.0f, 3.0f, 1.0f, 1.0f, 2.0f, 3.0f, - 2.0f, 1.0f, 1.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, 1.0f, 2.0f, 3.0f, - }; - - const Shape filter_shape{1, 1, 3, 3, 3}; - const std::vector filters{ - // depth: 1 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 2 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 3 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f}; - - const Shape outputs_shape{1, 1, 4, 4, 4}; - const std::vector outputs{ - // depth: 1 - 10.0f, 18.0f, 20.0f, 16.0f, - 38.0f, 40.0f, 54.0f, 30.0f, - 38.0f, 42.0f, 52.0f, 30.0f, - 36.0f, 30.0f, 30.0f, 20.0f, - // depth: 2 - 15.0f, 27.0f, 30.0f, 24.0f, - 57.0f, 60.0f, 81.0f, 45.0f, - 57.0f, 63.0f, 78.0f, 45.0f, - 54.0f, 45.0f, 45.0f, 30.0f, - // depth: 3 - 15.0f, 27.0f, 30.0f, 24.0f, - 57.0f, 60.0f, 81.0f, 45.0f, - 57.0f, 63.0f, 78.0f, 45.0f, - 54.0f, 45.0f, 45.0f, 30.0f, - // depth: 4 - 10.0f, 18.0f, 20.0f, 16.0f, - 38.0f, 40.0f, 54.0f, 30.0f, - 38.0f, 42.0f, 52.0f, 30.0f, - 36.0f, 30.0f, 30.0f, 20.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_3D_1batch_2channel) -{ - const Strides strides{1, 1, 1}; - const CoordinateDiff padding{0, 0, 0}; - const Strides dilations{1, 1, 1}; - - const Shape inputs_shape{1, 2, 4, 4, 4}; - const std::vector inputs{ - // -- channel 1 -- - // depth: 1 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 2 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 3 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 4 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // -- channel 2 -- - // depth: 1 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 2 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 3 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 4 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f - }; - - const Shape filter_shape{1, 2, 3, 3, 3}; - const std::vector filters{ - // -- channel 1 -- - // depth: 1 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 2 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 3 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // -- channel 2 -- - // depth: 1 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 2 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 3 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f - }; - - const Shape outputs_shape{1, 1, 2, 2, 2}; - const std::vector outputs{ - // depth: 1 - 138.0f, 132.0f, - 186.0f, 156.0f, - // depth: 2 - 138.0f, 132.0f, - 186.0f, 156.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_3D_1batch_2filter) -{ - const Strides strides{1, 1, 1}; - const CoordinateDiff padding{0, 0, 0}; - const Strides dilations{1, 1, 1}; - - const Shape inputs_shape{1, 1, 4, 4, 4}; - const std::vector inputs{ - // depth: 1 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 2 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 3 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 4 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f}; - - const Shape filter_shape{2, 1, 3, 3, 3}; - const std::vector filters{ - // -- filter 1 -- - // depth: 1 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 2 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 3 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // -- filter 2 -- - // depth: 1 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 2 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 3 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f - }; - - const Shape outputs_shape{1, 2, 2, 2, 2}; - const std::vector outputs{ - // -- out 1 -- - // depth: 1 - 69.0f, 66.0f, - 93.0f, 78.0f, - // depth: 2 - 69.0f, 66.0f, - 93.0f, 78.0f, - // -- out 2 -- - // depth: 1 - 69.0f, 66.0f, - 93.0f, 78.0f, - // depth: 2 - 69.0f, 66.0f, - 93.0f, 78.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_3D_2batch_1channel) -{ - const Strides strides{1, 1, 1}; - const CoordinateDiff padding{0, 0, 0}; - const Strides dilations{1, 1, 1}; - - const Shape inputs_shape{2, 1, 4, 4, 4}; - const std::vector inputs{ - // -- batch 1 -- - // depth: 1 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 2 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 3 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 4 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // -- batch 2 -- - // depth: 1 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 2 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 3 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f, - // depth: 4 - 1.0f, 3.0f, 2.0f, 1.0f, - 1.0f, 3.0f, 3.0f, 1.0f, - 2.0f, 1.0f, 1.0f, 3.0f, - 3.0f, 2.0f, 3.0f, 3.0f}; - - const Shape filter_shape{1, 1, 3, 3, 3}; - const std::vector filters{ - // depth: 1 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 2 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f, - // depth: 3 - 1.0f, 2.0f, 3.0f, - 0.0f, 1.0f, 0.0f, - 2.0f, 1.0f, 2.0f}; - - const Shape outputs_shape{2, 1, 2, 2, 2}; - const std::vector outputs{ - // -- batch 1 -- - // depth: 1 - 69.0f, 66.0f, - 93.0f, 78.0f, - // depth: 2 - 69.0f, 66.0f, - 93.0f, 78.0f, - // -- batch 2 -- - // depth: 1 - 69.0f, 66.0f, - 93.0f, 78.0f, - // depth: 2 - 69.0f, 66.0f, - 93.0f, 78.0f}; - - ConvolutionTest(inputs, inputs_shape, filters, filter_shape, outputs, outputs_shape, - strides, padding, dilations); -} -// ---------------------- other tests ------------------------------------------ -// clang-format on -NGRAPH_TEST(${BACKEND_NAME}, convolution_outlining) { - Shape shape_a{1, 2, 2, 2}; - auto A = make_shared(element::f32, shape_a); - Shape shape_b{2, 2, 1, 1}; - auto B = make_shared(element::f32, shape_b); - Shape shape_r{1, 2, 2, 2}; - auto conv1 = make_shared(A, - B, - Strides{1, 1}, - CoordinateDiff{0, 0}, - CoordinateDiff{0, 0}, - Strides{1, 1}); - auto conv2 = make_shared(conv1, - B, - Strides{1, 1}, - CoordinateDiff{0, 0}, - CoordinateDiff{0, 0}, - Strides{1, 1}); - auto f = make_shared(conv2, ParameterVector{A, B}); - - auto backend = runtime::Backend::create("${BACKEND_NAME}"); - - // Create some tensors for input/output - auto a = backend->create_tensor(element::f32, shape_a); - copy_data(a, vector{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}); - auto b = backend->create_tensor(element::f32, shape_b); - copy_data(b, vector{1.0f, 1.0f, 1.0f, 1.0f}); - auto result = backend->create_tensor(element::f32, shape_r); - - vector expected_result{4.0f, 4.0f, 4.0f, 4.0f, 4.0f, 4.0f, 4.0f, 4.0f}; - - auto handle = backend->compile(f); - handle->call_with_validate({result}, {a, b}); - EXPECT_TRUE(test::all_close_f(vector{expected_result}, read_vector(result))); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_simple) { - Shape shape_a{1, 2, 2, 2}; - auto A = make_shared(element::f32, shape_a); - Shape shape_b{2, 2, 1, 1}; - auto B = make_shared(element::f32, shape_b); - Shape shape_r{1, 2, 2, 2}; - auto conv1 = make_shared(A, - B, - Strides{1, 1}, - CoordinateDiff{0, 0}, - CoordinateDiff{0, 0}, - Strides{1, 1}); - - auto f = make_shared(conv1, ParameterVector{A, B}); - - auto backend = runtime::Backend::create("${BACKEND_NAME}"); - - // Create some tensors for input/output - auto a = backend->create_tensor(element::f32, shape_a); - copy_data(a, vector{1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f}); - auto b = backend->create_tensor(element::f32, shape_b); - copy_data(b, vector{3.0f, 3.0f, 3.0f, 3.0f}); - auto result = backend->create_tensor(element::f32, shape_r); - - vector expected_result{18.0f, 24.0f, 30.0f, 36.0f, 18.0f, 24.0f, 30.0f, 36.0f}; - - auto handle = backend->compile(f); - handle->call_with_validate({result}, {a, b}); - EXPECT_TRUE(test::all_close_f(vector{expected_result}, read_vector(result))); -} - -NGRAPH_TEST(${BACKEND_NAME}, convolution_simple_padding) { - Shape shape_a{1, 1, 2, 2}; - auto A = make_shared(element::f32, shape_a); - Shape shape_b{1, 1, 1, 1}; - auto B = make_shared(element::f32, shape_b); - Shape shape_r{1, 1, 5, 5}; - auto conv1 = make_shared(A, - B, - Strides{1, 1}, - CoordinateDiff{1, 1}, - CoordinateDiff{2, 2}, - Strides{1, 1}); - - auto f = make_shared(conv1, ParameterVector{A, B}); - - auto backend = runtime::Backend::create("${BACKEND_NAME}"); - - // Create some tensors for input/output - auto a = backend->create_tensor(element::f32, shape_a); - copy_data(a, vector{1.0f, 2.0f, 3.0f, 4.0f}); - auto b = backend->create_tensor(element::f32, shape_b); - copy_data(b, vector{2.0f}); - auto result = backend->create_tensor(element::f32, shape_r); - // clang-format off - vector expected_result{0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 2.0f, 4.0f, 0.0f, 0.0f, - 0.0f, 6.0f, 8.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; - // clang-format on - auto handle = backend->compile(f); - handle->call_with_validate({result}, {a, b}); - EXPECT_TRUE(test::all_close_f(vector{expected_result}, read_vector(result))); -} - -// The purpose of this test is to check if we can allow -// data_batch_shape as a node rather than argument -NGRAPH_TEST(${BACKEND_NAME}, dyn_convolution_backprop_data) { - Shape shape_filter{6, 3, 3, 3}; - auto filters = make_shared(element::f32, PartialShape::dynamic()); - Shape shape_delta{2, 6, 3, 3}; - auto deltas = make_shared(element::f32, PartialShape::dynamic()); - Shape shape_data_batch_shape{2, 3, 5, 5}; - auto data_batch_shape = make_shared(element::i64, PartialShape{Dimension::dynamic()}); - auto strides = Strides{1, 1}; - auto dilations = Strides{1, 1}; - auto padding_begin = CoordinateDiff{0, 0}; - auto padding_end = CoordinateDiff{0, 0}; - - auto conv1 = make_shared(deltas, - filters, - data_batch_shape, - strides, - padding_begin, - padding_end, - dilations); - - auto f = make_shared(conv1, ParameterVector{deltas, filters, data_batch_shape}); - - auto backend = runtime::Backend::create("${BACKEND_NAME}", true); - - auto handle = backend->compile(f); - - auto result = backend->create_dynamic_tensor(element::f32, PartialShape::dynamic()); - - vector filter, delta, expected_result; - - for (int i = 0; i < 6 * 3 * 3 * 3; i++) - filter.emplace_back(i); - - for (int i = 0; i < 2 * 6 * 3 * 3; i++) - delta.emplace_back(i); - - for (int i = 0; i < 2 * 3 * 5 * 5; i++) - expected_result.emplace_back(i); - - vector shapes = {5, 5}; - - // Create some tensors for input/output - auto a = backend->create_tensor(element::f32, shape_delta); - copy_data(a, delta); - auto b = backend->create_tensor(element::f32, shape_filter); - copy_data(b, filter); - auto c = backend->create_tensor(element::i64, Shape{shapes.size()}); // dynamic data batch shape - copy_data(c, shapes); - handle->call_with_validate({result}, {a, b, c}); - EXPECT_FALSE(test::all_close_f(vector{expected_result}, read_vector(result))); -} diff --git a/ngraph/test/visitors/op/convolution.cpp b/ngraph/test/visitors/op/convolution.cpp new file mode 100644 index 00000000000000..baf342a02b729a --- /dev/null +++ b/ngraph/test/visitors/op/convolution.cpp @@ -0,0 +1,42 @@ +// Copyright (C) 2018-2021 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 +// + +#include "gtest/gtest.h" +#include "ngraph/ngraph.hpp" +#include "ngraph/op/util/attr_types.hpp" +#include "ngraph/opsets/opset1.hpp" +#include "ngraph/opsets/opset3.hpp" +#include "ngraph/opsets/opset4.hpp" +#include "ngraph/opsets/opset5.hpp" +#include "util/visitor.hpp" + +using namespace std; +using namespace ngraph; +using ngraph::test::NodeBuilder; +using ngraph::test::ValueMap; + +TEST(attributes, convolution) { + NodeBuilder::get_ops().register_factory(); + auto data = make_shared(element::f32, Shape{1, 16, 124, 124}); + auto filters = make_shared(element::f32, Shape{2, 16, 3, 3}); + auto strides = Strides{1, 1}; + auto pads_begin = CoordinateDiff{1, 2}; + auto pads_end = CoordinateDiff{1, 2}; + auto dilations = Strides{1, 1}; + auto convolution = + make_shared(data, filters, strides, pads_begin, pads_end, dilations, op::PadType::VALID); + + NodeBuilder builder(convolution); + auto g_convolution = ov::as_type_ptr(builder.create()); + + // attribute count + const auto expected_attr_count = 5; + EXPECT_EQ(builder.get_value_map_size(), expected_attr_count); + + EXPECT_EQ(g_convolution->get_strides(), convolution->get_strides()); + EXPECT_EQ(g_convolution->get_pads_begin(), convolution->get_pads_begin()); + EXPECT_EQ(g_convolution->get_pads_end(), convolution->get_pads_end()); + EXPECT_EQ(g_convolution->get_dilations(), convolution->get_dilations()); + EXPECT_EQ(g_convolution->get_auto_pad(), convolution->get_auto_pad()); +}