blob: c6176aef5ba39794985a043a3633f8904e6c2a7e [file] [log] [blame]
Aron Virginas-Tarf97f6da2019-10-01 18:35:44 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include <ResolveType.hpp>
9
Aron Virginas-Tarf97f6da2019-10-01 18:35:44 +010010
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010011#include <QuantizeHelper.hpp>
12
Aron Virginas-Tarf97f6da2019-10-01 18:35:44 +010013#include <backendsCommon/test/DataLayoutUtils.hpp>
Aron Virginas-Tarf97f6da2019-10-01 18:35:44 +010014
15namespace
16{
17
18armnn::INetworkPtr CreateDepthToSpaceNetwork(const armnn::TensorInfo& inputInfo,
19 const armnn::TensorInfo& outputInfo,
20 const armnn::DepthToSpaceDescriptor& descriptor)
21{
22 using namespace armnn;
23
24 INetworkPtr network(INetwork::Create());
25
26 IConnectableLayer* input = network->AddInputLayer(0, "input");
27 IConnectableLayer* depthToSpace = network->AddDepthToSpaceLayer(descriptor, "depthToSpace");
28 IConnectableLayer* output = network->AddOutputLayer(0, "output");
29
30 Connect(input, depthToSpace, inputInfo, 0, 0);
31 Connect(depthToSpace, output, outputInfo, 0, 0);
32
33 return network;
34}
35
36template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
37void DepthToSpaceEndToEndImpl(const std::vector<armnn::BackendId>& backends,
38 const DepthToSpaceDescriptor& descriptor,
39 const armnn::TensorShape& nhwcInputShape,
40 const armnn::TensorShape& nhwcOutputShape,
41 const std::vector<float>& floatInputData,
42 const std::vector<float>& floatExpectedOutputData)
43{
44 using namespace armnn;
45
46 TensorInfo inputInfo(nhwcInputShape, ArmnnType);
47 TensorInfo outputInfo(nhwcOutputShape, ArmnnType);
48
49 constexpr float qScale = 0.25f;
50 constexpr int32_t qOffset = 128;
51
52 // Set quantization parameters for quantized types
53 if (IsQuantizedType<T>())
54 {
55 inputInfo.SetQuantizationScale(qScale);
56 inputInfo.SetQuantizationOffset(qOffset);
57 outputInfo.SetQuantizationScale(qScale);
58 outputInfo.SetQuantizationOffset(qOffset);
59 }
60
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010061 std::vector<T> inputData = armnnUtils::QuantizedVector<T>(floatInputData, qScale, qOffset);
62 std::vector<T> expectedOutputData = armnnUtils::QuantizedVector<T>(floatExpectedOutputData, qScale, qOffset);
Aron Virginas-Tarf97f6da2019-10-01 18:35:44 +010063
64 // Permute tensors from NHWC to NCHW (if needed)
65 if (descriptor.m_DataLayout == DataLayout::NCHW)
66 {
67 PermuteTensorNhwcToNchw(inputInfo, inputData);
68 PermuteTensorNhwcToNchw(outputInfo, expectedOutputData);
69 }
70
71 INetworkPtr network = CreateDepthToSpaceNetwork(inputInfo, outputInfo, descriptor);
72 EndToEndLayerTestImpl<ArmnnType, ArmnnType>(std::move(network),
73 { { 0, inputData } },
74 { { 0, expectedOutputData } },
75 backends);
76}
77
78} // anonymous namespace
79
80template<armnn::DataType ArmnnType>
81void DepthToSpaceEndToEnd(const std::vector<armnn::BackendId>& defaultBackends,
82 armnn::DataLayout dataLayout)
83{
84 using namespace armnn;
85
86 TensorShape inputShape = { 2, 2, 2, 4 };
87 TensorShape outputShape = { 2, 4, 4, 1 };
88
89 std::vector<float> inputData =
90 {
91 1.f, 2.f, 3.f, 4.f,
92 5.f, 6.f, 7.f, 8.f,
93 9.f, 10.f, 11.f, 12.f,
94 13.f, 14.f, 15.f, 16.f,
95
96 17.f, 18.f, 19.f, 20.f,
97 21.f, 22.f, 23.f, 24.f,
98 25.f, 26.f, 27.f, 28.f,
99 29.f, 30.f, 31.f, 32.f
100 };
101
102 std::vector<float> expectedOutputData =
103 {
104 1.f, 2.f, 5.f, 6.f,
105 3.f, 4.f, 7.f, 8.f,
106 9.f, 10.f, 13.f, 14.f,
107 11.f, 12.f, 15.f, 16.f,
108
109 17.f, 18.f, 21.f, 22.f,
110 19.f, 20.f, 23.f, 24.f,
111 25.f, 26.f, 29.f, 30.f,
112 27.f, 28.f, 31.f, 32.f
113 };
114
115 DepthToSpaceEndToEndImpl<ArmnnType>(defaultBackends,
116 DepthToSpaceDescriptor(2, dataLayout),
117 inputShape,
118 outputShape,
119 inputData,
120 expectedOutputData);
121}