From 639fb0437d1a5a8a6ea737fed5a16b554dfffead Mon Sep 17 00:00:00 2001 From: Aron Virginas-Tar Date: Thu, 20 Jun 2019 14:28:19 +0100 Subject: IVGCVSW-3319 Add frontend support for TransposeConvolution2d Layer Signed-off-by: Aron Virginas-Tar Change-Id: Ic06f63f1eff255e697facf319e2ac4c83d782e7c --- include/armnn/Descriptors.hpp | 32 ++++++++++++++++++++++++++++++++ include/armnn/DescriptorsFwd.hpp | 1 + include/armnn/ILayerSupport.hpp | 9 +++++++++ include/armnn/ILayerVisitor.hpp | 15 ++++++++++++++- include/armnn/INetwork.hpp | 11 +++++++++++ include/armnn/LayerSupport.hpp | 10 ++++++++++ include/armnn/LayerVisitorBase.hpp | 9 ++++++++- 7 files changed, 85 insertions(+), 2 deletions(-) (limited to 'include') diff --git a/include/armnn/Descriptors.hpp b/include/armnn/Descriptors.hpp index dd1991d569..2fda8c1d06 100644 --- a/include/armnn/Descriptors.hpp +++ b/include/armnn/Descriptors.hpp @@ -684,4 +684,36 @@ struct PreCompiledDescriptor unsigned int m_NumOutputSlots; }; +/// A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer. +struct TransposeConvolution2dDescriptor +{ + TransposeConvolution2dDescriptor() : + m_PadLeft(0), + m_PadRight(0), + m_PadTop(0), + m_PadBottom(0), + m_StrideX(0), + m_StrideY(0), + m_BiasEnabled(false), + m_DataLayout(DataLayout::NCHW) + {} + + /// Padding left value in the width dimension. + uint32_t m_PadLeft; + /// Padding right value in the width dimension. + uint32_t m_PadRight; + /// Padding top value in the height dimension. + uint32_t m_PadTop; + /// Padding bottom value in the height dimension. + uint32_t m_PadBottom; + /// Stride value when proceeding through input for the width dimension. + uint32_t m_StrideX; + /// Stride value when proceeding through input for the height dimension. + uint32_t m_StrideY; + /// Enable/disable bias. + bool m_BiasEnabled; + /// The data layout to be used (NCHW, NHWC). + DataLayout m_DataLayout; +}; + } // namespace armnn \ No newline at end of file diff --git a/include/armnn/DescriptorsFwd.hpp b/include/armnn/DescriptorsFwd.hpp index 1c75c253ed..b814d48699 100644 --- a/include/armnn/DescriptorsFwd.hpp +++ b/include/armnn/DescriptorsFwd.hpp @@ -30,6 +30,7 @@ struct SoftmaxDescriptor; struct SpaceToBatchNdDescriptor; struct SpaceToDepthDescriptor; struct StridedSliceDescriptor; +struct TransposeConvolution2dDescriptor; struct ViewsDescriptor; // MergerDescriptor is deprecated use ConcatDescriptor instead diff --git a/include/armnn/ILayerSupport.hpp b/include/armnn/ILayerSupport.hpp index 324a9f5a2d..eb581d3aaa 100644 --- a/include/armnn/ILayerSupport.hpp +++ b/include/armnn/ILayerSupport.hpp @@ -295,6 +295,15 @@ public: const TensorInfo& output0, const TensorInfo& output1, Optional reasonIfUnsupported = EmptyOptional()) const = 0; + + virtual bool IsTransposeConvolution2dSupported( + const TensorInfo& input, + const TensorInfo& output, + const TransposeConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional& biases, + Optional reasonIfUnsupported = EmptyOptional()) const = 0; + }; // class ILayerSupport using ILayerSupportSharedPtr = std::shared_ptr; diff --git a/include/armnn/ILayerVisitor.hpp b/include/armnn/ILayerVisitor.hpp index 9519c8b0c1..c98760c7cd 100644 --- a/include/armnn/ILayerVisitor.hpp +++ b/include/armnn/ILayerVisitor.hpp @@ -363,7 +363,7 @@ public: /// Function a strided slice layer should call back to when its Accept(ILayerVisitor&) function is invoked. /// @param layer - pointer to the layer which is calling back to this visit function. - /// @param StridedSliceDescriptor - Parameters for the strided slice operation. + /// @param stridedSliceDescriptor - Parameters for the strided slice operation. /// @param name - Optional name for the layer. virtual void VisitStridedSliceLayer(const IConnectableLayer* layer, const StridedSliceDescriptor& stridedSliceDescriptor, @@ -381,6 +381,19 @@ public: virtual void VisitSwitchLayer(const IConnectableLayer* layer, const char* name = nullptr) = 0; + /// Function that a 2D transpose convolution layer should call back to when its Accept(ILayerVisitor&) + /// function is invoked. + /// @param layer - pointer to the layer which is calling back to this visit function. + /// @param descriptor - Description of the 2D transpose convolution layer. + /// @param weights - Tensor for the weights data. + /// @param biases - Optional tensor for the bias data. + /// @param name - Optional name for the layer. + virtual void VisitTransposeConvolution2dLayer(const IConnectableLayer* layer, + const TransposeConvolution2dDescriptor& descriptor, + const ConstTensor& weights, + const Optional& biases, + const char* name = nullptr) = 0; + virtual void StartVisit() {} virtual void FinishVisit() {} diff --git a/include/armnn/INetwork.hpp b/include/armnn/INetwork.hpp index cacca33caf..af67764fc9 100644 --- a/include/armnn/INetwork.hpp +++ b/include/armnn/INetwork.hpp @@ -432,6 +432,17 @@ public: /// @return - Interface for configuring the layer. virtual IConnectableLayer* AddPreluLayer(const char* name = nullptr) = 0; + /// Adds a 2D transpose convolution layer to the network. + /// @param descriptor - Description of the 2D transpose convolution layer. + /// @param weights - Tensor for the weights data. + /// @param biases - Optional tensor for the bias data. + /// @param name - Optional name for the layer. + /// @return - Interface for configuring the layer. + virtual IConnectableLayer* AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor& descriptor, + const ConstTensor& weights, + const Optional& biases, + const char* name = nullptr) = 0; + virtual void Accept(ILayerVisitor& visitor) const = 0; protected: diff --git a/include/armnn/LayerSupport.hpp b/include/armnn/LayerSupport.hpp index 673193f330..f0dca7709e 100644 --- a/include/armnn/LayerSupport.hpp +++ b/include/armnn/LayerSupport.hpp @@ -381,4 +381,14 @@ bool IsSwitchSupported(const BackendId& backend, const TensorInfo& output1, char* reasonIfUnsupported = nullptr, size_t reasonIfUnsupportedMaxLength = 1024); + +/// Deprecated in favor of IBackend and ILayerSupport interfaces +bool IsTransposeConvolution2dSupported(const BackendId& backend, + const TensorInfo& input, + const TensorInfo& output, + const TransposeConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional& biases, + char* reasonIfUnsupported = nullptr, + size_t reasonIfUnsupportedMaxLength = 1024); } diff --git a/include/armnn/LayerVisitorBase.hpp b/include/armnn/LayerVisitorBase.hpp index 48fc2bbb0b..8406efe068 100644 --- a/include/armnn/LayerVisitorBase.hpp +++ b/include/armnn/LayerVisitorBase.hpp @@ -193,6 +193,13 @@ public: void VisitSwitchLayer(const IConnectableLayer*, const char*) override { DefaultPolicy::Apply(__func__); } + + void VisitTransposeConvolution2dLayer(const IConnectableLayer*, + const TransposeConvolution2dDescriptor&, + const ConstTensor&, + const Optional&, + const char*) override { DefaultPolicy::Apply(__func__); } + }; -} //namespace armnn +} // namespace armnn -- cgit v1.2.1