13 #include <boost/test/unit_test.hpp> 20 template<
typename armnn::DataType DataType>
21 INetworkPtr CreateConcatNetwork(
const std::vector<TensorShape>& inputShapes,
22 const TensorShape &outputShape,
23 unsigned int concatAxis,
24 const float qScale = 1.0f,
25 const int32_t qOffset = 0)
27 using namespace armnn;
38 for (
unsigned int i = 0; i < inputShapes.size(); ++i)
41 IConnectableLayer* input = net->AddInputLayer(boost::numeric_cast<LayerBindingId>(i));
42 Connect(input, concat, inputTensorInfo, 0, i);
47 Connect(concat, output, outputTensorInfo, 0, 0);
52 template<armnn::DataType ArmnnType>
53 void ConcatDim0EndToEnd(
const std::vector<BackendId>& backends)
55 using namespace armnn;
58 unsigned int concatAxis = 0;
59 const std::vector<TensorShape> inputShapes{{ 2, 3, 2, 2 }, { 2, 3, 2, 2 }};
63 INetworkPtr net = CreateConcatNetwork<ArmnnType>(inputShapes, outputShape, concatAxis);
65 BOOST_TEST_CHECKPOINT(
"create a network");
68 std::vector<T> inputData{
83 std::vector<T> expectedOutput{
110 std::map<int, std::vector<T>> inputTensorData = {{ 0,inputData }, { 1,inputData }};
111 std::map<int, std::vector<T>> expectedOutputData = {{ 0,expectedOutput }};
113 EndToEndLayerTestImpl<ArmnnType, ArmnnType>(move(net), inputTensorData, expectedOutputData, backends);
116 template<armnn::DataType ArmnnType>
117 void ConcatDim1EndToEnd(
const std::vector<BackendId>& backends)
119 using namespace armnn;
122 unsigned int concatAxis = 1;
123 const std::vector<TensorShape> inputShapes{{ 2, 3, 2, 2 }, { 2, 3, 2, 2 }};
127 INetworkPtr net = CreateConcatNetwork<ArmnnType>(inputShapes, outputShape, concatAxis);
129 BOOST_TEST_CHECKPOINT(
"create a network");
132 std::vector<T> inputData{
147 std::vector<T> expectedOutput{
174 std::map<int, std::vector<T>> inputTensorData = {{ 0,inputData }, { 1,inputData }};
175 std::map<int, std::vector<T>> expectedOutputData = {{ 0,expectedOutput }};
177 EndToEndLayerTestImpl<ArmnnType, ArmnnType>(move(net), inputTensorData, expectedOutputData, backends);
180 template<armnn::DataType ArmnnType>
181 void ConcatDim2EndToEnd(
const std::vector<BackendId>& backends)
183 using namespace armnn;
186 unsigned int concatAxis = 2;
187 const std::vector<TensorShape> inputShapes{{ 2, 3, 2, 2 }, { 2, 3, 2, 2 }};
191 INetworkPtr net = CreateConcatNetwork<ArmnnType>(inputShapes, outputShape, concatAxis);
193 BOOST_TEST_CHECKPOINT(
"create a network");
196 std::vector<T> inputData{
211 std::vector<T> expectedOutput{
238 std::map<int, std::vector<T>> inputTensorData = {{ 0,inputData }, { 1,inputData }};
239 std::map<int, std::vector<T>> expectedOutputData = {{ 0,expectedOutput }};
241 EndToEndLayerTestImpl<ArmnnType, ArmnnType>(move(net), inputTensorData, expectedOutputData, backends);
244 template<armnn::DataType ArmnnType,
typename T = armnn::ResolveType<ArmnnType>>
245 void ConcatDim3EndToEnd(
const std::vector<BackendId>& backends)
247 using namespace armnn;
249 unsigned int concatAxis = 3;
250 const std::vector<TensorShape> inputShapes{{ 2, 3, 2, 2 }, { 2, 3, 2, 2 }};
254 INetworkPtr net = CreateConcatNetwork<ArmnnType>(inputShapes, outputShape, concatAxis);
256 BOOST_TEST_CHECKPOINT(
"create a network");
259 std::vector<T> inputData{
274 std::vector<T> expectedOutput{
301 std::map<int, std::vector<T>> inputTensorData = {{ 0,inputData }, { 1,inputData }};
302 std::map<int, std::vector<T>> expectedOutputData = {{ 0,expectedOutput }};
304 EndToEndLayerTestImpl<ArmnnType, ArmnnType>(move(net), inputTensorData, expectedOutputData, backends);
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
typename ResolveTypeImpl< DT >::Type ResolveType
Copyright (c) 2020 ARM Limited.
An OriginsDescriptor for the ConcatLayer.
void Connect(armnn::IConnectableLayer *from, armnn::IConnectableLayer *to, const armnn::TensorInfo &tensorInfo, unsigned int fromIndex, unsigned int toIndex)
OriginsDescriptor CreateDescriptorForConcatenation(TensorShapeIt first, TensorShapeIt last, unsigned int concatenationDimension)
Convenience template to create an OriginsDescriptor to use when creating a ConcatLayer for performing...
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
static INetworkPtr Create()