blob: f4eeaac051e6b1e4701423c09760aca5ecc003e8 [file] [log] [blame]
Matthew Jackson28c94572019-07-18 10:47:03 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Matthew Jackson28c94572019-07-18 10:47:03 +01006#include "ParserFlatbuffersFixture.hpp"
7#include "../TfLiteParser.hpp"
8
9#include <string>
10#include <iostream>
11
Sadik Armagan1625efc2021-06-10 18:24:34 +010012TEST_SUITE("TensorflowLiteParser_L2Normalization")
13{
Matthew Jackson28c94572019-07-18 10:47:03 +010014struct L2NormalizationFixture : public ParserFlatbuffersFixture
15{
16 explicit L2NormalizationFixture(const std::string & inputOutputShape)
17 {
18 m_JsonString = R"(
19 {
20 "version": 3,
21 "operator_codes": [ { "builtin_code": "L2_NORMALIZATION" } ],
22 "subgraphs": [ {
23 "tensors": [
24 {
25 "shape": )" + inputOutputShape + R"(,
26 "type": "FLOAT32",
27 "buffer": 0,
28 "name": "inputTensor",
29 "quantization": {
30 "min": [ 0.0 ],
31 "max": [ 255.0 ],
32 "scale": [ 1.0 ],
33 "zero_point": [ 0 ],
34 }
35 },
36 {
37 "shape": )" + inputOutputShape + R"(,
38 "type": "FLOAT32",
39 "buffer": 1,
40 "name": "outputTensor",
41 "quantization": {
42 "min": [ 0.0 ],
43 "max": [ 255.0 ],
44 "scale": [ 1.0 ],
45 "zero_point": [ 0 ],
46 }
47 }
48 ],
49 "inputs": [ 0 ],
50 "outputs": [ 1 ],
51 "operators": [
52 {
53 "opcode_index": 0,
54 "inputs": [ 0 ],
55 "outputs": [ 1 ],
56 "custom_options_format": "FLEXBUFFERS"
57 }
58 ],
59 } ],
60 "buffers" : [
61 { }
62 ]
63 }
64 )";
65 Setup();
66 }
67};
68
69float CalcL2Norm(std::initializer_list<float> elements)
70{
71 const float reduction = std::accumulate(elements.begin(), elements.end(), 0.0f,
72 [](float acc, float element) { return acc + element * element; });
73 const float eps = 1e-12f;
74 const float max = reduction < eps ? eps : reduction;
75 return sqrtf(max);
76}
77
78struct L2NormalizationFixture4D : L2NormalizationFixture
79{
80 // TfLite uses NHWC shape
81 L2NormalizationFixture4D() : L2NormalizationFixture("[ 1, 1, 4, 3 ]") {}
82};
83
Sadik Armagan1625efc2021-06-10 18:24:34 +010084TEST_CASE_FIXTURE(L2NormalizationFixture4D, "ParseL2Normalization4D")
Matthew Jackson28c94572019-07-18 10:47:03 +010085{
86 RunTest<4, armnn::DataType::Float32>(
87 0,
88 {{"inputTensor", { 1.0f, 2.0f, 3.0f,
89 4.0f, 5.0f, 6.0f,
90 7.0f, 8.0f, 9.0f,
91 10.0f, 11.0f, 12.0f }}},
92
93 {{"outputTensor", { 1.0f / CalcL2Norm({ 1.0f, 2.0f, 3.0f }),
94 2.0f / CalcL2Norm({ 1.0f, 2.0f, 3.0f }),
95 3.0f / CalcL2Norm({ 1.0f, 2.0f, 3.0f }),
96
97 4.0f / CalcL2Norm({ 4.0f, 5.0f, 6.0f }),
98 5.0f / CalcL2Norm({ 4.0f, 5.0f, 6.0f }),
99 6.0f / CalcL2Norm({ 4.0f, 5.0f, 6.0f }),
100
101 7.0f / CalcL2Norm({ 7.0f, 8.0f, 9.0f }),
102 8.0f / CalcL2Norm({ 7.0f, 8.0f, 9.0f }),
103 9.0f / CalcL2Norm({ 7.0f, 8.0f, 9.0f }),
104
105 10.0f / CalcL2Norm({ 10.0f, 11.0f, 12.0f }),
106 11.0f / CalcL2Norm({ 10.0f, 11.0f, 12.0f }),
107 12.0f / CalcL2Norm({ 10.0f, 11.0f, 12.0f }) }}});
108}
109
110struct L2NormalizationSimpleFixture4D : L2NormalizationFixture
111{
112 L2NormalizationSimpleFixture4D() : L2NormalizationFixture("[ 1, 1, 1, 4 ]") {}
113};
114
Sadik Armagan1625efc2021-06-10 18:24:34 +0100115TEST_CASE_FIXTURE(L2NormalizationSimpleFixture4D, "ParseL2NormalizationEps4D")
Matthew Jackson28c94572019-07-18 10:47:03 +0100116{
117 RunTest<4, armnn::DataType::Float32>(
118 0,
119 {{"inputTensor", { 0.00000001f, 0.00000002f, 0.00000003f, 0.00000004f }}},
120
121 {{"outputTensor", { 0.00000001f / CalcL2Norm({ 0.00000001f, 0.00000002f, 0.00000003f, 0.00000004f }),
122 0.00000002f / CalcL2Norm({ 0.00000001f, 0.00000002f, 0.00000003f, 0.00000004f }),
123 0.00000003f / CalcL2Norm({ 0.00000001f, 0.00000002f, 0.00000003f, 0.00000004f }),
124 0.00000004f / CalcL2Norm({ 0.00000001f, 0.00000002f, 0.00000003f, 0.00000004f }) }}});
125}
126
Sadik Armagan1625efc2021-06-10 18:24:34 +0100127}