ArmNN  NotReleased
Network.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 
8 #include <armnn/LstmParams.hpp>
10 #include <armnn/TensorFwd.hpp>
11 #include <armnn/Types.hpp>
12 
13 #include <armnn/INetwork.hpp>
14 
15 #include <string>
16 #include <vector>
17 #include <map>
18 #include <memory>
19 
20 #include "Layer.hpp"
21 
22 namespace armnn
23 {
24 class Graph;
25 
27 class Network final : public INetwork
28 {
29 public:
30  Network();
31  ~Network();
32 
33  const Graph& GetGraph() const { return *m_Graph; }
34 
35  Status PrintGraph() override;
36 
37  profiling::ProfilingGuid GetGuid() const final { return m_Guid; };
38 
39  IConnectableLayer* AddInputLayer(LayerBindingId id, const char* name=nullptr) override;
40 
42  const char* name = nullptr) override;
43 
44  IConnectableLayer* AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor& batchToSpaceNdDescriptor,
45  const char* name = nullptr) override;
46 
47  IConnectableLayer* AddComparisonLayer(const ComparisonDescriptor& comparisonDescriptor,
48  const char* name = nullptr) override;
49 
50  IConnectableLayer* AddConcatLayer(const ConcatDescriptor& concatDescriptor,
51  const char* name = nullptr) override;
52 
53  IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
54  const ConstTensor& weights,
55  const Optional<ConstTensor>& biases,
56  const char* name = nullptr) override;
57 
58  ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
59  IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
60  const ConstTensor& weights,
61  const char* name = nullptr) override;
62 
63  ARMNN_DEPRECATED_MSG("This AddConvolution2dLayer overload is deprecated")
64  IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
65  const ConstTensor& weights,
66  const ConstTensor& biases,
67  const char* name = nullptr) override;
68 
69  IConnectableLayer* AddDepthToSpaceLayer(const DepthToSpaceDescriptor& depthToSpaceDescriptor,
70  const char* name = nullptr) override;
71 
73  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
74  const ConstTensor& weights,
75  const Optional<ConstTensor>& biases,
76  const char* name = nullptr) override;
77 
78  ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
80  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
81  const ConstTensor& weights,
82  const char* name = nullptr) override;
83 
84  ARMNN_DEPRECATED_MSG("This AddDepthwiseConvolution2dLayer overload is deprecated")
86  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
87  const ConstTensor& weights,
88  const ConstTensor& biases,
89  const char* name = nullptr) override;
90 
91  IConnectableLayer* AddDequantizeLayer(const char* name = nullptr) override;
92 
94  const DetectionPostProcessDescriptor& descriptor,
95  const ConstTensor& anchors,
96  const char* name = nullptr) override;
97 
99  const char* name = nullptr) override;
100 
101  IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
102  const ConstTensor& weights,
103  const Optional<ConstTensor>& biases,
104  const char* name = nullptr) override;
105 
106  ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
107  IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
108  const ConstTensor& weights,
109  const char* name = nullptr) override;
110 
111  ARMNN_DEPRECATED_MSG("This AddFullyConnectedLayer overload is deprecated")
112  IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
113  const ConstTensor& weights,
114  const ConstTensor& biases,
115  const char* name = nullptr) override;
116 
117  IConnectableLayer* AddGatherLayer(const char* name = nullptr) override;
118 
119  IConnectableLayer* AddPermuteLayer(const PermuteDescriptor& permuteDescriptor,
120  const char* name = nullptr) override;
121 
122  IConnectableLayer* AddPooling2dLayer(const Pooling2dDescriptor& pooling2dDescriptor,
123  const char* name = nullptr) override;
124 
125  IConnectableLayer* AddActivationLayer(const ActivationDescriptor& activationDescriptor,
126  const char* name = nullptr) override;
127 
128  IConnectableLayer* AddNormalizationLayer(const NormalizationDescriptor& normalizationDescriptor,
129  const char* name = nullptr) override;
130 
131  IConnectableLayer* AddSliceLayer(const SliceDescriptor& sliceDescriptor, const char* name = nullptr) override;
132 
133  IConnectableLayer* AddSoftmaxLayer(const SoftmaxDescriptor& softmaxDescriptor,
134  const char* name = nullptr) override;
135 
136  IConnectableLayer* AddSplitterLayer(const ViewsDescriptor& splitterDescriptor,
137  const char* name = nullptr) override;
138 
139  ARMNN_DEPRECATED_MSG("Use AddConcatLayer instead")
140  IConnectableLayer* AddMergerLayer(const MergerDescriptor& mergerDescriptor,
141  const char* name = nullptr) override;
142 
143  ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead")
144  IConnectableLayer* AddAbsLayer(const char* name = nullptr) override;
145 
146  IConnectableLayer* AddAdditionLayer(const char* name = nullptr) override;
147 
148  IConnectableLayer* AddMultiplicationLayer(const char* name = nullptr) override;
149 
151  const ConstTensor& mean,
152  const ConstTensor& variance,
153  const ConstTensor& beta,
154  const ConstTensor& gamma,
155  const char* name = nullptr) override;
156 
157  ARMNN_DEPRECATED_MSG("Use AddResizeLayer instead")
159  const char* name = nullptr) override;
160 
161  IConnectableLayer* AddResizeLayer(const ResizeDescriptor& resizeDescriptor,
162  const char* name = nullptr) override;
163 
165  const char* name = nullptr) override;
166 
168  const char* name = nullptr) override;
169 
170  IConnectableLayer* AddLogSoftmaxLayer(const LogSoftmaxDescriptor& logSoftmaxDescriptor,
171  const char* name = nullptr) override;
172 
173  IConnectableLayer* AddConstantLayer(const ConstTensor& input, const char* name = nullptr) override;
174 
175  IConnectableLayer* AddReshapeLayer(const ReshapeDescriptor& reshapeDescriptor,
176  const char* name = nullptr) override;
177 
178  IConnectableLayer* AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
179  const char* name = nullptr) override;
180 
181  IConnectableLayer* AddSpaceToDepthLayer(const SpaceToDepthDescriptor& spaceToDepthDescriptor,
182  const char* name = nullptr) override;
183 
184  IConnectableLayer* AddFloorLayer(const char* name = nullptr) override;
185 
186  IConnectableLayer* AddOutputLayer(LayerBindingId id, const char* name = nullptr) override;
187 
188  IConnectableLayer* AddLstmLayer(const LstmDescriptor& descriptor,
189  const LstmInputParams& params,
190  const char* name = nullptr) override;
191 
192  IConnectableLayer* AddDivisionLayer(const char* name = nullptr) override;
193 
194  IConnectableLayer* AddSubtractionLayer(const char* name = nullptr) override;
195 
196  IConnectableLayer* AddMaximumLayer(const char* name = nullptr) override;
197 
198  IConnectableLayer* AddMeanLayer(const MeanDescriptor& meanDescriptor, const char* name = nullptr) override;
199 
200  IConnectableLayer* AddPadLayer(const PadDescriptor& padDescriptor, const char* name = nullptr) override;
201 
202  IConnectableLayer* AddQuantizeLayer(const char* name = nullptr) override;
203 
204  IConnectableLayer* AddStridedSliceLayer(const StridedSliceDescriptor& stridedSliceDescriptor,
205  const char* name = nullptr) override;
206 
207  IConnectableLayer* AddMinimumLayer(const char* name = nullptr) override;
208 
209  ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
210  IConnectableLayer* AddGreaterLayer(const char* name = nullptr) override;
211 
212  ARMNN_DEPRECATED_MSG("Use AddComparisonLayer instead")
213  IConnectableLayer* AddEqualLayer(const char* name = nullptr) override;
214 
215  ARMNN_DEPRECATED_MSG("Use AddElementwiseUnaryLayer instead")
216  IConnectableLayer* AddRsqrtLayer(const char* name = nullptr) override;
217 
218  IConnectableLayer* AddMergeLayer(const char* name = nullptr) override;
219 
220  IConnectableLayer* AddSwitchLayer(const char* name = nullptr) override;
221 
222  IConnectableLayer* AddPreluLayer(const char* name = nullptr) override;
223 
225  const ConstTensor& weights,
226  const Optional<ConstTensor>& biases,
227  const char* name = nullptr) override;
228 
229  IConnectableLayer* AddStackLayer(const StackDescriptor& stackDescriptor,
230  const char* name = nullptr) override;
231 
233  const char* name = nullptr) override;
234 
236  const char* name = nullptr) override;
237 
238  void Accept(ILayerVisitor& visitor) const override;
239 
240 private:
241  IConnectableLayer* AddFullyConnectedLayerImpl(const FullyConnectedDescriptor& fullyConnectedDescriptor,
242  const ConstTensor& weights,
243  const Optional<ConstTensor>& biases,
244  const char* name);
245 
246  IConnectableLayer* AddConvolution2dLayerImpl(const Convolution2dDescriptor& convolution2dDescriptor,
247  const ConstTensor& weights,
248  const Optional<ConstTensor>& biases,
249  const char* name);
250 
251  IConnectableLayer* AddDepthwiseConvolution2dLayerImpl(
252  const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
253  const ConstTensor& weights,
254  const Optional<ConstTensor>& biases,
255  const char* name);
256 
257  std::unique_ptr<Graph> m_Graph;
259 };
260 
262 {
263 public:
264  OptimizedNetwork(std::unique_ptr<Graph> graph);
265  ~OptimizedNetwork();
266 
267  Status PrintGraph() override;
268  Status SerializeToDot(std::ostream& stream) const override;
269 
270  profiling::ProfilingGuid GetGuid() const final { return m_Guid; };
271 
272  Graph& GetGraph() { return *m_Graph; }
273 
274 private:
275  std::unique_ptr<Graph> m_Graph;
277 };
278 
279 
280 
282 {
283  bool m_Warning;
284  bool m_Error;
285 
287  : m_Warning(false)
288  , m_Error(false)
289  {}
290 };
291 
292 using BackendsMap = std::map<BackendId, std::unique_ptr<class IBackendInternal>>;
293 
295  struct BackendSettings& backendSettings);
296 
298  BackendsMap& backends,
299  TensorHandleFactoryRegistry& registry,
300  Optional<std::vector<std::string>&> errMessages);
301 
302 } // namespace armnn
IConnectableLayer * AddReshapeLayer(const ReshapeDescriptor &reshapeDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1289
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
Status
Definition: Types.hpp:26
IConnectableLayer * AddSplitterLayer(const ViewsDescriptor &splitterDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1185
A NormalizationDescriptor for the NormalizationLayer.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:199
IConnectableLayer * AddMaximumLayer(const char *name=nullptr) override
Definition: Network.cpp:1191
IConnectableLayer * AddInputLayer(LayerBindingId id, const char *name=nullptr) override
Definition: Network.cpp:953
BackendsMap CreateSupportedBackends(TensorHandleFactoryRegistry &handleFactoryRegistry, BackendSettings &backendSettings)
Definition: Network.cpp:326
IConnectableLayer * AddL2NormalizationLayer(const L2NormalizationDescriptor &desc, const char *name=nullptr) override
Definition: Network.cpp:1268
IConnectableLayer * AddMergeLayer(const char *name=nullptr) override
Definition: Network.cpp:1492
void Accept(ILayerVisitor &visitor) const override
Definition: Network.cpp:1580
IConnectableLayer * AddGatherLayer(const char *name=nullptr) override
Definition: Network.cpp:1487
A PadDescriptor for the PadLayer.
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:20
IConnectableLayer * AddGreaterLayer(const char *name=nullptr) override
Definition: Network.cpp:1472
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
DataLayout::NHWC false
IConnectableLayer * AddAdditionLayer(const char *name=nullptr) override
Definition: Network.cpp:1212
IConnectableLayer * AddEqualLayer(const char *name=nullptr) override
Definition: Network.cpp:1477
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.
IConnectableLayer * AddElementwiseUnaryLayer(const ElementwiseUnaryDescriptor &elementwiseUnaryDescriptor, const char *name=nullptr) override
Definition: Network.cpp:970
IConnectableLayer * AddDequantizeLayer(const char *name=nullptr) override
Definition: Network.cpp:1461
IConnectableLayer * AddPooling2dLayer(const Pooling2dDescriptor &pooling2dDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1149
IConnectableLayer * AddStandInLayer(const StandInDescriptor &descriptor, const char *name=nullptr) override
Definition: Network.cpp:1536
IConnectableLayer * AddLogSoftmaxLayer(const LogSoftmaxDescriptor &logSoftmaxDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1274
IConnectableLayer * AddDivisionLayer(const char *name=nullptr) override
Definition: Network.cpp:1436
A SpaceToDepthDescriptor for the SpaceToDepthLayer.
OptimizationResult SelectTensorHandleStrategy(Graph &optGraph, BackendsMap &backends, TensorHandleFactoryRegistry &registry, Optional< std::vector< std::string > &> errMessages)
Definition: Network.cpp:741
A ReshapeDescriptor for the ReshapeLayer.
profiling::ProfilingGuid GetGuid() const final
Definition: Network.hpp:270
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
IConnectableLayer * AddResizeLayer(const ResizeDescriptor &resizeDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1256
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
Definition: Descriptors.hpp:82
IConnectableLayer * AddActivationLayer(const ActivationDescriptor &activationDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1155
IConnectableLayer * AddLstmLayer(const LstmDescriptor &descriptor, const LstmInputParams &params, const char *name=nullptr) override
Definition: Network.cpp:1312
IConnectableLayer * AddMultiplicationLayer(const char *name=nullptr) override
Definition: Network.cpp:1217
IConnectableLayer * AddMinimumLayer(const char *name=nullptr) override
Definition: Network.cpp:1196
IConnectableLayer * AddMergerLayer(const MergerDescriptor &mergerDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1201
Private implementation of INetwork.
Definition: Network.hpp:27
std::map< BackendId, std::unique_ptr< class IBackendInternal > > BackendsMap
Definition: Network.hpp:292
IConnectableLayer * AddSpaceToBatchNdLayer(const SpaceToBatchNdDescriptor &spaceToBatchNdDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1295
IConnectableLayer * AddPreluLayer(const char *name=nullptr) override
Definition: Network.cpp:1502
profiling::ProfilingGuid GetGuid() const final
Definition: Network.hpp:37
IConnectableLayer * AddComparisonLayer(const ComparisonDescriptor &comparisonDescriptor, const char *name=nullptr) override
Definition: Network.cpp:964
An LstmDescriptor for the LstmLayer.
IConnectableLayer * AddResizeBilinearLayer(const ResizeBilinearDescriptor &resizeDesc, const char *name=nullptr) override
Definition: Network.cpp:1244
IConnectableLayer * AddSliceLayer(const SliceDescriptor &sliceDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1174
IConnectableLayer * AddPermuteLayer(const PermuteDescriptor &permuteDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1143
IConnectableLayer * AddRsqrtLayer(const char *name=nullptr) override
Definition: Network.cpp:1482
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
IConnectableLayer * AddMeanLayer(const MeanDescriptor &meanDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1446
A FullyConnectedDescriptor for the FullyConnectedLayer.
IConnectableLayer * AddSoftmaxLayer(const SoftmaxDescriptor &softmaxDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1179
IConnectableLayer * AddQuantizedLstmLayer(const QuantizedLstmInputParams &params, const char *name=nullptr) override
Definition: Network.cpp:1542
IConnectableLayer * AddConvolution2dLayer(const Convolution2dDescriptor &convolution2dDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
Definition: Network.cpp:1051
IConnectableLayer * AddTransposeConvolution2dLayer(const TransposeConvolution2dDescriptor &descriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
Definition: Network.cpp:1507
const Graph & GetGraph() const
Definition: Network.hpp:33
IConnectableLayer * AddStackLayer(const StackDescriptor &stackDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1529
IConnectableLayer * AddAbsLayer(const char *name=nullptr) override
Definition: Network.cpp:1207
A StackDescriptor for the StackLayer.
A ResizeBilinearDescriptor for the ResizeBilinearLayer.
A SoftmaxDescriptor for the SoftmaxLayer.
IConnectableLayer * AddQuantizeLayer(const char *name=nullptr) override
Definition: Network.cpp:1456
Status PrintGraph() override
Definition: Network.cpp:947
IConnectableLayer * AddPadLayer(const PadDescriptor &padDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1451
IConnectableLayer * AddSwitchLayer(const char *name=nullptr) override
Definition: Network.cpp:1497
IConnectableLayer * AddDepthToSpaceLayer(const DepthToSpaceDescriptor &depthToSpaceDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1099
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 })
IConnectableLayer * AddDepthwiseConvolution2dLayer(const DepthwiseConvolution2dDescriptor &convolution2dDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
Definition: Network.cpp:1105
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
A Pooling2dDescriptor for the Pooling2dLayer.
A StandInDescriptor for the StandIn layer.
IConnectableLayer * AddSubtractionLayer(const char *name=nullptr) override
Definition: Network.cpp:1441
A SliceDescriptor for the SliceLayer.
IConnectableLayer * AddFullyConnectedLayer(const FullyConnectedDescriptor &fullyConnectedDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
Definition: Network.cpp:998
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A PermuteDescriptor for the PermuteLayer.
A Convolution2dDescriptor for the Convolution2dLayer.
IConnectableLayer * AddNormalizationLayer(const NormalizationDescriptor &normalizationDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1167
IConnectableLayer * AddOutputLayer(LayerBindingId id, const char *name=nullptr) override
Definition: Network.cpp:1222
IConnectableLayer * AddArgMinMaxLayer(const ArgMinMaxDescriptor &desc, const char *name=nullptr) override
Definition: Network.cpp:1161
A MeanDescriptor for the MeanLayer.
A SpaceToBatchNdDescriptor for the SpaceToBatchNdLayer.
#define ARMNN_DEPRECATED_MSG(message)
Definition: Deprecated.hpp:43
IConnectableLayer * AddStridedSliceLayer(const StridedSliceDescriptor &stridedSliceDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1466
An ArgMinMaxDescriptor for ArgMinMaxLayer.
Definition: Descriptors.hpp:43
IConnectableLayer * AddConstantLayer(const ConstTensor &input, const char *name=nullptr) override
Definition: Network.cpp:1280
IConnectableLayer * AddInstanceNormalizationLayer(const InstanceNormalizationDescriptor &desc, const char *name=nullptr) override
Definition: Network.cpp:1262
IConnectableLayer * AddFloorLayer(const char *name=nullptr) override
Definition: Network.cpp:1307
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:168
A ResizeDescriptor for the ResizeLayer.
IConnectableLayer * AddBatchNormalizationLayer(const BatchNormalizationDescriptor &desc, const ConstTensor &mean, const ConstTensor &variance, const ConstTensor &beta, const ConstTensor &gamma, const char *name=nullptr) override
Definition: Network.cpp:1227
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:62
IConnectableLayer * AddSpaceToDepthLayer(const SpaceToDepthDescriptor &spaceToDepthDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1301
An OriginsDescriptor for the ConcatLayer. Descriptor to configure the concatenation process...
IConnectableLayer * AddDetectionPostProcessLayer(const DetectionPostProcessDescriptor &descriptor, const ConstTensor &anchors, const char *name=nullptr) override
Definition: Network.cpp:1133
IConnectableLayer * AddBatchToSpaceNdLayer(const BatchToSpaceNdDescriptor &batchToSpaceNdDescriptor, const char *name=nullptr) override
Definition: Network.cpp:958
IConnectableLayer * AddConcatLayer(const ConcatDescriptor &concatDescriptor, const char *name=nullptr) override
Definition: Network.cpp:1023
A StridedSliceDescriptor for the StridedSliceLayer.