2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // See LICENSE file in the project root for full license information.
7 #include "LayersFwd.hpp"
10 #include "InternalTypes.hpp"
12 #include <armnn/Descriptors.hpp>
14 #include <boost/core/ignore_unused.hpp>
19 class ScopedCpuTensorHandle;
21 template <typename Parameters>
22 class LayerWithParameters : public Layer
25 typedef Parameters DescriptorType;
27 const Parameters& GetParameters() const { return m_Param; }
30 LayerWithParameters(unsigned int numInputSlots,
31 unsigned int numOutputSlots,
33 const Parameters& param,
35 : Layer(numInputSlots, numOutputSlots, type, name)
40 ~LayerWithParameters() = default;
42 /// Helper function to reduce duplication in *Layer::CreateWorkload
43 template <typename QueueDescriptor>
44 WorkloadInfo PrepInfoAndDesc(QueueDescriptor& descriptor, const Graph& graph) const
46 descriptor.m_Parameters = m_Param;
47 return Layer::PrepInfoAndDesc(descriptor, graph);
50 /// The parameters for the layer (not including tensor-valued weights etc.)
54 class ActivationLayer : public LayerWithParameters<ActivationDescriptor>
57 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
58 const IWorkloadFactory& factory) const override;
60 ActivationLayer* Clone(Graph& graph) const override;
62 void ValidateTensorShapesFromInputs() override;
65 ActivationLayer(const ActivationDescriptor ¶m, const char* name);
66 ~ActivationLayer() = default;
69 class AdditionLayer : public Layer
72 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
73 const IWorkloadFactory& factory) const override;
75 AdditionLayer* Clone(Graph& graph) const override;
77 void ValidateTensorShapesFromInputs() override;
80 AdditionLayer(const char* name);
81 ~AdditionLayer() = default;
84 class BatchNormalizationLayer : public LayerWithParameters<BatchNormalizationDescriptor>
87 std::unique_ptr<ScopedCpuTensorHandle> m_Mean;
88 std::unique_ptr<ScopedCpuTensorHandle> m_Variance;
89 std::unique_ptr<ScopedCpuTensorHandle> m_Beta;
90 std::unique_ptr<ScopedCpuTensorHandle> m_Gamma;
92 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
93 const IWorkloadFactory& factory) const override;
95 BatchNormalizationLayer* Clone(Graph& graph) const override;
97 void ValidateTensorShapesFromInputs() override;
100 BatchNormalizationLayer(const BatchNormalizationDescriptor& param, const char* name);
101 ~BatchNormalizationLayer() = default;
104 class Convolution2dLayer : public LayerWithParameters<Convolution2dDescriptor>
107 std::unique_ptr<ScopedCpuTensorHandle> m_Weight;
108 std::unique_ptr<ScopedCpuTensorHandle> m_Bias;
110 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
111 const IWorkloadFactory& factory) const override;
113 Convolution2dLayer* Clone(Graph& graph) const override;
115 void ValidateTensorShapesFromInputs() override;
118 Convolution2dLayer(const Convolution2dDescriptor& param, const char* name);
119 ~Convolution2dLayer() = default;
122 class DepthwiseConvolution2dLayer : public LayerWithParameters<DepthwiseConvolution2dDescriptor>
125 std::unique_ptr<ScopedCpuTensorHandle> m_Weight;
126 std::unique_ptr<ScopedCpuTensorHandle> m_Bias;
128 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
129 const IWorkloadFactory& factory) const override;
131 DepthwiseConvolution2dLayer* Clone(Graph& graph) const override;
133 void ValidateTensorShapesFromInputs() override;
136 DepthwiseConvolution2dLayer(const DepthwiseConvolution2dDescriptor& param, const char* name);
137 ~DepthwiseConvolution2dLayer() = default;
140 class FakeQuantizationLayer : public LayerWithParameters<FakeQuantizationDescriptor>
143 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
144 const IWorkloadFactory& factory) const override;
146 FakeQuantizationLayer* Clone(Graph& graph) const override;
148 void ValidateTensorShapesFromInputs() override;
151 FakeQuantizationLayer(const FakeQuantizationDescriptor& descriptor, const char* name);
152 ~FakeQuantizationLayer() = default;
155 class FloorLayer : public Layer
158 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
159 const IWorkloadFactory& factory) const override;
161 FloorLayer* Clone(Graph& graph) const override;
163 void ValidateTensorShapesFromInputs() override;
166 FloorLayer(const char* name);
167 ~FloorLayer() = default;
170 class FullyConnectedLayer : public LayerWithParameters<FullyConnectedDescriptor>
173 std::unique_ptr<ScopedCpuTensorHandle> m_Weight;
174 std::unique_ptr<ScopedCpuTensorHandle> m_Bias;
176 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
177 const IWorkloadFactory& factory) const override;
179 FullyConnectedLayer* Clone(Graph& graph) const override;
181 void ValidateTensorShapesFromInputs() override;
184 FullyConnectedLayer(const FullyConnectedDescriptor& param, const char* name);
185 ~FullyConnectedLayer() = default;
188 class InputLayer : public BindableLayer
191 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
192 const IWorkloadFactory& factory) const override;
194 InputLayer* Clone(Graph& graph) const override;
196 void ValidateTensorShapesFromInputs() override;
199 InputLayer(LayerBindingId id, const char* name);
200 ~InputLayer() = default;
203 class MergerLayer : public LayerWithParameters<OriginsDescriptor>
206 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
207 const IWorkloadFactory& factory) const override;
208 virtual void CreateTensorHandles(Graph& graph, const IWorkloadFactory& factory) override;
210 MergerLayer* Clone(Graph& graph) const override;
212 void ValidateTensorShapesFromInputs() override;
215 MergerLayer(const OriginsDescriptor& param, const char* name);
216 ~MergerLayer() = default;
219 class MultiplicationLayer : public Layer
222 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
223 const IWorkloadFactory& factory) const override;
225 MultiplicationLayer* Clone(Graph& graph) const override;
227 void ValidateTensorShapesFromInputs() override;
230 MultiplicationLayer(const char* name);
231 ~MultiplicationLayer() = default;
234 class NormalizationLayer : public LayerWithParameters<NormalizationDescriptor>
237 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
238 const IWorkloadFactory& factory) const override;
240 NormalizationLayer* Clone(Graph& graph) const override;
242 void ValidateTensorShapesFromInputs() override;
245 NormalizationLayer(const NormalizationDescriptor& param, const char* name);
246 ~NormalizationLayer() = default;
249 class OutputLayer : public BindableLayer
252 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
253 const IWorkloadFactory& factory) const override;
254 virtual void CreateTensorHandles(Graph& graph, const IWorkloadFactory& factory) override
256 boost::ignore_unused(graph, factory);
259 OutputLayer* Clone(Graph& graph) const override;
261 void ValidateTensorShapesFromInputs() override;
264 OutputLayer(LayerBindingId id, const char* name);
265 ~OutputLayer() = default;
268 class PermuteLayer : public LayerWithParameters<PermuteDescriptor>
271 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
272 const IWorkloadFactory& factory) const override;
274 PermuteLayer* Clone(Graph& graph) const override;
276 void ValidateTensorShapesFromInputs() override;
278 const PermutationVector& GetPermutation() const
280 return m_Param.m_DimMappings;
283 bool IsInverse(const Layer& other) const
285 return (other.GetType() == LayerType::Permute) &&
286 GetPermutation().IsInverse(boost::polymorphic_downcast<const PermuteLayer*>(&other)->GetPermutation());
289 bool IsEqual(const Layer& other) const
291 return (other.GetType() == LayerType::Permute) &&
292 GetPermutation().IsEqual(boost::polymorphic_downcast<const PermuteLayer*>(&other)->GetPermutation());
296 PermuteLayer(const PermuteDescriptor& param, const char* name);
297 ~PermuteLayer() = default;
300 class Pooling2dLayer : public LayerWithParameters<Pooling2dDescriptor>
303 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
304 const IWorkloadFactory& factory) const override;
306 Pooling2dLayer* Clone(Graph& graph) const override;
308 void ValidateTensorShapesFromInputs() override;
311 Pooling2dLayer(const Pooling2dDescriptor& param, const char* name);
312 ~Pooling2dLayer() = default;
315 class SoftmaxLayer : public LayerWithParameters<SoftmaxDescriptor>
318 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
319 const IWorkloadFactory& factory) const override;
321 SoftmaxLayer* Clone(Graph& graph) const override;
323 void ValidateTensorShapesFromInputs() override;
326 SoftmaxLayer(const SoftmaxDescriptor& param, const char* name);
327 ~SoftmaxLayer() = default;
330 class SplitterLayer : public LayerWithParameters<ViewsDescriptor>
333 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
334 const IWorkloadFactory& factory) const override;
335 virtual void CreateTensorHandles(Graph& graph, const IWorkloadFactory& factory) override;
337 SplitterLayer* Clone(Graph& graph) const override;
339 void ValidateTensorShapesFromInputs() override;
342 SplitterLayer(const ViewsDescriptor& param, const char* name);
343 ~SplitterLayer() = default;
346 class MemCopyLayer : public Layer
349 virtual std::unique_ptr<IWorkload>
350 CreateWorkload(const Graph& graph, const IWorkloadFactory& factory) const override;
352 MemCopyLayer* Clone(Graph& graph) const override;
354 void ValidateTensorShapesFromInputs() override;
357 MemCopyLayer(const char* name);
358 ~MemCopyLayer() = default;
361 class ResizeBilinearLayer : public LayerWithParameters<ResizeBilinearDescriptor>
364 virtual std::unique_ptr<IWorkload>
365 CreateWorkload(const Graph& graph, const IWorkloadFactory& factory) const override;
367 ResizeBilinearLayer* Clone(Graph& graph) const override;
369 void ValidateTensorShapesFromInputs() override;
372 ResizeBilinearLayer(const ResizeBilinearDescriptor& param, const char* name);
373 ~ResizeBilinearLayer() = default;
376 class L2NormalizationLayer : public Layer
379 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
380 const IWorkloadFactory& factory) const override;
382 L2NormalizationLayer* Clone(Graph& graph) const override;
384 void ValidateTensorShapesFromInputs() override;
387 L2NormalizationLayer(const char* name);
388 ~L2NormalizationLayer() = default;
391 class ConstantLayer : public Layer
394 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
395 const IWorkloadFactory& factory) const override;
397 ConstantLayer* Clone(Graph& graph) const override;
399 void ValidateTensorShapesFromInputs() override;
402 ConstantLayer(const std::shared_ptr<ScopedCpuTensorHandle>& input, const char* name);
403 ~ConstantLayer() = default;
406 std::shared_ptr<ScopedCpuTensorHandle> m_LayerOutput;
409 class ReshapeLayer : public LayerWithParameters<ReshapeDescriptor>
412 virtual std::unique_ptr<IWorkload> CreateWorkload(const Graph& graph,
413 const IWorkloadFactory& factory) const override;
415 ReshapeLayer* Clone(Graph& graph) const override;
417 void ValidateTensorShapesFromInputs() override;
419 bool IsEqual(const Layer& other) const
421 return (other.GetType() == LayerType::Reshape) &&
422 m_Param.m_TargetShape == boost::polymorphic_downcast<const ReshapeLayer*>(&other)->m_Param.m_TargetShape;
426 ReshapeLayer(const ReshapeDescriptor& desc, const char* name);
427 ~ReshapeLayer() = default;