6 #include "../TestUtils.hpp" 11 #include <boost/test/unit_test.hpp> 13 using namespace armnn;
22 std::unique_ptr<NetworkImpl> CreateTestNetworkImpl()
24 std::unique_ptr<NetworkImpl> network(
new NetworkImpl());
26 auto input = network->AddInputLayer(0,
"input");
28 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
33 permute->GetOutputSlot(0).SetTensorInfo(permuteInfo);
34 input->GetOutputSlot(0).Connect(permute->GetInputSlot(0));
40 auto batchToSpace = network->AddBatchToSpaceNdLayer(batchToSpaceDesc,
"batchToSpace");
42 batchToSpace->GetOutputSlot(0).SetTensorInfo(batchToSpaceInfo);
43 permute->GetOutputSlot(0).Connect(batchToSpace->GetInputSlot(0));
45 auto output = network->AddOutputLayer(0,
"output");
46 batchToSpace->GetOutputSlot(0).Connect(output->GetInputSlot(0));
52 std::unique_ptr<NetworkImpl> CreateTransposeTestNetworkImpl()
55 std::unique_ptr<NetworkImpl> network(
new NetworkImpl());
57 auto input = network->AddInputLayer(0,
"input");
59 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
64 permute->GetOutputSlot(0).SetTensorInfo(permuteInfo);
65 input->GetOutputSlot(0).Connect(permute->GetInputSlot(0));
71 auto batchToSpace = network->AddBatchToSpaceNdLayer(batchToSpaceDesc,
"batchToSpace");
73 batchToSpace->GetOutputSlot(0).SetTensorInfo(batchToSpaceInfo);
74 permute->GetOutputSlot(0).Connect(batchToSpace->GetInputSlot(0));
76 auto output = network->AddOutputLayer(0,
"output");
77 batchToSpace->GetOutputSlot(0).Connect(output->GetInputSlot(0));
88 std::unique_ptr<NetworkImpl> network = CreateTestNetworkImpl();
89 Graph graph = network.get()->GetGraph();
92 BOOST_TEST(
CheckSequence(graph.
cbegin(), graph.
cend(), &IsLayerOfType<InputLayer>, &IsLayerOfType<PermuteLayer>,
93 &IsLayerOfType<BatchToSpaceNdLayer>, &IsLayerOfType<OutputLayer>));
99 auto checkDepthToSpace = [](
const Layer*
const layer) ->
bool {
100 return IsLayerOfType<DepthToSpaceLayer>(layer) &&
101 static_cast<const DepthToSpaceLayer*>(layer)->GetParameters().m_BlockSize == 2 &&
107 &IsLayerOfType<OutputLayer>));
110 std::list<std::string> testRelatedLayers = {
"batchToSpace",
"permute" };
111 BOOST_TEST(CheckRelatedLayers<DepthToSpaceLayer>(graph, testRelatedLayers));
118 std::unique_ptr<NetworkImpl> network = CreateTransposeTestNetworkImpl();
119 Graph graph = network.get()->GetGraph();
122 BOOST_TEST(
CheckSequence(graph.
cbegin(), graph.
cend(), &IsLayerOfType<InputLayer>, &IsLayerOfType<TransposeLayer>,
123 &IsLayerOfType<BatchToSpaceNdLayer>, &IsLayerOfType<OutputLayer>));
129 auto checkDepthToSpace = [](
const Layer*
const layer) ->
bool {
130 return IsLayerOfType<DepthToSpaceLayer>(layer) &&
131 static_cast<const DepthToSpaceLayer*>(layer)->GetParameters().m_BlockSize == 2 &&
137 &IsLayerOfType<OutputLayer>));
140 std::list<std::string> testRelatedLayers = {
"batchToSpace",
"permute" };
141 BOOST_TEST(CheckRelatedLayers<DepthToSpaceLayer>(graph, testRelatedLayers));
145 #if defined(ARMNNREF_ENABLED) 153 auto input = network->AddInputLayer(0,
"input");
155 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
160 permute->GetOutputSlot(0).SetTensorInfo(permuteInfo);
161 input->GetOutputSlot(0).Connect(permute->GetInputSlot(0));
167 auto batchToSpace = network->AddBatchToSpaceNdLayer(batchToSpaceDesc,
"batchToSpace");
169 batchToSpace->GetOutputSlot(0).SetTensorInfo(batchToSpaceInfo);
170 permute->GetOutputSlot(0).Connect(batchToSpace->GetInputSlot(0));
172 auto output = network->AddOutputLayer(0,
"output");
173 batchToSpace->GetOutputSlot(0).Connect(output->GetInputSlot(0));
184 auto input = network->AddInputLayer(0,
"input");
186 input->GetOutputSlot(0).SetTensorInfo(inputInfo);
191 permute->GetOutputSlot(0).SetTensorInfo(permuteInfo);
192 input->GetOutputSlot(0).Connect(permute->GetInputSlot(0));
198 auto batchToSpace = network->AddBatchToSpaceNdLayer(batchToSpaceDesc,
"batchToSpace");
200 batchToSpace->GetOutputSlot(0).SetTensorInfo(batchToSpaceInfo);
201 permute->GetOutputSlot(0).Connect(batchToSpace->GetInputSlot(0));
203 auto output = network->AddOutputLayer(0,
"output");
204 batchToSpace->GetOutputSlot(0).Connect(output->GetInputSlot(0));
220 BOOST_TEST(
CheckSequence(optGraph.cbegin(), optGraph.cend(), &IsLayerOfType<InputLayer>,
221 &IsLayerOfType<DepthToSpaceLayer>, &IsLayerOfType<OutputLayer>));
225 runtime->LoadNetwork(netId, std::move(optimizedNetwork));
227 std::vector<float> inputData{
230 1.0f, 2.0f, 3.0f, 4.0f, 10.0f, 20.0f, 30.0f, 40.0f, 100.0f, 200.0f, 300.0f, 400.0f,
231 -1.0f, -2.0f, -3.0f, -4.0f, -10.0f, -20.0f, -30.0f, -40.0f, -100.0f, -200.0f, -300.0f, -400.0f,
236 std::vector<float> outputData(4 * 6);
239 runtime->EnqueueWorkload(netId, inputs, outputs);
243 std::vector<float> expectedOutput = {
246 1.0f, 2.0f, 10.0f, 20.0f, 100.0f, 200.0f,
247 3.0f, 4.0f, 30.0f, 40.0f, 300.0f, 400.0f,
249 -1.0f, -2.0f, -10.0f, -20.0f, -100.0f, -200.0f,
250 -3.0f, -4.0f, -30.0f, -40.0f, -300.0f, -400.0f,
253 BOOST_TEST(outputData == expectedOutput);
260 INetworkPtr network = CreateTransposeTestNetwork();
267 BOOST_TEST(
CheckSequence(optGraph.cbegin(), optGraph.cend(), &IsLayerOfType<InputLayer>,
268 &IsLayerOfType<DepthToSpaceLayer>, &IsLayerOfType<OutputLayer>));
272 runtime->LoadNetwork(netId, std::move(optimizedNetwork));
274 std::vector<float> inputData{
277 1.0f, 2.0f, 3.0f, 4.0f, 10.0f, 20.0f, 30.0f, 40.0f, 100.0f, 200.0f, 300.0f, 400.0f,
278 -1.0f, -2.0f, -3.0f, -4.0f, -10.0f, -20.0f, -30.0f, -40.0f, -100.0f, -200.0f, -300.0f, -400.0f,
283 std::vector<float> outputData(4 * 6);
286 runtime->EnqueueWorkload(netId, inputs, outputs);
290 std::vector<float> expectedOutput = {
293 1.0f, 2.0f, 10.0f, 20.0f, 100.0f, 200.0f,
294 3.0f, 4.0f, 30.0f, 40.0f, 300.0f, 400.0f,
296 -1.0f, -2.0f, -10.0f, -20.0f, -100.0f, -200.0f,
297 -3.0f, -4.0f, -30.0f, -40.0f, -300.0f, -400.0f,
300 BOOST_TEST(outputData == expectedOutput);
BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
static IRuntimePtr Create(const CreationOptions &options)
CPU Execution: Reference C++ kernels.
Optimizer::Optimizations MakeOptimizations(Args &&... args)
OptimizeForConnection< TransposeLayer, BatchToSpaceNdLayer, PermuteAndBatchToSpaceAsDepthToSpaceImpl< TransposeLayer > > TransposeAndBatchToSpaceAsDepthToSpace
ConstIterator cbegin() const
Returns const iterator pointing to the beginning of the list. Lowercase for range-based for loops...
static void Pass(Graph &graph, const Optimizations &optimizations)
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
Copyright (c) 2021 ARM Limited and Contributors.
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
Private implementation of INetwork.
A tensor defined by a TensorInfo (shape and data type) and a mutable backing store.
OptimizeForConnection< PermuteLayer, BatchToSpaceNdLayer, PermuteAndBatchToSpaceAsDepthToSpaceImpl< PermuteLayer > > PermuteAndBatchToSpaceAsDepthToSpace
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Create an optimized version of the network.
std::vector< unsigned int > m_BlockShape
Block shape values.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
BOOST_AUTO_TEST_CASE(CheckConvolution2dLayer)
Graph & GetGraphForTesting(IOptimizedNetwork *optNet)
BOOST_AUTO_TEST_SUITE_END()
bool CheckSequence(const armnn::Graph::ConstIterator first, const armnn::Graph::ConstIterator last)
A TransposeDescriptor for the TransposeLayer.
ConstIterator cend() const
Returns const iterator pointing to the end of the list. Lowercase for range-based for loops...
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
static INetworkPtr Create(NetworkOptions networkOptions={})
This layer represents a DepthToSpace operation.
A PermuteDescriptor for the PermuteLayer.