IVGCVSW-2752 Make biases optional in INetwork
authorAron Virginas-Tar <Aron.Virginas-Tar@arm.com>
Fri, 22 Feb 2019 17:03:44 +0000 (17:03 +0000)
committerAron Virginas-Tar <aron.virginas-tar@arm.com>
Wed, 27 Feb 2019 14:39:42 +0000 (14:39 +0000)
* Added new version of AddConvolution2dLayer, AddDepthwiseConvolution2dLayer
  and AddFullyConnectedLayer with Optional<ConstTensor> biases
* Deprecated old AddConvolution2dLayer, AddDepthwiseConvolution2dLayer
  and AddFullyConnectedLayer methods
* Made necessary changes to implementation functions

Change-Id: I65eddb28dc72a9c74429c331815a96c2bfdc8c51
Signed-off-by: Aron Virginas-Tar <Aron.Virginas-Tar@arm.com>
include/armnn/INetwork.hpp
src/armnn/Network.cpp
src/armnn/Network.hpp

index a59000b..a4dd0da 100644 (file)
@@ -104,29 +104,44 @@ public:
     /// Adds a 2D convolution layer to the network.
     /// @param convolution2dDescriptor - Description of the 2D convolution layer.
     /// @param weights - Tensor for the weights data.
-    /// @param biases - (Optional) Tensor for the bias data. Must match the output tensor shape.
+    /// @param biases - Optional tensor for the bias data. If specified, must match the output tensor shape.
     /// @param name - Optional name for the layer.
     /// @return - Interface for configuring the layer.
     virtual IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
-        const ConstTensor& weights,
-        const char* name = nullptr) = 0;
+                                                     const ConstTensor& weights,
+                                                     const Optional<ConstTensor>& biases,
+                                                     const char* name = nullptr) = 0;
 
+    /// @deprecated
     virtual IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
-        const ConstTensor& weights,
-        const ConstTensor& biases,
-        const char* name = nullptr) = 0;
+                                                     const ConstTensor& weights,
+                                                     const char* name = nullptr) = 0;
+
+    /// @deprecated
+    virtual IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
+                                                     const ConstTensor& weights,
+                                                     const ConstTensor& biases,
+                                                     const char* name = nullptr) = 0;
 
     /// Adds a 2D depthwise convolution layer to the network.
     /// @param convolution2dDescriptor - Description of the 2D depthwise convolution layer.
     /// @param weights - Tensor for the weights. Expected format: [channelMultiplier, inputChannels, height, width].
-    /// @param biases (Optional) - Tensor for the bias data. Must match the output tensor shape.
+    /// @param biases Optional tensor for the bias data. If specified, must match the output tensor shape.
     /// @param name - Optional name for the layer.
     /// @return - Interface for configuring the layer.
     virtual IConnectableLayer* AddDepthwiseConvolution2dLayer(
         const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
         const ConstTensor& weights,
+        const Optional<ConstTensor>& biases,
+        const char* name = nullptr) = 0;
+
+    /// @deprecated
+    virtual IConnectableLayer* AddDepthwiseConvolution2dLayer(
+        const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
+        const ConstTensor& weights,
         const char* name = nullptr) = 0;
 
+    /// @deprecated
     virtual IConnectableLayer* AddDepthwiseConvolution2dLayer(
         const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
         const ConstTensor& weights,
@@ -146,17 +161,24 @@ public:
     /// Adds a fully connected layer to the network.
     /// @param fullyConnectedDescriptor - Description of the fully connected layer.
     /// @param weights - Tensor for the weights data.
-    /// @param biases - (Optional) Tensor for the bias data.
+    /// @param biases - Optional tensor for the bias data.
     /// @param name - Optional name for the layer.
     /// @return - Interface for configuring the layer.
     virtual IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
-        const ConstTensor& weights,
-        const char* name = nullptr) = 0;
+                                                      const ConstTensor& weights,
+                                                      const Optional<ConstTensor>& biases,
+                                                      const char* name = nullptr) = 0;
 
