blob: cbb6c355a4c33526b91d7c7ea6eeda97c4ef6dac [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 "armnnOnnxParser/IOnnxParser.hpp"
#include "ParserPrototxtFixture.hpp"
BOOST_AUTO_TEST_SUITE(OnnxParser)
// A MatMul in isolation, not connected to an add. Should result in a non-biased FullyConnected layer.
struct MatMulFixture : public armnnUtils::ParserPrototxtFixture<armnnOnnxParser::IOnnxParser>
{
MatMulFixture()
{
m_Prototext = R"(
ir_version: 3
producer_name: "CNTK "
producer_version: "2.5.1 "
domain: "ai.cntk "
model_version: 1
graph {
name: "CNTKGraph "
input {
name: "Input"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
input {
name: "Const"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
initializer {
dims: 1
data_type: FLOAT
float_data: 17.0
name: "Const"
}
node {
input: "Input"
input: "Const"
output: "Output"
name: "SimpleMatmul"
op_type: "MatMul"
}
output {
name: "Output"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
}
opset_import {
version: 7
})";
Setup();
}
};
BOOST_FIXTURE_TEST_CASE(MatMul, MatMulFixture)
{
RunTest<1>({{"Input", { 2 }}}, {{"Output", { 34 }}});
}
// In Onnx fully connected layers are expressed as a MatMul followed by an Add.
// The OnnxParser must detect this case and convert them to a FullyConnected layer.
struct FullyConnectedFixture : public armnnUtils::ParserPrototxtFixture<armnnOnnxParser::IOnnxParser>
{
FullyConnectedFixture()
{
m_Prototext = R"(
ir_version: 3
producer_name: "CNTK "
producer_version: "2.5.1 "
domain: "ai.cntk "
model_version: 1
graph {
name: "CNTKGraph "
input {
name: "Input"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
input {
name: "Weight"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
initializer {
dims: 1
data_type: FLOAT
float_data: 2
name: "Weight"
}
input {
name: "Bias"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
}
}
}
}
initializer {
dims: 1
data_type: FLOAT
float_data: 1
name: "Bias"
}
node {
input: "Input"
input: "Weight"
output: "AddInput"
name: "FCMatmul"
op_type: "MatMul"
}
node {
input: "AddInput"
input: "Bias"
output: "Output"
name: "FCAdd"
op_type: "Add"
}
value_info {
name: "AddInput"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
output {
name: "Output"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
}
opset_import {
version: 7
})";
Setup();
}
};
BOOST_FIXTURE_TEST_CASE(FullyConnected, FullyConnectedFixture)
{
RunTest<1>({{"Input", { 3 }}}, {{"Output", { 7 }}});
}
// Similar to FullyConnectedFixture, but this time the MatMul's output is used by two Adds. This should result
// in two FullyConnected layers being created.
// I
// |
// M -- C
// / \'
// C-- A A -- C
// \ /
// A
struct MatMulUsedInTwoFcFixture : public armnnUtils::ParserPrototxtFixture<armnnOnnxParser::IOnnxParser>
{
MatMulUsedInTwoFcFixture()
{
m_Prototext = R"(
ir_version: 3
producer_name: "CNTK "
producer_version: "2.5.1 "
domain: "ai.cntk "
model_version: 1
graph {
name: "CNTKGraph "
input {
name: "Input"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
input {
name: "Weight"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
initializer {
dims: 1
data_type: FLOAT
float_data: 2
name: "Weight"
}
input {
name: "Bias"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
}
}
}
}
initializer {
dims: 1
data_type: FLOAT
float_data: 1
name: "Bias"
}
input {
name: "Bias_1"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
}
}
}
}
initializer {
dims: 1
data_type: FLOAT
float_data: 10.0
name: "Bias_1"
}
node {
input: "Input"
input: "Weight"
output: "AddInput"
name: "FCMatmul"
op_type: "MatMul"
}
node {
input: "AddInput"
input: "Bias"
output: "AddOutput"
name: "FCAdd"
op_type: "Add"
}
node {
input: "AddInput"
input: "Bias_1"
output: "AddOutput_1"
name: "FCAdd_1"
op_type: "Add"
}
node {
input: "AddOutput"
input: "AddOutput_1"
output: "Output"
name: "FinalAdd"
op_type: "Add"
}
value_info {
name: "AddInput"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
value_info {
name: "AddOutput"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
value_info {
name: "AddOutput_1"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
output {
name: "Output"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
}
opset_import {
version: 7
})";
Setup();
}
};
BOOST_FIXTURE_TEST_CASE(MatMulUsedInTwoFc, MatMulUsedInTwoFcFixture)
{
RunTest<1>({{"Input", { 3 }}}, {{"Output", { 23 }}});
}
// Similar to MatMulUsedInTwoFc, but this time the Adds are 'staggered' (see diagram), which means that only one
// FullyConnected layer can be created (the other should just be an Add).
// I
// |
// M -- C1
// / \'
// C2 -- A |
// \ /
// A
struct MatMulUsedInTwoFcStaggeredFixture : public armnnUtils::ParserPrototxtFixture<armnnOnnxParser::IOnnxParser>
{
MatMulUsedInTwoFcStaggeredFixture()
{
m_Prototext = R"(
ir_version: 3
producer_name: "CNTK "
producer_version: "2.5.1 "
domain: "ai.cntk "
model_version: 1
graph {
name: "CNTKGraph "
input {
name: "Input"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
input {
name: "Weight"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
initializer {
dims: 1
data_type: FLOAT
float_data: 2
name: "Weight"
}
input {
name: "Bias"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
}
}
}
}
initializer {
dims: 1
data_type: FLOAT
float_data: 1
name: "Bias"
}
node {
input: "Input"
input: "Weight"
output: "AddInput"
name: "MatmulFC&NFC"
op_type: "MatMul"
}
node {
input: "AddInput"
input: "Bias"
output: "AddOutput"
name: "FCAdd"
op_type: "Add"
}
node {
input: "AddInput"
input: "AddOutput"
output: "Output"
name: "FinalAdd"
op_type: "Add"
}
value_info {
name: "AddInput"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
value_info {
name: "AddOutput"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
output {
name: "Output"
type {
tensor_type {
elem_type: FLOAT
shape {
dim {
dim_value: 1
}
dim {
dim_value: 1
}
}
}
}
}
}
opset_import {
version: 7
})";
Setup();
}
};
BOOST_FIXTURE_TEST_CASE(MatMulUsedInTwoFcStaggered, MatMulUsedInTwoFcStaggeredFixture)
{
RunTest<1>({{"Input", { 3 }}}, {{"Output", { 13 }}});
}
BOOST_AUTO_TEST_SUITE_END()