ArmNN  NotReleased
INetwork.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include <armnn/Deprecated.hpp>
10 #include <armnn/NetworkFwd.hpp>
11 #include <armnn/Optional.hpp>
12 #include <armnn/TensorFwd.hpp>
13 #include <armnn/Types.hpp>
14 #include <armnn/Deprecated.hpp>
15 
16 #include <memory>
17 #include <vector>
18 
19 namespace armnn
20 {
25 {
26 public:
27  virtual const IOutputSlot* GetConnection() const = 0;
28  virtual IOutputSlot* GetConnection() = 0;
29 
30 protected:
33 };
34 
38 {
39 public:
40  virtual unsigned int GetNumConnections() const = 0;
41  virtual const IInputSlot* GetConnection(unsigned int index) const = 0;
42  virtual IInputSlot* GetConnection(unsigned int index) = 0;
43 
44  virtual void SetTensorInfo(const TensorInfo& tensorInfo) = 0;
45  virtual const TensorInfo& GetTensorInfo() const = 0;
46  virtual bool IsTensorInfoSet() const = 0;
47 
48  virtual int Connect(IInputSlot& destination) = 0;
49  virtual void Disconnect(IInputSlot& slot) = 0;
50 
51  virtual unsigned int CalculateIndexOnOwner() const = 0;
52 
53  virtual LayerGuid GetOwningLayerGuid() const = 0;
54 
55 protected:
58 };
59 
62 {
63 public:
64  virtual const char* GetName() const = 0;
65 
66  virtual unsigned int GetNumInputSlots() const = 0;
67  virtual unsigned int GetNumOutputSlots() const = 0;
68 
69  virtual const IInputSlot& GetInputSlot(unsigned int index) const = 0;
70  virtual IInputSlot& GetInputSlot(unsigned int index) = 0;
71 
72  virtual const IOutputSlot& GetOutputSlot(unsigned int index) const = 0;
73  virtual IOutputSlot& GetOutputSlot(unsigned int index) = 0;
74 
75  virtual std::vector<TensorShape> InferOutputShapes(const std::vector<TensorShape>& inputShapes) const = 0;
76 
77  virtual LayerGuid GetGuid() const = 0;
78 
79  virtual void Accept(ILayerVisitor& visitor) const = 0;
80 protected:
83 };
84 
85 using INetworkPtr = std::unique_ptr<INetwork, void(*)(INetwork* network)>;
86 
89 class INetwork
90 {
91 public:
92  static INetwork* CreateRaw();
93  static INetworkPtr Create();
94  static void Destroy(INetwork* network);
95 
96  virtual Status PrintGraph() = 0;
97 
98  virtual profiling::ProfilingGuid GetGuid() const = 0;
99 
105  virtual IConnectableLayer* AddInputLayer(LayerBindingId id, const char* name = nullptr) = 0;
106 
111  virtual IConnectableLayer* AddArgMinMaxLayer(const ArgMinMaxDescriptor& desc,
112  const char* name = nullptr) = 0;
113 
118  virtual IConnectableLayer* AddComparisonLayer(const ComparisonDescriptor& comparisonDescriptor,
119  const char* name = nullptr) = 0;
120 
128  virtual IConnectableLayer* AddConcatLayer(const ConcatDescriptor& concatDescriptor,
129  const char* name = nullptr) = 0;
130 
137  virtual IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
138  const ConstTensor& weights,
139  const Optional<ConstTensor>& biases,
140  const char* name = nullptr) = 0;
141 
142  ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
143  virtual IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
144  const ConstTensor& weights,
145  const char* name = nullptr) = 0;
146 
147  ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
148  virtual IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
149  const ConstTensor& weights,
150  const ConstTensor& biases,
151  const char* name = nullptr) = 0;
152 
157  virtual IConnectableLayer* AddDepthToSpaceLayer(const DepthToSpaceDescriptor& depthToSpaceDescriptor,
158  const char* name = nullptr) = 0;
159 
166  virtual IConnectableLayer* AddDepthwiseConvolution2dLayer(
167  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
168  const ConstTensor& weights,
169  const Optional<ConstTensor>& biases,
170  const char* name = nullptr) = 0;
171 
172  ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
173  virtual IConnectableLayer* AddDepthwiseConvolution2dLayer(
174  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
175  const ConstTensor& weights,
176  const char* name = nullptr) = 0;
177 
178  ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
179  virtual IConnectableLayer* AddDepthwiseConvolution2dLayer(
180  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
181  const ConstTensor& weights,
182  const ConstTensor& biases,
183  const char* name = nullptr) = 0;
184 
187  virtual IConnectableLayer* AddDequantizeLayer(const char* name = nullptr) = 0;
188 
194  virtual IConnectableLayer* AddDetectionPostProcessLayer(
195  const DetectionPostProcessDescriptor& descriptor,
196  const ConstTensor& anchors,
197  const char* name = nullptr) = 0;
198 
203  virtual IConnectableLayer* AddElementwiseUnaryLayer(const ElementwiseUnaryDescriptor& elementwiseUnaryDescriptor,
204  const char* name = nullptr) = 0;
205 
212  virtual IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
213  const ConstTensor& weights,
214  const Optional<ConstTensor>& biases,
215  const char* name = nullptr) = 0;
216 
217  ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
218  virtual IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
219  const ConstTensor& weights,
220  const char* name = nullptr) = 0;
221 
222  ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
223  virtual IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
224  const ConstTensor& weights,
225  const ConstTensor& biases,
226  const char* name = nullptr) = 0;
227 
232  virtual IConnectableLayer* AddPermuteLayer(const PermuteDescriptor& permuteDescriptor,
233  const char* name = nullptr) = 0;
234 
239  virtual IConnectableLayer* AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor& batchToSpaceNdDescriptor,
240  const char* name = nullptr) = 0;
241 
246  virtual IConnectableLayer* AddPooling2dLayer(const Pooling2dDescriptor& pooling2dDescriptor,
247  const char* name = nullptr) = 0;
248 
253  virtual IConnectableLayer* AddActivationLayer(const ActivationDescriptor& activationDescriptor,
254  const char* name = nullptr) = 0;
255 
260  virtual IConnectableLayer* AddNormalizationLayer(const NormalizationDescriptor& normalizationDescriptor,
261  const char* name = nullptr) = 0;
262 
267  virtual IConnectableLayer* AddSliceLayer(const SliceDescriptor& sliceDescriptor, const char* name = nullptr) = 0;
268 
275  virtual IConnectableLayer* AddSoftmaxLayer(const SoftmaxDescriptor& softmaxDescriptor,
276  const char* name = nullptr) = 0;
277 
285  virtual IConnectableLayer* AddSplitterLayer(const ViewsDescriptor& splitterDescriptor,
286  const char* name = nullptr) = 0;
287 
291  virtual IConnectableLayer* AddMergeLayer(const char* name = nullptr) = 0;
292 
300  ARMNN_DEPRECATED_MSG("Use AddConcatLayer instead")
301  virtual IConnectableLayer* AddMergerLayer(const MergerDescriptor& mergerDescriptor,
302  const char* name = nullptr) = 0;
303 
307  ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead")
308  virtual IConnectableLayer* AddAbsLayer(const char* name = nullptr) = 0;
309 
313  virtual IConnectableLayer* AddAdditionLayer(const char* name = nullptr) = 0;
314 
318  virtual IConnectableLayer* AddMultiplicationLayer(const char* name = nullptr) = 0;
319 
327  virtual IConnectableLayer* AddBatchNormalizationLayer(const BatchNormalizationDescriptor& desc,
328  const ConstTensor& mean,
329  const ConstTensor& variance,
330  const ConstTensor& beta,
331  const ConstTensor& gamma,
332  const char* name = nullptr) = 0;
333 
338  ARMNN_DEPRECATED_MSG("Use AddResizeLayer instead")
339  virtual IConnectableLayer* AddResizeBilinearLayer(const ResizeBilinearDescriptor& resizeDesc,
340  const char* name = nullptr) = 0;
341 
346  virtual IConnectableLayer* AddResizeLayer(const ResizeDescriptor& resizeDescriptor,
347  const char* name = nullptr) = 0;
348 
353  virtual IConnectableLayer* AddInstanceNormalizationLayer(const InstanceNormalizationDescriptor& desc,
354  const char* name = nullptr) = 0;
355 
361  virtual IConnectableLayer* AddL2NormalizationLayer(const L2NormalizationDescriptor& desc,
362  const char* name = nullptr) = 0;
363 
368  virtual IConnectableLayer* AddLogSoftmaxLayer(const LogSoftmaxDescriptor& logSoftmaxDescriptor,
369  const char* name = nullptr) = 0;
370 
378  virtual IConnectableLayer* AddConstantLayer(const ConstTensor& input,
379  const char* name = nullptr) = 0;
380 
385  virtual IConnectableLayer* AddReshapeLayer(const ReshapeDescriptor& reshapeDescriptor,
386  const char* name = nullptr) = 0;
387 
392  virtual IConnectableLayer* AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
393  const char* name = nullptr) = 0;
394 
399  virtual IConnectableLayer* AddSpaceToDepthLayer(const SpaceToDepthDescriptor& spaceToDepthDescriptor,
400  const char* name = nullptr) = 0;
401 
405  virtual IConnectableLayer* AddFloorLayer(const char* name = nullptr) = 0;
406 
412  virtual IConnectableLayer* AddOutputLayer(LayerBindingId id, const char* name = nullptr) = 0;
413 
419  virtual IConnectableLayer* AddLstmLayer(const LstmDescriptor& descriptor,
420  const LstmInputParams& params,
421  const char* name = nullptr) = 0;
422 
426  virtual IConnectableLayer* AddDivisionLayer(const char* name = nullptr) = 0;
427 
431  virtual IConnectableLayer* AddSubtractionLayer(const char* name = nullptr) = 0;
432 
436  virtual IConnectableLayer* AddMaximumLayer(const char* name = nullptr) = 0;
437 
442  virtual IConnectableLayer* AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name = nullptr) = 0;
443 
450  virtual IConnectableLayer* AddPadLayer(const PadDescriptor& padDescriptor,
451  const char* name = nullptr) = 0;
452 
456  virtual IConnectableLayer* AddQuantizeLayer(const char* name = nullptr) = 0;
457 
462  virtual IConnectableLayer* AddStridedSliceLayer(const StridedSliceDescriptor& stridedSliceDescriptor,
463  const char* name = nullptr) = 0;
464 
468  virtual IConnectableLayer* AddMinimumLayer(const char* name = nullptr) = 0;
469 
473  ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
474  virtual IConnectableLayer* AddGreaterLayer(const char* name = nullptr) = 0;
475 
479  ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
480  virtual IConnectableLayer* AddEqualLayer(const char* name = nullptr) = 0;
481 
485  ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead")
486  virtual IConnectableLayer* AddRsqrtLayer(const char* name = nullptr) = 0;
487 
491  virtual IConnectableLayer* AddGatherLayer(const char* name = nullptr) = 0;
492 
496  virtual IConnectableLayer* AddSwitchLayer(const char* name = nullptr) = 0;
497 
501  virtual IConnectableLayer* AddPreluLayer(const char* name = nullptr) = 0;
502 
509  virtual IConnectableLayer* AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor& descriptor,
510  const ConstTensor& weights,
511  const Optional<ConstTensor>& biases,
512  const char* name = nullptr) = 0;
513 
518  virtual IConnectableLayer* AddStackLayer(const StackDescriptor& descriptor,
519  const char* name = nullptr) = 0;
520 
521 
528  virtual IConnectableLayer* AddStandInLayer(const StandInDescriptor& descriptor,
529  const char* name = nullptr) = 0;
530 
535  virtual IConnectableLayer* AddQuantizedLstmLayer(const QuantizedLstmInputParams& params,
536  const char* name = nullptr) = 0;
537 
538  virtual void Accept(ILayerVisitor& visitor) const = 0;
539 
540 protected:
542 };
543 
544 using IOptimizedNetworkPtr = std::unique_ptr<IOptimizedNetwork, void(*)(IOptimizedNetwork* network)>;
545 
547 {
548 public:
549  static void Destroy(IOptimizedNetwork* network);
550 
551  virtual Status PrintGraph() = 0;
552  virtual Status SerializeToDot(std::ostream& stream) const = 0;
553 
554  virtual profiling::ProfilingGuid GetGuid() const = 0;
555 
556 protected:
558 };
559 
561 {
563  : m_ReduceFp32ToFp16(false)
564  , m_Debug(false)
565  {}
566 
567  OptimizerOptions(bool reduceFp32ToFp16, bool debug)
568  : m_ReduceFp32ToFp16(reduceFp32ToFp16)
569  , m_Debug(debug)
570  {}
571 
572  // Reduce Fp32 data to Fp16 for faster processing
574 
575  // Add debug data for easier troubleshooting
576  bool m_Debug;
577 };
578 
587 
588 IOptimizedNetworkPtr Optimize(const INetwork& network,
589  const std::vector<BackendId>& backendPreferences,
590  const IDeviceSpec& deviceSpec,
592  Optional<std::vector<std::string>&> messages = EmptyOptional());
593 } //namespace armnn
virtual const IOutputSlot * GetConnection() const =0
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
Status
Definition: Types.hpp:26
A NormalizationDescriptor for the NormalizationLayer.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:199
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Definition: Network.cpp:807
A PadDescriptor for the PadLayer.
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:20
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
DataLayout::NHWC false
A L2NormalizationDescriptor for the L2NormalizationLayer.
A ViewsDescriptor for the SplitterLayer. Descriptor to configure the splitting process. Number of Views must be equal to the number of outputs, and their order must match - e.g. first view corresponds to the first output, second view to the second output, etc.
A SpaceToDepthDescriptor for the SpaceToDepthLayer.
A ReshapeDescriptor for the ReshapeLayer.
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
OptimizerOptions(bool reduceFp32ToFp16, bool debug)
Definition: INetwork.hpp:567
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
Definition: Descriptors.hpp:82
armnnUtils::Sockets::Socket Accept(Socket s, sockaddr *addr, socklen_t *addrlen, int flags)
An LstmDescriptor for the LstmLayer.
~IInputSlot()
Not user deletable.
Definition: INetwork.hpp:32
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
An input connection slot for a layer. The input slot can be connected to an output slot of the preced...
Definition: INetwork.hpp:24
A FullyConnectedDescriptor for the FullyConnectedLayer.
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:85
A StackDescriptor for the StackLayer.
A ResizeBilinearDescriptor for the ResizeBilinearLayer.
A SoftmaxDescriptor for the SoftmaxLayer.
An output connection slot for a layer. The output slot may be connected to 1 or more input slots of s...
Definition: INetwork.hpp:37
void Connect(armnn::IConnectableLayer *from, armnn::IConnectableLayer *to, const armnn::TensorInfo &tensorInfo, unsigned int fromIndex, unsigned int toIndex)
Definition: TestUtils.cpp:12
~IConnectableLayer()
Objects are not deletable via the handle.
Definition: INetwork.hpp:82
std::vector< float > anchors({ 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 100.5f, 1.0f, 1.0f })
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
Definition: INetwork.hpp:544
A Pooling2dDescriptor for the Pooling2dLayer.
A StandInDescriptor for the StandIn layer.
A SliceDescriptor for the SliceLayer.
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A PermuteDescriptor for the PermuteLayer.
A Convolution2dDescriptor for the Convolution2dLayer.
~IOutputSlot()
Not user deletable.
Definition: INetwork.hpp:57
A MeanDescriptor for the MeanLayer.
armnn::Runtime::CreationOptions::ExternalProfilingOptions options
A SpaceToBatchNdDescriptor for the SpaceToBatchNdLayer.
#define ARMNN_DEPRECATED_MSG(message)
Definition: Deprecated.hpp:43
An ArgMinMaxDescriptor for ArgMinMaxLayer.
Definition: Descriptors.hpp:43
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:168
A ResizeDescriptor for the ResizeLayer.
const TensorInfo & GetTensorInfo(const ITensorHandle *tensorHandle)
float32 helpers
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:62
Device specific knowledge to be passed to the optimizer.
Definition: Types.hpp:158
An OriginsDescriptor for the ConcatLayer. Descriptor to configure the concatenation process...
A StridedSliceDescriptor for the StridedSliceLayer.