+    /// @deprecated
     virtual IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
-        const ConstTensor& weights,
-        const ConstTensor& biases,
-        const char* name = nullptr) = 0;
+                                                      const ConstTensor& weights,
+                                                      const char* name = nullptr) = 0;
+
+    /// @deprecated
+    virtual IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
+                                                      const ConstTensor& weights,
+                                                      const ConstTensor& biases,
+                                                      const char* name = nullptr) = 0;
 
     /// Adds a permute layer to the network.
     /// @param permuteDescriptor - PermuteDescriptor to configure the permute.
index cad1690..bd5adcc 100644 (file)
@@ -537,12 +537,12 @@ IConnectableLayer* Network::AddBatchToSpaceNdLayer(const BatchToSpaceNdDescripto
 
 IConnectableLayer* Network::AddFullyConnectedLayerImpl(const FullyConnectedDescriptor& fullyConnectedDescriptor,
                                                        const ConstTensor& weights,
-                                                       const ConstTensor* biases,
+                                                       const Optional<ConstTensor>& biases,
                                                        const char* name)
 {
-    if (fullyConnectedDescriptor.m_BiasEnabled && (biases == nullptr))
+    if (fullyConnectedDescriptor.m_BiasEnabled && !biases.has_value())
     {
-        throw InvalidArgumentException("AddFullyConnectedLayer: biases cannot be NULL");
+        throw InvalidArgumentException("AddFullyConnectedLayer: biases cannot be empty");
     }
 
     const auto layer = m_Graph->AddLayer<FullyConnectedLayer>(fullyConnectedDescriptor, name);
@@ -551,7 +551,7 @@ IConnectableLayer* Network::AddFullyConnectedLayerImpl(const FullyConnectedDescr
 
     if (fullyConnectedDescriptor.m_BiasEnabled)
     {
-        layer->m_Bias = std::make_unique<ScopedCpuTensorHandle>(*biases);
+        layer->m_Bias = std::make_unique<ScopedCpuTensorHandle>(biases.value());
     }
 
     return layer;
@@ -559,27 +559,39 @@ IConnectableLayer* Network::AddFullyConnectedLayerImpl(const FullyConnectedDescr
 
 IConnectableLayer* Network::AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
                                                    const ConstTensor& weights,
+                                                   const Optional<ConstTensor>& biases,
                                                    const char* name)
 {
-    return AddFullyConnectedLayerImpl(fullyConnectedDescriptor, weights, nullptr, name);
+    return AddFullyConnectedLayerImpl(fullyConnectedDescriptor, weights, biases, name);
 }
 
+/// @deprecated
+IConnectableLayer* Network::AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
+                                                   const ConstTensor& weights,
+                                                   const char* name)
+{
+    Optional<ConstTensor> biases = EmptyOptional();
+    return AddFullyConnectedLayerImpl(fullyConnectedDescriptor, weights, biases, name);
+}
+
+/// @deprecated
 IConnectableLayer* Network::AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
                                                    const ConstTensor& weights,
                                                    const ConstTensor& biases,
                                                    const char* name)
 {
-    return AddFullyConnectedLayerImpl(fullyConnectedDescriptor, weights, &biases, name);
+    Optional<ConstTensor> optionalBiases(biases);
+    return AddFullyConnectedLayerImpl(fullyConnectedDescriptor, weights, optionalBiases, name);
 }
 
 IConnectableLayer* Network::AddConvolution2dLayerImpl(const Convolution2dDescriptor& convolution2dDescriptor,
                                                       const ConstTensor& weights,
-                                                      const ConstTensor* biases,
+                                                      const Optional<ConstTensor>& biases,
                                                       const char* name)
 {
-    if (convolution2dDescriptor.m_BiasEnabled && (biases == nullptr))
+    if (convolution2dDescriptor.m_BiasEnabled && !biases.has_value())
     {
-        throw InvalidArgumentException("AddConvolution2dLayer: biases cannot be NULL");
+        throw InvalidArgumentException("AddConvolution2dLayer: biases cannot be empty");
     }
 
     const auto layer = m_Graph->AddLayer<Convolution2dLayer>(convolution2dDescriptor, name);
@@ -588,7 +600,7 @@ IConnectableLayer* Network::AddConvolution2dLayerImpl(const Convolution2dDescrip
 
     if (convolution2dDescriptor.m_BiasEnabled)
     {
-        layer->m_Bias = std::make_unique<ScopedCpuTensorHandle>(*biases);
+        layer->m_Bias = std::make_unique<ScopedCpuTensorHandle>(biases.value());
     }
 
     return layer;
@@ -596,27 +608,40 @@ IConnectableLayer* Network::AddConvolution2dLayerImpl(const Convolution2dDescrip
 
 IConnectableLayer* Network::AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
                                                   const ConstTensor& weights,
+                                                  const Optional<ConstTensor>& biases,
+                                                  const char* name)
+{
+    return AddConvolution2dLayerImpl(convolution2dDescriptor, weights, biases, name);
+}
+
+/// @deprecated
+IConnectableLayer* Network::AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
+                                                  const ConstTensor& weights,
                                                   const char* name)
 {
-    return AddConvolution2dLayerImpl(convolution2dDescriptor, weights, nullptr, name);
+    Optional<ConstTensor> biases = EmptyOptional();
+    return AddConvolution2dLayerImpl(convolution2dDescriptor, weights, biases, name);
 }
+
+/// @deprecated
 IConnectableLayer* Network::AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
                                                   const ConstTensor& weights,
                                                   const ConstTensor& biases,
                                                   const char* name)
 {
-    return AddConvolution2dLayerImpl(convolution2dDescriptor, weights, &biases, name);
+    Optional<ConstTensor> optionalBiases(biases);
+    return AddConvolution2dLayerImpl(convolution2dDescriptor, weights, optionalBiases, name);
 }
 
 IConnectableLayer* Network::AddDepthwiseConvolution2dLayerImpl(
     const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
     const ConstTensor& weights,
-    const ConstTensor* biases,
+    const Optional<ConstTensor>& biases,
     const char* name)
 {
-    if (convolution2dDescriptor.m_BiasEnabled && (biases == nullptr))
+    if (convolution2dDescriptor.m_BiasEnabled && !biases.has_value())
     {
-        throw InvalidArgumentException("AddDepthwiseConvolution2dLayer: biases cannot be NULL");
+        throw InvalidArgumentException("AddDepthwiseConvolution2dLayer: biases cannot be empty");
     }
 
     const auto layer = m_Graph->AddLayer<DepthwiseConvolution2dLayer>(convolution2dDescriptor, name);
@@ -625,26 +650,40 @@ IConnectableLayer* Network::AddDepthwiseConvolution2dLayerImpl(
 
     if (convolution2dDescriptor.m_BiasEnabled)
     {
-        layer->m_Bias = std::make_unique<ScopedCpuTensorHandle>(*biases);
+        layer->m_Bias = std::make_unique<ScopedCpuTensorHandle>(biases.value());
     }
 
     return layer;
 }
 
 IConnectableLayer* Network::AddDepthwiseConvolution2dLayer(
+        const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
+        const ConstTensor& weights,
+        const Optional<ConstTensor>& biases,
+        const char* name)
+{
+    return AddDepthwiseConvolution2dLayerImpl(convolution2dDescriptor, weights, biases, name);
+}
+
+/// @deprecated
+IConnectableLayer* Network::AddDepthwiseConvolution2dLayer(
     const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
     const ConstTensor& weights,
     const char* name)
 {
-    return AddDepthwiseConvolution2dLayerImpl(convolution2dDescriptor, weights, nullptr, name);
+    Optional<ConstTensor> biases = EmptyOptional();
+    return AddDepthwiseConvolution2dLayerImpl(convolution2dDescriptor, weights, biases, name);
 }
+
+/// @deprecated
 IConnectableLayer* Network::AddDepthwiseConvolution2dLayer(
     const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
     const ConstTensor& weights,
     const ConstTensor& biases,
     const char* name)
 {
-    return AddDepthwiseConvolution2dLayerImpl(convolution2dDescriptor, weights, &biases, name);
+    Optional<ConstTensor> optionalBiases(biases);
+    return AddDepthwiseConvolution2dLayerImpl(convolution2dDescriptor, weights, optionalBiases, name);
 }
 
 IConnectableLayer* Network::AddDetectionPostProcessLayer(const armnn::DetectionPostProcessDescriptor& descriptor,
index 3754c2e..e50ce79 100644 (file)
@@ -38,24 +38,39 @@ public:
                                               const char* name = nullptr) override;
 
     IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
-        const ConstTensor& weights,
-        const char* name = nullptr) override;
+                                             const ConstTensor& weights,
+                                             const Optional<ConstTensor>& biases,
+                                             const char* name = nullptr) override;
+
+    /// @deprecated
+    IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
+                                             const ConstTensor& weights,
+                                             const char* name = nullptr) override;
 
