blob: 8ad1036ef167c976de947033e8a0d491202e7242 [file] [log] [blame]
//
// 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()