diff options
Diffstat (limited to 'src/armnn')
-rw-r--r-- | src/armnn/InternalTypes.cpp | 1 | ||||
-rw-r--r-- | src/armnn/InternalTypes.hpp | 1 | ||||
-rw-r--r-- | src/armnn/LayerSupport.cpp | 10 | ||||
-rw-r--r-- | src/armnn/LayersFwd.hpp | 2 | ||||
-rw-r--r-- | src/armnn/Network.cpp | 6 | ||||
-rw-r--r-- | src/armnn/Network.hpp | 3 | ||||
-rw-r--r-- | src/armnn/layers/SpaceToBatchNdLayer.cpp | 79 | ||||
-rw-r--r-- | src/armnn/layers/SpaceToBatchNdLayer.hpp | 30 |
8 files changed, 132 insertions, 0 deletions
diff --git a/src/armnn/InternalTypes.cpp b/src/armnn/InternalTypes.cpp index 67c596eec7..931b6a3579 100644 --- a/src/armnn/InternalTypes.cpp +++ b/src/armnn/InternalTypes.cpp @@ -40,6 +40,7 @@ char const* GetLayerTypeAsCString(LayerType type) case LayerType::Reshape: return "Reshape"; case LayerType::ResizeBilinear: return "ResizeBilinear"; case LayerType::Softmax: return "Softmax"; + case LayerType::SpaceToBatchNd: return "SpaceToBatchNd"; case LayerType::Splitter: return "Splitter"; case LayerType::Subtraction: return "Subtraction"; default: diff --git a/src/armnn/InternalTypes.hpp b/src/armnn/InternalTypes.hpp index 1a612e9426..0661b16649 100644 --- a/src/armnn/InternalTypes.hpp +++ b/src/armnn/InternalTypes.hpp @@ -41,6 +41,7 @@ enum class LayerType Reshape, ResizeBilinear, Softmax, + SpaceToBatchNd, Splitter, // Last layer goes here. LastLayer, diff --git a/src/armnn/LayerSupport.cpp b/src/armnn/LayerSupport.cpp index 249c8f4654..325699d9ff 100644 --- a/src/armnn/LayerSupport.cpp +++ b/src/armnn/LayerSupport.cpp @@ -302,6 +302,16 @@ bool IsSoftmaxSupported(const BackendId& backend, FORWARD_LAYER_SUPPORT_FUNC(backend, IsSoftmaxSupported, input, output, descriptor); } +bool IsSpaceToBatchNdSupported(const BackendId& backend, + const TensorInfo& input, + const TensorInfo& output, + const SpaceToBatchNdDescriptor& descriptor, + char* reasonIfUnsupported, + size_t reasonIfUnsupportedMaxLength) +{ + FORWARD_LAYER_SUPPORT_FUNC(backend, IsSpaceToBatchNdSupported, input, output, descriptor); +} + bool IsSplitterSupported(const BackendId& backend, const TensorInfo& input, const ViewsDescriptor& descriptor, diff --git a/src/armnn/LayersFwd.hpp b/src/armnn/LayersFwd.hpp index 8321be447d..5c08b6677f 100644 --- a/src/armnn/LayersFwd.hpp +++ b/src/armnn/LayersFwd.hpp @@ -33,6 +33,7 @@ #include "layers/ReshapeLayer.hpp" #include "layers/ResizeBilinearLayer.hpp" #include "layers/SoftmaxLayer.hpp" +#include "layers/SpaceToBatchNdLayer.hpp" #include "layers/SplitterLayer.hpp" #include "layers/SubtractionLayer.hpp" @@ -90,6 +91,7 @@ DECLARE_LAYER(Pooling2d) DECLARE_LAYER(Reshape) DECLARE_LAYER(ResizeBilinear) DECLARE_LAYER(Softmax) +DECLARE_LAYER(SpaceToBatchNd) DECLARE_LAYER(Splitter) DECLARE_LAYER(Subtraction) diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp index cab5106959..20c67160c0 100644 --- a/src/armnn/Network.cpp +++ b/src/armnn/Network.cpp @@ -545,6 +545,12 @@ IConnectableLayer* Network::AddReshapeLayer(const ReshapeDescriptor& reshapeDesc return m_Graph->AddLayer<ReshapeLayer>(reshapeDescriptor, name); } +IConnectableLayer* Network::AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor, + const char* name) +{ + return m_Graph->AddLayer<SpaceToBatchNdLayer>(spaceToBatchNdDescriptor, name); +} + IConnectableLayer* Network::AddFloorLayer(const char* name) { return m_Graph->AddLayer<FloorLayer>(name); diff --git a/src/armnn/Network.hpp b/src/armnn/Network.hpp index 129513d657..4a93dd1ee4 100644 --- a/src/armnn/Network.hpp +++ b/src/armnn/Network.hpp @@ -106,6 +106,9 @@ public: IConnectableLayer* AddReshapeLayer(const ReshapeDescriptor& reshapeDescriptor, const char* name = nullptr) override; + IConnectableLayer* AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor, + const char* name = nullptr) override; + IConnectableLayer* AddFloorLayer(const char* name = nullptr) override; IConnectableLayer* AddOutputLayer(LayerBindingId id, const char* name = nullptr) override; diff --git a/src/armnn/layers/SpaceToBatchNdLayer.cpp b/src/armnn/layers/SpaceToBatchNdLayer.cpp new file mode 100644 index 0000000000..9c87ab5975 --- /dev/null +++ b/src/armnn/layers/SpaceToBatchNdLayer.cpp @@ -0,0 +1,79 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "SpaceToBatchNdLayer.hpp" + +#include "LayerCloneBase.hpp" + +#include <armnn/TypesUtils.hpp> +#include <backends/WorkloadData.hpp> +#include <backends/WorkloadFactory.hpp> + +#include <numeric> + +namespace armnn +{ + +SpaceToBatchNdLayer::SpaceToBatchNdLayer(const SpaceToBatchNdDescriptor param, const char* name) + : LayerWithParameters(1, 1, LayerType::SpaceToBatchNd, param, name) +{} + +std::unique_ptr<IWorkload> SpaceToBatchNdLayer::CreateWorkload(const Graph& graph, + const IWorkloadFactory& factory) const +{ + SpaceToBatchNdQueueDescriptor descriptor; + descriptor.m_Parameters.m_BlockShape = m_Param.m_BlockShape; + descriptor.m_Parameters.m_PadList = m_Param.m_PadList; + + return factory.CreateSpaceToBatchNd(descriptor, PrepInfoAndDesc(descriptor, graph)); +} + +SpaceToBatchNdLayer* SpaceToBatchNdLayer::Clone(Graph& graph) const +{ + return CloneBase<SpaceToBatchNdLayer>(graph, m_Param, GetName()); +} + +std::vector<TensorShape> SpaceToBatchNdLayer::InferOutputShapes(const std::vector<TensorShape>& inputShapes) const +{ + BOOST_ASSERT(inputShapes.size() == 1); + + TensorShape inputShape = inputShapes[0]; + TensorShape outputShape(inputShape); + + outputShape[0] = inputShape[0] * std::accumulate(m_Param.m_BlockShape.begin(), + m_Param.m_BlockShape.end(), + 1U, + std::multiplies<>()); + + unsigned int heightIndex = m_Param.m_DataLayout.GetHeightIndex(); + unsigned int widthIndex = m_Param.m_DataLayout.GetWidthIndex(); + + std::pair<unsigned int, unsigned int> heightPad = m_Param.m_PadList[0]; + std::pair<unsigned int, unsigned int> widthPad = m_Param.m_PadList[1]; + + outputShape[heightIndex] = + (inputShape[heightIndex] + heightPad.first + heightPad.second) / m_Param.m_BlockShape[0]; + outputShape[widthIndex] = + (inputShape[widthIndex] + widthPad.first + widthPad.second) / m_Param.m_BlockShape[1]; + + return std::vector<TensorShape>({ outputShape }); +} + +void SpaceToBatchNdLayer::ValidateTensorShapesFromInputs() +{ + VerifyLayerConnections(1, CHECK_LOCATION()); + + std::vector<TensorShape> inferredShapes = InferOutputShapes({ + GetInputSlot(0).GetConnection()->GetTensorInfo().GetShape() }); + + BOOST_ASSERT(inferredShapes.size() == 1); + + ConditionalThrowIfNotEqual<LayerValidationException>( + "SpaceToBatchNdLayer: TensorShape set on OutputSlot[0] does not match the inferred shape.", + GetOutputSlot(0).GetTensorInfo().GetShape(), + inferredShapes[0]); +} + +} // namespace diff --git a/src/armnn/layers/SpaceToBatchNdLayer.hpp b/src/armnn/layers/SpaceToBatchNdLayer.hpp new file mode 100644 index 0000000000..090fb35989 --- /dev/null +++ b/src/armnn/layers/SpaceToBatchNdLayer.hpp @@ -0,0 +1,30 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#pragma once + +#include "LayerWithParameters.hpp" + +namespace armnn +{ + +class SpaceToBatchNdLayer : public LayerWithParameters<SpaceToBatchNdDescriptor> +{ +public: + virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph, + const IWorkloadFactory& factory) const override; + + SpaceToBatchNdLayer* Clone(Graph& graph) const override; + + std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const override; + + void ValidateTensorShapesFromInputs() override; + +protected: + SpaceToBatchNdLayer(const SpaceToBatchNdDescriptor param, const char* name); + ~SpaceToBatchNdLayer() = default; +}; + +} // namespace |