+    /// @deprecated
     IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
+                                             const ConstTensor& weights,
+                                             const ConstTensor& biases,
+                                             const char* name = nullptr) override;
+
+    IConnectableLayer* AddDepthwiseConvolution2dLayer(
+        const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
         const ConstTensor& weights,
-        const ConstTensor& biases,
+        const Optional<ConstTensor>& biases,
         const char* name = nullptr) override;
 
+    /// @deprecated
     IConnectableLayer* AddDepthwiseConvolution2dLayer(
         const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
-        const ConstTensor&                      weights,
-        const char*                             name = nullptr) override;
+        const ConstTensor& weights,
+        const char* name = nullptr) override;
 
+    /// @deprecated
     IConnectableLayer* AddDepthwiseConvolution2dLayer(
         const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
-        const ConstTensor&                      weights,
-        const ConstTensor&                      biases,
-        const char*                             name = nullptr) override;
+        const ConstTensor& weights,
+        const ConstTensor& biases,
+        const char* name = nullptr) override;
 
     IConnectableLayer* AddDetectionPostProcessLayer(
         const DetectionPostProcessDescriptor& descriptor,
@@ -63,13 +78,20 @@ public:
         const char* name = nullptr) override;
 
     IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
-        const ConstTensor& weights,
-        const char* name = nullptr) override;
+                                              const ConstTensor& weights,
+                                              const Optional<ConstTensor>& biases,
+                                              const char* name = nullptr) override;
 
