aboutsummaryrefslogtreecommitdiff
path: root/src/backends/backendsCommon/test/Convolution2dEndToEndTestImpl.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/backendsCommon/test/Convolution2dEndToEndTestImpl.hpp')
-rw-r--r--src/backends/backendsCommon/test/Convolution2dEndToEndTestImpl.hpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/backends/backendsCommon/test/Convolution2dEndToEndTestImpl.hpp b/src/backends/backendsCommon/test/Convolution2dEndToEndTestImpl.hpp
new file mode 100644
index 0000000000..bc9a94289b
--- /dev/null
+++ b/src/backends/backendsCommon/test/Convolution2dEndToEndTestImpl.hpp
@@ -0,0 +1,134 @@
+//
+// Copyright © 2022 Arm Ltd and Contributors. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include "EndToEndTestImpl.hpp"
+#include <armnnUtils/QuantizeHelper.hpp>
+
+#include <ResolveType.hpp>
+
+#include <CommonTestUtils.hpp>
+#include <armnnTestUtils/DataLayoutUtils.hpp>
+
+#include <map>
+#include <vector>
+
+namespace
+{
+
+armnn::INetworkPtr CreateConstConvolution2dNetwork(const armnn::Convolution2dDescriptor& descriptor,
+ const armnn::TensorInfo& inputInfo,
+ const armnn::TensorInfo& weightsInfo,
+ const armnn::TensorInfo& biasInfo,
+ const armnn::TensorInfo& outputInfo,
+ const armnn::ConstTensor& weights,
+ const armnn::ConstTensor& biases,
+ bool biasEnabled)
+{
+ using namespace armnn;
+
+ INetworkPtr network(INetwork::Create());
+ IConnectableLayer* input = network->AddInputLayer(0, "input");
+ IConnectableLayer* weightsLayer = network->AddConstantLayer(weights, "Weights");
+ IConnectableLayer* convolution2d = network->AddConvolution2dLayer(descriptor, "convolution2d");
+ IConnectableLayer* output = network->AddOutputLayer(0, "output");
+
+ Connect(input, convolution2d, inputInfo, 0, 0);
+ Connect(weightsLayer, convolution2d, weightsInfo, 0, 1);
+
+ if(biasEnabled)
+ {
+ armnn::IConnectableLayer* biasLayer = network->AddConstantLayer(biases, "Bias");
+ Connect(biasLayer, convolution2d, biasInfo, 0, 2);
+ }
+
+ Connect(convolution2d, output, outputInfo, 0, 0);
+
+ return network;
+}
+
+template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
+void Convolution2dEndToEnd(const std::vector<armnn::BackendId>& backends,
+ armnn::DataLayout dataLayout,
+ bool biasEnabled = true)
+{
+ using namespace armnn;
+
+ const float qScale = IsQuantizedType<T>() ? 0.25f : 1.0f;
+ const int32_t qOffset = IsQuantizedType<T>() ? 50 : 0;
+
+ TensorInfo inputInfo({ 1, 5, 5, 1 }, ArmnnType, qScale, qOffset, true);
+ TensorInfo outputInfo({ 1, 3, 3, 1 }, ArmnnType, qScale, qOffset);
+ TensorInfo weightsInfo({ 1, 3, 3, 1 }, ArmnnType, qScale, qOffset, true);
+ TensorInfo biasesInfo({ 1 }, ArmnnType, qScale * qScale, 0, true);
+
+ std::vector<float> inputData =
+ {
+ 1.0f, 5.0f, 2.0f, 3.0f, 5.0f,
+ 8.0f, 7.0f, 3.0f, 6.0f, 3.0f,
+ 3.0f, 3.0f, 9.0f, 1.0f, 9.0f,
+ 4.0f, 1.0f, 8.0f, 1.0f, 3.0f,
+ 6.0f, 8.0f, 1.0f, 9.0f, 2.0f
+ };
+
+ std::vector<float> weightsData =
+ {
+ 4.0f, 5.0f, 6.0f,
+ 0.0f, 0.0f, 0.0f,
+ 3.0f, 2.0f, 1.0f
+ };
+
+ std::vector<float> biasesData = { 1.0f };
+
+ float bias = biasEnabled ? biasesData[0] : 0.0f;
+ std::vector<float> expectedOutputData =
+ {
+ 65.0f + bias, 76.0f + bias, 91.0f + bias,
+ 107.0f + bias, 99.0f + bias, 89.0f + bias,
+ 116.0f + bias, 98.0f + bias, 118.0f + bias,
+ };
+
+ Convolution2dDescriptor descriptor;
+ descriptor.m_PadLeft = 0;
+ descriptor.m_PadRight = 0;
+ descriptor.m_PadTop = 0;
+ descriptor.m_PadBottom = 0;
+ descriptor.m_StrideX = 1;
+ descriptor.m_StrideY = 1;
+ descriptor.m_BiasEnabled = biasEnabled;
+ descriptor.m_DataLayout = dataLayout;
+
+ if (dataLayout == DataLayout::NCHW)
+ {
+ PermuteTensorNhwcToNchw(inputInfo, inputData);
+ PermuteTensorNhwcToNchw(weightsInfo, weightsData);
+ PermuteTensorNhwcToNchw(outputInfo, expectedOutputData);
+ }
+
+ // Quantize data
+ std::vector<T> qInputData = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
+ std::vector<T> qWeightsData = armnnUtils::QuantizedVector<T>(weightsData, qScale, qOffset);
+ std::vector<T> qExpectedOutputData = armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset);
+ std::vector<T> qBiasesData = armnnUtils::QuantizedVector<T>(biasesData, qScale * qScale, 0);
+
+ ConstTensor weights(weightsInfo, qWeightsData);
+ ConstTensor biases(biasesInfo, qBiasesData);
+
+ INetworkPtr network = CreateConstConvolution2dNetwork(descriptor,
+ inputInfo,
+ weightsInfo,
+ biasesInfo,
+ outputInfo,
+ weights,
+ biases,
+ biasEnabled);
+
+ EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network),
+ {{ 0, qInputData }},
+ {{ 0, qExpectedOutputData }},
+ backends);
+}
+
+} // anonymous namespace