| // |
| // Copyright © 2017 Arm Ltd. All rights reserved. |
| // See LICENSE file in the project root for full license information. |
| // |
| |
| #include <boost/test/unit_test.hpp> |
| #include "armnnTfParser/ITfParser.hpp" |
| #include "ParserPrototxtFixture.hpp" |
| #include <string> |
| #include <iostream> |
| |
| BOOST_AUTO_TEST_SUITE(TensorflowParser) |
| |
| struct Convolution2dFixture : public armnnUtils::ParserPrototxtFixture<armnnTfParser::ITfParser> |
| { |
| explicit Convolution2dFixture(const char* paddingType) |
| : Convolution2dFixture(paddingType, 1) |
| {} |
| |
| // Dilation: 0 - dilations attribute is not included; |
| // Dilation: >0 - dilations attribute set to [1,v,v,1], where v is the value of the dilation arg |
| explicit Convolution2dFixture(const char* paddingType, int stride, int dilation = 0) |
| { |
| std::string strideString = std::to_string(stride); |
| std::string dilationString = std::to_string(dilation); |
| m_Prototext = "node { \n" |
| " name: \"graphInput\" \n" |
| " op: \"Placeholder\" \n" |
| " attr { \n" |
| " key: \"dtype\" \n" |
| " value { \n" |
| " type: DT_FLOAT \n" |
| " } \n" |
| " } \n" |
| " attr { \n" |
| " key: \"shape\" \n" |
| " value { \n" |
| " shape { \n" |
| " } \n" |
| " } \n" |
| " } \n" |
| " } \n" |
| " node { \n" |
| " name: \"Const_1\" \n" |
| " op: \"Const\" \n" |
| " attr { \n" |
| " key: \"dtype\" \n" |
| " value { \n" |
| " type: DT_FLOAT \n" |
| " } \n" |
| " } \n" |
| " attr { \n" |
| " key: \"value\" \n" |
| " value { \n" |
| " tensor { \n" |
| " dtype: DT_FLOAT \n" |
| " tensor_shape { \n" |
| " dim { \n" |
| " size: 1 \n" |
| " } \n" |
| " dim { \n" |
| " size: 3 \n" |
| " } \n" |
| " dim { \n" |
| " size: 1 \n" |
| " } \n" |
| " dim { \n" |
| " size: 1 \n" |
| " } \n" |
| " } \n" |
| " tensor_content: \"\\000\\000\\000?\\000\\000\\200?\\000\\000\\000?\" \n" |
| " } \n" |
| " } \n" |
| " } \n" |
| "} \n" |
| "node { \n" |
| " name: \"potato\" \n" |
| " op: \"Conv2D\" \n" |
| " input: \"graphInput\" \n" |
| " input: \"Const_1\" \n" |
| " attr { \n" |
| " key: \"T\" \n" |
| " value { \n" |
| " type: DT_FLOAT \n" |
| " } \n" |
| " } \n" |
| " attr { \n" |
| " key: \"data_format\" \n" |
| " value { \n" |
| " s: \"NHWC\" \n" |
| " } \n" |
| " } \n" |
| " attr { \n" |
| " key: \"padding\" \n" |
| " value { \n" |
| " s: \""; |
| m_Prototext.append(paddingType); |
| m_Prototext.append("\"\n" |
| " } \n" |
| " } \n" |
| " attr { \n" |
| " key: \"strides\" \n" |
| " value { \n" |
| " list { \n" |
| " i: 1 \n" |
| " i: 1 \n" |
| " i: "); |
| m_Prototext.append(strideString); |
| m_Prototext.append(" \n" |
| " i: 1 \n" |
| " } \n" |
| " } \n" |
| " } \n"); |
| |
| if (dilation > 0) |
| { |
| m_Prototext.append(" attr { \n" |
| " key: \"dilations\" \n" |
| " value { \n" |
| " list { \n" |
| " i: 1 \n" |
| " i: "); |
| m_Prototext.append(dilationString); |
| m_Prototext.append(" \n" |
| " i: "); |
| m_Prototext.append(dilationString); |
| m_Prototext.append(" \n" |
| " i: 1 \n" |
| " } \n" |
| " } \n" |
| " } \n"); |
| } |
| m_Prototext.append(" attr { \n" |
| " key: \"use_cudnn_on_gpu\" \n" |
| " value { \n" |
| " b: false \n" |
| " } \n" |
| " } \n" |
| "} \n"); |
| |
| // Manual height computation based on stride parameter. |
| BOOST_ASSERT_MSG(stride == 1 || stride==2, "Add support for strides other than 1 or 2."); |
| unsigned int dims[] = {1,2,3,1}; |
| if (stride == 2) |
| { |
| dims[1]=3; |
| } |
| |
| SetupSingleInputSingleOutput(armnn::TensorShape(4, dims), "graphInput", "potato"); |
| } |
| }; |
| |
| |
| struct Convolution2dSameFixture : Convolution2dFixture |
| { |
| Convolution2dSameFixture() : Convolution2dFixture("SAME", 1){} |
| }; |
| BOOST_FIXTURE_TEST_CASE(ParseConv2DSame, Convolution2dSameFixture) |
| { |
| RunTest<4>({1, 2, 3, 4, 5, 6}, {2, 4, 4, 6.5f, 10 , 8.5f}); |
| } |
| |
| struct Convolution2dValidFixture : Convolution2dFixture |
| { |
| Convolution2dValidFixture() : Convolution2dFixture("VALID", 1){} |
| }; |
| BOOST_FIXTURE_TEST_CASE(ParseConv2DValid, Convolution2dValidFixture) |
| { |
| RunTest<4>({1, 2, 3, 4, 5, 6}, {4, 10}); |
| } |
| |
| |
| struct Convolution2dStride2SameFixture : Convolution2dFixture |
| { |
| Convolution2dStride2SameFixture() : Convolution2dFixture("SAME", 2){} |
| }; |
| BOOST_FIXTURE_TEST_CASE(ParseConv2DStride2Same, Convolution2dStride2SameFixture) |
| { |
| RunTest<4>({1, 2, 3, 4, 5, 6, 7, 8, 9}, {2, 4, 6.5, 8.5, 11, 13}); |
| } |
| |
| |
| struct Convolution2dStride2ValidFixture : Convolution2dFixture |
| { |
| Convolution2dStride2ValidFixture() : Convolution2dFixture("VALID", 2){} |
| }; |
| BOOST_FIXTURE_TEST_CASE(ParseConv2DStride2Valid, Convolution2dStride2ValidFixture) |
| { |
| RunTest<4>({1, 2, 3, 4, 5, 6, 7, 8, 9}, {4, 10, 16}); |
| } |
| |
| |
| struct Convolution2dDilation1Fixture : Convolution2dFixture |
| { |
| Convolution2dDilation1Fixture() : Convolution2dFixture("SAME", 1, 1){} |
| }; |
| BOOST_FIXTURE_TEST_CASE(ParseConv2DDilation1, Convolution2dDilation1Fixture) |
| { |
| RunTest<4>({1, 2, 3, 4, 5, 6}, {2, 4, 4, 6.5f, 10 , 8.5f}); |
| } |
| |
| BOOST_AUTO_TEST_CASE(ParseConv2DDilation2) |
| { |
| const char* prototext = "" |
| "node {\n" |
| " name: \"graphInput\"\n" |
| " op: \"Placeholder\"\n" |
| " attr {\n" |
| " key: \"dtype\"\n" |
| " value {\n" |
| " type: DT_FLOAT\n" |
| " }\n" |
| " }\n" |
| " attr {\n" |
| " key: \"shape\"\n" |
| " value {\n" |
| " shape {\n" |
| " }\n" |
| " }\n" |
| " }\n" |
| "}\n" |
| "node {\n" |
| " name: \"Const_1\"\n" |
| " op: \"Const\"\n" |
| " attr {\n" |
| " key: \"dtype\"\n" |
| " value {\n" |
| " type: DT_FLOAT\n" |
| " }\n" |
| " }\n" |
| " attr {\n" |
| " key: \"value\"\n" |
| " value {\n" |
| " tensor {\n" |
| " dtype: DT_FLOAT\n" |
| " tensor_shape {\n" |
| " dim {\n" |
| " size: 1\n" |
| " }\n" |
| " dim {\n" |
| " size: 3\n" |
| " }\n" |
| " dim {\n" |
| " size: 1\n" |
| " }\n" |
| " dim {\n" |
| " size: 1\n" |
| " }\n" |
| " }\n" |
| " tensor_content: \"\\000\\000\\000?\\000\\000\\200?\\000\\000\\000?\"\n" |
| " }\n" |
| " }\n" |
| " }\n" |
| "}\n" |
| "node {\n" |
| " name: \"potato\"\n" |
| " op: \"Conv2D\"\n" |
| " input: \"graphInput\"\n" |
| " input: \"Const_1\"\n" |
| " attr {\n" |
| " key: \"T\"\n" |
| " value {\n" |
| " type: DT_FLOAT\n" |
| " }\n" |
| " }\n" |
| " attr {\n" |
| " key: \"data_format\"\n" |
| " value {\n" |
| " s: \"NHWC\"\n" |
| " }\n" |
| " }\n" |
| " attr {\n" |
| " key: \"padding\"\n" |
| " value {\n" |
| " s: \"SAME\"\n" |
| " }\n" |
| " }\n" |
| " attr {\n" |
| " key: \"strides\"\n" |
| " value {\n" |
| " list {\n" |
| " i: 1\n" |
| " i: 1\n" |
| " i: 1\n" |
| " i: 1\n" |
| " }\n" |
| " }\n" |
| " }\n" |
| " attr {\n" |
| " key: \"dilations\"\n" |
| " value {\n" |
| " list {\n" |
| " i: 1\n" |
| " i: 2\n" |
| " i: 2\n" |
| " i: 1\n" |
| " }\n" |
| " }\n" |
| " }\n" |
| " attr {\n" |
| " key: \"use_cudnn_on_gpu\"\n" |
| " value {\n" |
| " b: false\n" |
| " }\n" |
| " }\n" |
| "}\n"; |
| |
| std::map<std::string, armnn::TensorShape> inputShapes; |
| armnn::TensorShape tensorShape = { 1, 3, 3, 1 }; |
| inputShapes["graphInput"] = tensorShape; |
| armnnTfParser::ITfParserPtr parser = armnnTfParser::ITfParser::Create(); |
| BOOST_CHECK_THROW(parser->CreateNetworkFromString(prototext, inputShapes, { "potato" }), |
| armnn::ParseException); |
| } |
| |
| |
| BOOST_AUTO_TEST_SUITE_END() |