+    /// @deprecated
     IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
-        const ConstTensor& weights,
-        const ConstTensor& biases,
-        const char* name = nullptr) override;
+                                              const ConstTensor& weights,
+                                              const char* name = nullptr) override;
+
+    /// @deprecated
+    IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
+                                              const ConstTensor& weights,
+                                              const ConstTensor& biases,
+                                              const char* name = nullptr) override;
 
     IConnectableLayer* AddGatherLayer(const char* name = nullptr) override;
 
@@ -152,19 +174,19 @@ public:
 
 private:
     IConnectableLayer* AddFullyConnectedLayerImpl(const FullyConnectedDescriptor& fullyConnectedDescriptor,
-        const ConstTensor& weights,
-        const ConstTensor* biases,
-        const char* name);
+                                                  const ConstTensor& weights,
+                                                  const Optional<ConstTensor>& biases,
+                                                  const char* name);
 
     IConnectableLayer* AddConvolution2dLayerImpl(const Convolution2dDescriptor& convolution2dDescriptor,
-        const ConstTensor& weights,
-        const ConstTensor* biases,
-        const char* name);
+                                                 const ConstTensor& weights,
+                                                 const Optional<ConstTensor>& biases,
+                                                 const char* name);
 
     IConnectableLayer* AddDepthwiseConvolution2dLayerImpl(
         const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
         const ConstTensor& weights,
-        const ConstTensor* biases,
+        const Optional<ConstTensor>& biases,
         const char* name);
 
     std::unique_ptr<Graph> m_Graph;