blob: c300bc72bfbd108f26e6ded4bd7e3fc695ea24b3 [file] [log] [blame]
Sadik Armagan6e36a642020-11-10 21:18:41 +00001//
2// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "FullyConnectedTestHelper.hpp"
7
8namespace
9{
10
Sadik Armaganf0a6dec2021-03-25 07:46:55 +000011void FullyConnectedFp32Test(std::vector<armnn::BackendId>& backends, bool constantWeights = true)
Sadik Armagan6e36a642020-11-10 21:18:41 +000012{
13 std::vector<int32_t> inputTensorShape { 1, 4, 1, 1 };
14 std::vector<int32_t> weightsTensorShape { 1, 4 };
15 std::vector<int32_t> biasTensorShape { 1 };
16 std::vector<int32_t> outputTensorShape { 1, 1 };
17
18 std::vector<float> inputValues = { 10, 20, 30, 40 };
19 std::vector<float> weightsData = { 2, 3, 4, 5 };
20
21 std::vector<float> expectedOutputValues = { (400 + 10) };
22
23 // bias is set std::vector<float> biasData = { 10 } in the model
24 FullyConnectedTest<float>(backends,
25 ::tflite::TensorType_FLOAT32,
26 tflite::ActivationFunctionType_NONE,
27 inputTensorShape,
28 weightsTensorShape,
29 biasTensorShape,
30 outputTensorShape,
31 inputValues,
32 expectedOutputValues,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +000033 weightsData,
34 constantWeights);
Sadik Armagan6e36a642020-11-10 21:18:41 +000035}
36
Matthew Sloyan81beae32021-07-13 19:46:11 +010037void FullyConnectedActivationTest(std::vector<armnn::BackendId>& backends, bool constantWeights = true)
Sadik Armagan6e36a642020-11-10 21:18:41 +000038{
39 std::vector<int32_t> inputTensorShape { 1, 4, 1, 1 };
40 std::vector<int32_t> weightsTensorShape { 1, 4 };
41 std::vector<int32_t> biasTensorShape { 1 };
42 std::vector<int32_t> outputTensorShape { 1, 1 };
43
44 std::vector<float> inputValues = { -10, 20, 30, 40 };
45 std::vector<float> weightsData = { 2, 3, 4, -5 };
46
47 std::vector<float> expectedOutputValues = { 0 };
48
49 // bias is set std::vector<float> biasData = { 10 } in the model
50 FullyConnectedTest<float>(backends,
51 ::tflite::TensorType_FLOAT32,
52 tflite::ActivationFunctionType_RELU,
53 inputTensorShape,
54 weightsTensorShape,
55 biasTensorShape,
56 outputTensorShape,
57 inputValues,
58 expectedOutputValues,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +000059 weightsData,
60 constantWeights);
Sadik Armagan6e36a642020-11-10 21:18:41 +000061}
62
Sadik Armaganf0a6dec2021-03-25 07:46:55 +000063void FullyConnectedInt8Test(std::vector<armnn::BackendId>& backends, bool constantWeights = true)
Sadik Armagan6e36a642020-11-10 21:18:41 +000064{
65 std::vector<int32_t> inputTensorShape { 1, 4, 2, 1 };
66 std::vector<int32_t> weightsTensorShape { 1, 4 };
67 std::vector<int32_t> biasTensorShape { 1 };
68 std::vector<int32_t> outputTensorShape { 2, 1 };
69
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +000070 std::vector<int8_t> inputValues = { 1, 2, 3, 4, 5, 10, 15, 20 };
71 std::vector<int8_t> weightsData = { 2, 3, 4, 5 };
Sadik Armagan6e36a642020-11-10 21:18:41 +000072
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +000073 std::vector<int8_t> expectedOutputValues = { 25, 105 }; // (40 + 10) / 2, (200 + 10) / 2
Sadik Armagan6e36a642020-11-10 21:18:41 +000074
75 // bias is set std::vector<int32_t> biasData = { 10 } in the model
76 // input and weights quantization scale 1.0f and offset 0 in the model
77 // output quantization scale 2.0f and offset 0 in the model
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +000078 FullyConnectedTest<int8_t>(backends,
79 ::tflite::TensorType_INT8,
80 tflite::ActivationFunctionType_NONE,
81 inputTensorShape,
82 weightsTensorShape,
83 biasTensorShape,
84 outputTensorShape,
85 inputValues,
86 expectedOutputValues,
Sadik Armaganf0a6dec2021-03-25 07:46:55 +000087 weightsData,
88 constantWeights);
Sadik Armagan6e36a642020-11-10 21:18:41 +000089}
90
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +000091TEST_SUITE("FullyConnected_GpuAccTests")
Sadik Armagan6e36a642020-11-10 21:18:41 +000092{
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +000093
94TEST_CASE ("FullyConnected_FP32_GpuAcc_Test")
95{
96 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
Sadik Armagan6e36a642020-11-10 21:18:41 +000097 FullyConnectedFp32Test(backends);
98}
99
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +0000100TEST_CASE ("FullyConnected_Int8_GpuAcc_Test")
Sadik Armagan6e36a642020-11-10 21:18:41 +0000101{
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +0000102 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
103 FullyConnectedInt8Test(backends);
Sadik Armagan6e36a642020-11-10 21:18:41 +0000104}
105
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +0000106TEST_CASE ("FullyConnected_Activation_GpuAcc_Test")
Sadik Armagan6e36a642020-11-10 21:18:41 +0000107{
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +0000108 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
Matthew Sloyan81beae32021-07-13 19:46:11 +0100109 FullyConnectedActivationTest(backends);
Sadik Armagan6e36a642020-11-10 21:18:41 +0000110}
111
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +0000112} // End of TEST_SUITE("FullyConnected_GpuAccTests")
113
114TEST_SUITE("FullyConnected_CpuAccTests")
115{
116
117TEST_CASE ("FullyConnected_FP32_CpuAcc_Test")
118{
119 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
120 FullyConnectedFp32Test(backends);
121}
122
123TEST_CASE ("FullyConnected_Int8_CpuAcc_Test")
124{
125 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
126 FullyConnectedInt8Test(backends);
127}
128
129TEST_CASE ("FullyConnected_Activation_CpuAcc_Test")
130{
131 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
Matthew Sloyan81beae32021-07-13 19:46:11 +0100132 FullyConnectedActivationTest(backends);
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +0000133}
134
135} // End of TEST_SUITE("FullyConnected_CpuAccTests")
136
137TEST_SUITE("FullyConnected_CpuRefTests")
138{
139
140TEST_CASE ("FullyConnected_FP32_CpuRef_Test")
141{
142 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
143 FullyConnectedFp32Test(backends);
144}
145
146TEST_CASE ("FullyConnected_Int8_CpuRef_Test")
147{
148 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
149 FullyConnectedInt8Test(backends);
150}
151
152TEST_CASE ("FullyConnected_Activation_CpuRef_Test")
153{
154 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Matthew Sloyan81beae32021-07-13 19:46:11 +0100155 FullyConnectedActivationTest(backends);
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +0000156}
157
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000158TEST_CASE ("FullyConnected_Weights_As_Inputs_FP32_CpuRef_Test")
159{
160 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
161 FullyConnectedFp32Test(backends, false);
162}
163
164TEST_CASE ("FullyConnected_Weights_As_Inputs_Int8_CpuRef_Test")
165{
166 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
167 FullyConnectedInt8Test(backends, false);
168}
169
170TEST_CASE ("FullyConnected_Weights_As_Inputs_Activation_CpuRef_Test")
171{
172 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
Matthew Sloyan81beae32021-07-13 19:46:11 +0100173 FullyConnectedActivationTest(backends, false);
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000174}
175
Narumol Prangnawarat55518ca2020-11-20 14:50:54 +0000176} // End of TEST_SUITE("FullyConnected_CpuRefTests")
Sadik Armagan6e36a642020-11-10 21:18:41 +0000177
178} // anonymous namespace