2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // See LICENSE file in the project root for full license information.
7 #include "armnn/NetworkFwd.hpp"
8 #include "armnn/DescriptorsFwd.hpp"
9 #include "armnn/TensorFwd.hpp"
11 #include "armnn/Types.hpp"
18 /// @brief An input connection slot for a layer.
19 /// The input slot can be connected to an output slot of the preceding layer in the graph.
20 /// Only one connection to the input slot is allowed.
24 virtual const IOutputSlot* GetConnection() const = 0;
25 virtual IOutputSlot* GetConnection() = 0;
28 ~IInputSlot() {} /// Not user deletable
31 /// @brief An output connection slot for a layer.
32 /// The output slot may be connected to 1 or more input slots of subsequent layers in the graph.
36 virtual unsigned int GetNumConnections() const = 0;
37 virtual const IInputSlot* GetConnection(unsigned int index) const = 0;
38 virtual IInputSlot* GetConnection(unsigned int index) = 0;
40 virtual void SetTensorInfo(const TensorInfo& tensorInfo) = 0;
41 virtual const TensorInfo& GetTensorInfo() const = 0;
42 virtual bool IsTensorInfoSet() const = 0;
44 virtual int Connect(IInputSlot& destination) = 0;
45 virtual void Disconnect(IInputSlot& slot) = 0;
48 ~IOutputSlot() {} /// Not user deletable
51 /// @brief Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
52 class IConnectableLayer
55 virtual const char* GetName() const = 0;
57 virtual unsigned int GetNumInputSlots() const = 0;
58 virtual unsigned int GetNumOutputSlots() const = 0;
60 virtual const IInputSlot& GetInputSlot(unsigned int index) const = 0;
61 virtual IInputSlot& GetInputSlot(unsigned int index) = 0;
63 virtual const IOutputSlot& GetOutputSlot(unsigned int index) const = 0;
64 virtual IOutputSlot& GetOutputSlot(unsigned int index) = 0;
67 ~IConnectableLayer() {} // Objects are not deletable via the handle
70 using INetworkPtr = std::unique_ptr<INetwork, void(*)(INetwork* network)>;
72 /// Main network class which provides the interface for building up a neural network.
73 /// This object is subsequently required by the IRuntime::Load() method.
77 static INetwork* CreateRaw();
78 static INetworkPtr Create();
79 static void Destroy(INetwork* network);
81 virtual Status PrintGraph() = 0;
83 /// Add an input layer to the network.
84 /// @param id User generated id to uniquely identify a particular input. The same id needs to be specified
85 /// when passing the inputs to the IRuntime::EnqueueWorkload() function.
86 /// @param name Optional name for the layer
87 /// @return Interface for configuring the layer.
88 virtual IConnectableLayer* AddInputLayer(LayerBindingId id, const char* name = nullptr) = 0;
90 /// Add a 2D convolution layer to the network.
91 /// @param convolution2dDescriptor Description of the 2D convolution layer
92 /// @param weights Tensor for the weights data.
93 /// @param biases (Optional) Tensor for the bias data. Must match the output tensor shape.
94 /// @param name Optional name for the layer
95 /// @return Interface for configuring the layer.
96 virtual IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
97 const ConstTensor& weights,
98 const char* name = nullptr) = 0;
100 virtual IConnectableLayer* AddConvolution2dLayer(const Convolution2dDescriptor& convolution2dDescriptor,
101 const ConstTensor& weights,
102 const ConstTensor& biases,
103 const char* name = nullptr) = 0;
105 /// Add a 2D depthwise convolution layer to the network.
106 /// @param convolution2dDescriptor Description of the 2D depthwise convolution layer
107 /// @param weights Tensor for the weights data. Expected format: [1, outputChannels, height, width]
108 /// @param biases (Optional) Tensor for the bias data. Must match the output tensor shape.
109 /// @param name Optional name for the layer
110 /// @return Interface for configuring the layer.
111 virtual IConnectableLayer* AddDepthwiseConvolution2dLayer(
112 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
113 const ConstTensor& weights,
114 const char* name = nullptr) = 0;
116 virtual IConnectableLayer* AddDepthwiseConvolution2dLayer(
117 const DepthwiseConvolution2dDescriptor& convolution2dDescriptor,
118 const ConstTensor& weights,
119 const ConstTensor& biases,
120 const char* name = nullptr) = 0;
122 /// Add a fully connected layer to the network.
123 /// @param fullyConnectedDescriptor Description of the fully connected layer
124 /// @param weights Tensor for the weights data.
125 /// @param biases (Optional) Tensor for the bias data.
126 /// @param name Optional name for the layer
127 /// @return Interface for configuring the layer.
128 virtual IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
129 const ConstTensor& weights,
130 const char* name = nullptr) = 0;
132 virtual IConnectableLayer* AddFullyConnectedLayer(const FullyConnectedDescriptor& fullyConnectedDescriptor,
133 const ConstTensor& weights,
134 const ConstTensor& biases,
135 const char* name = nullptr) = 0;
137 /// Add a permute layer to the network.
138 /// @param permuteDescriptor PermuteDescriptor to configure the permute
139 /// @param name Optional name for the layer
140 /// @return Interface for configuring the layer.
141 virtual IConnectableLayer* AddPermuteLayer(const PermuteDescriptor& permuteDescriptor,
142 const char* name = nullptr) = 0;
144 /// Add a pooling layer to the network.
145 /// @param pooling2dDescriptor Pooling2dDescriptor to configure the pooling
146 /// @param name Optional name for the layer
147 /// @return Interface for configuring the layer.
148 virtual IConnectableLayer* AddPooling2dLayer(const Pooling2dDescriptor& pooling2dDescriptor,
149 const char* name = nullptr) = 0;
151 /// Add an activation layer to the network.
152 /// @param activationDescriptor ActivationDescriptor to configure the activation
153 /// @param name Optional name for the layer
154 /// @return Interface for configuring the layer.
155 virtual IConnectableLayer* AddActivationLayer(const ActivationDescriptor& activationDescriptor,
156 const char* name = nullptr) = 0;
158 /// Add a normalization layer to the network.
159 /// @param normalizationDescriptor NormalizationDescriptor to configure the normalization
160 /// @param name Optional name for the layer
161 /// @return Interface for configuring the layer.
162 virtual IConnectableLayer* AddNormalizationLayer(const NormalizationDescriptor& normalizationDescriptor,
163 const char* name = nullptr) = 0;
165 /// Add a softmax layer to the network.
166 /// @param softmaxDescriptor SoftmaxDescriptor to configure the softmax
167 /// @param name Optional name for the layer
168 /// @return Interface for configuring the layer.
169 virtual IConnectableLayer* AddSoftmaxLayer(const SoftmaxDescriptor& softmaxDescriptor,
170 const char* name = nullptr) = 0;
172 /// Add a splitter layer to the network.
173 /// @param splitterDescriptor WindowsDescriptor to configure the splitting process. Number of Views must be equal to
174 /// the number of outputs, and their order must match - e.g. first view corresponds to
175 /// the first output, second view to the second output, etc....
176 /// @param name Optional name for the layer
177 /// @return Interface for configuring the layer.
178 virtual IConnectableLayer* AddSplitterLayer(const ViewsDescriptor& splitterDescriptor
179 , const char* name = nullptr) = 0;
181 /// Add a merger layer to the network.
182 /// @param mergerDescriptor WindowsDescriptor to configure the merging process. Number of Views must be equal to
183 /// the number of inputs, and their order must match - e.g. first view corresponds to
184 /// the first input, second view to the second input, etc....
185 /// @param name Optional name for the layer
186 /// @return Interface for configuring the layer.
187 virtual IConnectableLayer* AddMergerLayer(const OriginsDescriptor& mergerDescriptor,
188 const char* name = nullptr) = 0;
190 /// Add an addition layer to the network.
191 /// @param name Optional name for the layer
192 /// @return Interface for configuring the layer.
193 virtual IConnectableLayer* AddAdditionLayer(const char* name = nullptr) = 0;
195 /// Add a multiplication layer to the network.
196 /// @param name Optional name for the layer
197 /// @return Interface for configuring the layer.
198 virtual IConnectableLayer* AddMultiplicationLayer(const char* name = nullptr) = 0;
200 /// Add a batch normalization layer to the network.
201 /// @param mean Pre-calculated mean for each channel
202 /// @param variance Pre-calculated variance for each channel
203 /// @param beta Per-channel additive factor
204 /// @param gamma Per-channel multiplicative factor
205 /// @return Interface for configuring the layer.
206 /// @param name Optional name for the layer
207 virtual IConnectableLayer* AddBatchNormalizationLayer(const BatchNormalizationDescriptor& desc,
208 const ConstTensor& mean,
209 const ConstTensor& variance,
210 const ConstTensor& beta,
211 const ConstTensor& gamma,
212 const char* name = nullptr) = 0;
214 /// Add a resize bilinear layer to the network.
215 /// @param resizeDesc Parameters for the resize operation
216 /// @param name Optional name for the layer
217 /// @return Interface for configuring the layer
218 virtual IConnectableLayer* AddResizeBilinearLayer(const ResizeBilinearDescriptor& resizeDesc,
219 const char* name = nullptr) = 0;
221 /// Add an L2 normalization layer to the network.
222 /// Normalization is performed along dimension 1, but requires a 4d input.
223 /// @param name Optional name for the layer
224 /// @return Interface for configuring the layer
225 virtual IConnectableLayer* AddL2NormalizationLayer(const char* name = nullptr) = 0;
227 /// Adds a layer with no inputs and a single output, which always corresponds to
228 /// the passed in constant tensor.
229 /// @param input Tensor to be provided as the only output of the layer. The layer will maintain its own copy of the
230 /// tensor data, meaning the memory referenced by @a input can be freed or reused after this function is
232 /// @param name Optional name for the layer
233 /// @return Interface for configuring the layer
234 virtual IConnectableLayer* AddConstantLayer(const ConstTensor& input,
235 const char* name = nullptr) = 0;
237 /// Add a reshape layer to the network.
238 /// @param reshapeDescriptor Parameters for the reshape operation
239 /// @param name Optional name for the layer
240 /// @return Interface for configuring the layer.
241 virtual IConnectableLayer* AddReshapeLayer(const ReshapeDescriptor& reshapeDescriptor,
242 const char* name = nullptr) = 0;
244 /// Add a floor layer to the network.
245 /// @param name Optional name for the layer
246 /// @return Interface for configuring the layer.
247 virtual IConnectableLayer* AddFloorLayer(const char* name = nullptr) = 0;
249 /// Add an output layer to the network.
250 /// @param id User generated id to uniquely identify a particular output. The same id needs to be specified
251 /// when passing the outputs to the IRuntime::EnqueueWorkload() function.
252 /// @param name Optional name for the layer
253 /// @return Interface for configuring the layer.
254 virtual IConnectableLayer* AddOutputLayer(LayerBindingId id, const char* name = nullptr) = 0;
260 using IOptimizedNetworkPtr = std::unique_ptr<IOptimizedNetwork, void(*)(IOptimizedNetwork* network)>;
262 class IOptimizedNetwork
265 static void Destroy(IOptimizedNetwork* network);
267 virtual Status PrintGraph() = 0;
270 ~IOptimizedNetwork() {}
274 /// Create an optimized version of the network
275 /// @param network INetwork description of the network to be optimized.
276 /// @param deviceSpec The choice of the default computation backend.
277 /// @return An IOptimizedNetworkPtr interface to the optimized network, throws an exception derived from
278 /// armnn::Exception if process fails.
279 IOptimizedNetworkPtr Optimize(const INetwork& network, const DeviceSpec& deviceSpec);