aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohamed Nour Abouelseoud <mohamednour.abouelseoud@arm.com>2018-09-24 13:30:09 +0100
committerMatthew Bentham <matthew.bentham@arm.com>2018-10-10 16:16:57 +0100
commit5662c206864df4121eea29c541c24c0f62113809 (patch)
treef80aa8a094dc3ede6d2c7e4a905ac2f278199268
parent351d13d0b5fa698b72130012b2f069d30b911cb3 (diff)
downloadarmnn-5662c206864df4121eea29c541c24c0f62113809.tar.gz
IVGCVSW-1881 Add PadLayer to ArmNN
Change-Id: Ib70883a20fa7b82bfb090aa98cc51a6d645b5722
-rw-r--r--Android.mk1
-rw-r--r--CMakeLists.txt2
-rw-r--r--include/armnn/Descriptors.hpp7
-rw-r--r--include/armnn/DescriptorsFwd.hpp1
-rw-r--r--include/armnn/INetwork.hpp9
-rw-r--r--include/armnn/LayerSupport.hpp7
-rw-r--r--src/armnn/InternalTypes.hpp1
-rw-r--r--src/armnn/LayerSupport.cpp11
-rw-r--r--src/armnn/LayersFwd.hpp2
-rw-r--r--src/armnn/Network.cpp5
-rw-r--r--src/armnn/Network.hpp2
-rw-r--r--src/armnn/layers/PadLayer.cpp45
-rw-r--r--src/armnn/layers/PadLayer.hpp29
-rw-r--r--src/backends/WorkloadFactory.cpp13
-rw-r--r--src/backends/test/IsLayerSupportedTestImpl.hpp2
15 files changed, 136 insertions, 1 deletions
diff --git a/Android.mk b/Android.mk
index 4d0664b1cf..092464824c 100644
--- a/Android.mk
+++ b/Android.mk
@@ -99,6 +99,7 @@ LOCAL_SRC_FILES := \
src/armnn/layers/MultiplicationLayer.cpp \
src/armnn/layers/NormalizationLayer.cpp \
src/armnn/layers/OutputLayer.cpp \
+ src/armnn/layers/PadLayer.cpp \
src/armnn/layers/PermuteLayer.cpp \
src/armnn/layers/Pooling2dLayer.cpp \
src/armnn/layers/DivisionLayer.cpp \
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8ddad9982b..cfbbae6808 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -199,6 +199,8 @@ list(APPEND armnn_sources
src/armnn/layers/NormalizationLayer.cpp
src/armnn/layers/OutputLayer.hpp
src/armnn/layers/OutputLayer.cpp
+ src/armnn/layers/PadLayer.hpp
+ src/armnn/layers/PadLayer.cpp
src/armnn/layers/PermuteLayer.hpp
src/armnn/layers/PermuteLayer.cpp
src/armnn/layers/Pooling2dLayer.hpp
diff --git a/include/armnn/Descriptors.hpp b/include/armnn/Descriptors.hpp
index dfd532f633..7fd36d5873 100644
--- a/include/armnn/Descriptors.hpp
+++ b/include/armnn/Descriptors.hpp
@@ -351,7 +351,12 @@ struct MeanDescriptor
struct PadDescriptor
{
- PadDescriptor(const std::vector<std::pair<unsigned int, unsigned int>>& padList);
+ PadDescriptor()
+ {}
+
+ PadDescriptor(const std::vector<std::pair<unsigned int, unsigned int>>& padList)
+ : m_PadList(padList)
+ {}
// first is number of values to add before the tensor in the dimension,
// second is the number of values to add after the tensor in the dimension
diff --git a/include/armnn/DescriptorsFwd.hpp b/include/armnn/DescriptorsFwd.hpp
index b161df8827..9cb3463b28 100644
--- a/include/armnn/DescriptorsFwd.hpp
+++ b/include/armnn/DescriptorsFwd.hpp
@@ -16,6 +16,7 @@ struct LstmDescriptor;
struct PermuteDescriptor;
struct NormalizationDescriptor;
struct MeanDescriptor;
+struct PadDescriptor;
struct Pooling2dDescriptor;
struct ReshapeDescriptor;
struct ResizeBilinearDescriptor;
diff --git a/include/armnn/INetwork.hpp b/include/armnn/INetwork.hpp
index 7fd7a25b60..1d2679aabb 100644
--- a/include/armnn/INetwork.hpp
+++ b/include/armnn/INetwork.hpp
@@ -285,6 +285,15 @@ public:
/// @ return - Interface for configuring the layer.
virtual IConnectableLayer* AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name = nullptr) = 0;
+ /// Adds a fully pad layer to the network.
+ /// @param paddings - n by 2 tensor, where n is the rank of the input tensor,
+ /// such that paddings[i,0] indicates the amount of padding to add in front of dimonsion i, and
+ /// paddings[i,1] indicates the amount of padding to add after the end of dimension i
+ /// @param name - Optional name for the layer.
+ /// @return - Interface for configuring the layer.
+ virtual IConnectableLayer* AddPadLayer(const PadDescriptor& padDescriptor,
+ const char* name = nullptr) = 0;
+
protected:
~INetwork() {}
};
diff --git a/include/armnn/LayerSupport.hpp b/include/armnn/LayerSupport.hpp
index d00691fad1..3c7cce5c64 100644
--- a/include/armnn/LayerSupport.hpp
+++ b/include/armnn/LayerSupport.hpp
@@ -203,4 +203,11 @@ bool IsMeanSupported(Compute compute,
char* reasonIfUnsupported = nullptr,
size_t reasonIfUnsupportedMaxLength = 1024);
+bool IsPadSupported(Compute compute,
+ const TensorInfo& input,
+ const TensorInfo& output,
+ const PadDescriptor& descriptor,
+ char* reasonIfUnsupported = nullptr,
+ size_t reasonIfUnsupportedMaxLength = 1024);
+
}
diff --git a/src/armnn/InternalTypes.hpp b/src/armnn/InternalTypes.hpp
index 13ab2bc7cd..1a612e9426 100644
--- a/src/armnn/InternalTypes.hpp
+++ b/src/armnn/InternalTypes.hpp
@@ -35,6 +35,7 @@ enum class LayerType
Multiplication,
Normalization,
Output,
+ Pad,
Permute,
Pooling2d,
Reshape,
diff --git a/src/armnn/LayerSupport.cpp b/src/armnn/LayerSupport.cpp
index 7ed56c5c5d..9bbe17983b 100644
--- a/src/armnn/LayerSupport.cpp
+++ b/src/armnn/LayerSupport.cpp
@@ -355,4 +355,15 @@ bool IsMeanSupported(Compute compute,
FORWARD_LAYER_SUPPORT_FUNC(compute, IsMeanSupported, input, output, descriptor);
}
+bool IsPadSupported(Compute compute,
+ const TensorInfo& input,
+ const TensorInfo& output,
+ const PadDescriptor& descriptor,
+ char* reasonIfUnsupported,
+ size_t reasonIfUnsupportedMaxLength)
+{
+ CopyErrorMessage(reasonIfUnsupported, "Not implemented", reasonIfUnsupportedMaxLength);
+ return false;
+}
+
}
diff --git a/src/armnn/LayersFwd.hpp b/src/armnn/LayersFwd.hpp
index c9ee9dbfec..8321be447d 100644
--- a/src/armnn/LayersFwd.hpp
+++ b/src/armnn/LayersFwd.hpp
@@ -27,6 +27,7 @@
#include "layers/MultiplicationLayer.hpp"
#include "layers/NormalizationLayer.hpp"
#include "layers/OutputLayer.hpp"
+#include "layers/PadLayer.hpp"
#include "layers/PermuteLayer.hpp"
#include "layers/Pooling2dLayer.hpp"
#include "layers/ReshapeLayer.hpp"
@@ -83,6 +84,7 @@ DECLARE_LAYER(Merger)
DECLARE_LAYER(Multiplication)
DECLARE_LAYER(Normalization)
DECLARE_LAYER(Output)
+DECLARE_LAYER(Pad)
DECLARE_LAYER(Permute)
DECLARE_LAYER(Pooling2d)
DECLARE_LAYER(Reshape)
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index 22d80d3cd4..4f5e2974ed 100644
--- a/src/armnn/Network.cpp
+++ b/src/armnn/Network.cpp
@@ -599,6 +599,11 @@ IConnectableLayer* Network::AddMeanLayer(const MeanDescriptor& meanDescriptor, c
return m_Graph->AddLayer<MeanLayer>(meanDescriptor,name);
}
+IConnectableLayer* Network::AddPadLayer(const PadDescriptor& padDescriptor, const char* name)
+{
+ return m_Graph->AddLayer<PadLayer>(padDescriptor,name);
+}
+
OptimizedNetwork::OptimizedNetwork(std::unique_ptr<Graph> graph)
: m_Graph(std::move(graph))
{
diff --git a/src/armnn/Network.hpp b/src/armnn/Network.hpp
index 14112426c6..ea4284e38f 100644
--- a/src/armnn/Network.hpp
+++ b/src/armnn/Network.hpp
@@ -119,6 +119,8 @@ public:
IConnectableLayer* AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name = nullptr) override;
+ IConnectableLayer* AddPadLayer(const PadDescriptor& padDescriptor, const char* name = nullptr) override;
+
private:
IConnectableLayer* AddFullyConnectedLayerImpl(const FullyConnectedDescriptor& fullyConnectedDescriptor,
const ConstTensor& weights,
diff --git a/src/armnn/layers/PadLayer.cpp b/src/armnn/layers/PadLayer.cpp
new file mode 100644
index 0000000000..6a1e9150b8
--- /dev/null
+++ b/src/armnn/layers/PadLayer.cpp
@@ -0,0 +1,45 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#include "PadLayer.hpp"
+#include "LayerCloneBase.hpp"
+
+#include "backends/CpuTensorHandle.hpp"
+#include "backends/WorkloadData.hpp"
+#include "backends/WorkloadFactory.hpp"
+
+#include <cstring>
+
+namespace armnn
+{
+
+PadLayer::PadLayer(const armnn::PadDescriptor& param, const char* name)
+ : LayerWithParameters(1, 1, LayerType::Pad, param, name)
+{}
+
+std::unique_ptr<IWorkload> PadLayer::CreateWorkload(const armnn::Graph& graph,
+ const armnn::IWorkloadFactory& factory) const
+{
+ PadQueueDescriptor descriptor;
+ descriptor.m_Parameters.m_PadList = m_Param.m_PadList;
+
+ return factory.CreatePad(descriptor, PrepInfoAndDesc(descriptor, graph));
+}
+
+PadLayer* PadLayer::Clone(Graph& graph) const
+{
+ auto layer = CloneBase<PadLayer>(graph, m_Param, GetName());
+
+ layer->m_Param.m_PadList = m_Param.m_PadList;
+
+ return std::move(layer);
+}
+
+void PadLayer::ValidateTensorShapesFromInputs()
+{
+ return;
+}
+
+} // namespace armnn \ No newline at end of file
diff --git a/src/armnn/layers/PadLayer.hpp b/src/armnn/layers/PadLayer.hpp
new file mode 100644
index 0000000000..e53a90c9de
--- /dev/null
+++ b/src/armnn/layers/PadLayer.hpp
@@ -0,0 +1,29 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+
+#pragma once
+
+#include "LayerWithParameters.hpp"
+
+namespace armnn
+{
+
+class PadLayer : public LayerWithParameters<PadDescriptor>
+{
+public:
+ virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
+ const IWorkloadFactory& factory) const override;
+
+ PadLayer* Clone(Graph& graph) const override;
+
+ void ValidateTensorShapesFromInputs() override;
+
+protected:
+ PadLayer(const PadDescriptor& param, const char* name);
+ ~PadLayer() = default;
+
+};
+
+} \ No newline at end of file
diff --git a/src/backends/WorkloadFactory.cpp b/src/backends/WorkloadFactory.cpp
index 773a8c1a18..2666e7f354 100644
--- a/src/backends/WorkloadFactory.cpp
+++ b/src/backends/WorkloadFactory.cpp
@@ -472,6 +472,19 @@ bool IWorkloadFactory::IsLayerSupported(Compute compute, const Layer& layer, boo
cLayer->GetParameters(), reason, reasonCapacity);
break;
}
+ case LayerType::Pad:
+ {
+ auto cLayer = boost::polymorphic_downcast<const PadLayer*>(&layer);
+ const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
+ const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
+ result = IsPadSupported(compute,
+ OverrideDataType(input, dataType),
+ OverrideDataType(output, dataType),
+ cLayer->GetParameters(),
+ reason,
+ reasonCapacity);
+ break;
+ }
case LayerType::Pooling2d:
{
auto cLayer = boost::polymorphic_downcast<const Pooling2dLayer*>(&layer);
diff --git a/src/backends/test/IsLayerSupportedTestImpl.hpp b/src/backends/test/IsLayerSupportedTestImpl.hpp
index c5389df06e..e166513fc6 100644
--- a/src/backends/test/IsLayerSupportedTestImpl.hpp
+++ b/src/backends/test/IsLayerSupportedTestImpl.hpp
@@ -338,6 +338,8 @@ DECLARE_LAYER_POLICY_2_PARAM(Normalization)
DECLARE_LAYER_POLICY_CUSTOM_PARAM(Output, armnn::LayerBindingId)
+DECLARE_LAYER_POLICY_2_PARAM(Pad)
+
DECLARE_LAYER_POLICY_2_PARAM(Permute)
DECLARE_LAYER_POLICY_2_PARAM(Pooling2d)