ArmNN  NotReleased
QuantizerVisitor.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
9 #include "StaticRangeVisitor.hpp"
11 
12 #include <armnn/INetwork.hpp>
13 #include <armnn/Types.hpp>
15 
16 #include <unordered_map>
17 
18 namespace armnn
19 {
20 
21 // Forward declaration
22 class StaticRangeVisitor;
23 
25 class QuantizerVisitor : public LayerVisitorBase<VisitorThrowingPolicy>
26 {
27 public:
28  QuantizerVisitor(const RangeTracker& rangeTracker,
29  const IQuantizationScheme* quantizationScheme,
30  bool preserveType = false);
31 
32  ~QuantizerVisitor() = default;
33 
35  ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
36  void VisitAbsLayer(const IConnectableLayer* layer, const char* name = nullptr) override;
37 
38  void VisitActivationLayer(const IConnectableLayer* layer,
39  const ActivationDescriptor& activationDescriptor,
40  const char* name = nullptr) override;
41 
42  void VisitAdditionLayer(const IConnectableLayer* layer, const char* name = nullptr) override;
43 
44  void VisitArgMinMaxLayer(const IConnectableLayer* layer,
45  const ArgMinMaxDescriptor& argMinMaxDescriptor,
46  const char* name = nullptr) override;
47 
49  const BatchNormalizationDescriptor& desc,
50  const ConstTensor& mean,
51  const ConstTensor& variance,
52  const ConstTensor& beta,
53  const ConstTensor& gamma,
54  const char* name = nullptr) override;
55 
57  const BatchToSpaceNdDescriptor& batchToSpaceNdDescriptor,
58  const char* name = nullptr) override;
59 
60  void VisitComparisonLayer(const IConnectableLayer* layer,
61  const ComparisonDescriptor& comparisonDescriptor,
62  const char* name = nullptr) override;
63 
64  void VisitConcatLayer(const IConnectableLayer* layer,
65  const OriginsDescriptor& originsDescriptor,
66  const char* name = nullptr) override;
67 
68  void VisitConstantLayer(const IConnectableLayer* layer,
69  const ConstTensor& input,
70  const char* name = nullptr) override;
71 
73  const Convolution2dDescriptor& convolution2dDescriptor,
74  const ConstTensor& weights,
75  const Optional<ConstTensor>& biases,
76  const char* name = nullptr) override;
77 
78  void VisitDepthToSpaceLayer(const IConnectableLayer* layer,
79  const DepthToSpaceDescriptor& depthToSpaceDescriptor,
80  const char* name = nullptr) override;
81 
84  const ConstTensor& weights,
85  const Optional<ConstTensor>& biases,
86  const char* name = nullptr) override;
87 
89  const ElementwiseUnaryDescriptor& elementwiseUnaryDescriptor,
90  const char* name = nullptr) override;
91 
93  const FullyConnectedDescriptor& desc,
94  const ConstTensor& weights,
95  const Optional<ConstTensor>& biases,
96  const char *name = nullptr) override;
97 
98  void VisitInputLayer(const IConnectableLayer* layer, LayerBindingId id, const char* name = nullptr) override;
99 
101  const InstanceNormalizationDescriptor& instanceNormalizationDescriptor,
102  const char* name = nullptr) override;
103 
104  void VisitLogSoftmaxLayer(const IConnectableLayer* layer,
105  const LogSoftmaxDescriptor& logSoftmaxDescriptor,
106  const char* name = nullptr) override;
107 
108  void VisitMeanLayer(const IConnectableLayer* layer,
109  const MeanDescriptor& meanDescriptor,
110  const char* name = nullptr) override;
111 
113  const char* name = nullptr) override;
114 
115  void VisitNormalizationLayer(const IConnectableLayer* layer,
116  const NormalizationDescriptor& normalizationDescriptor,
117  const char* name = nullptr) override;
118 
119  void VisitOutputLayer(const IConnectableLayer* layer, LayerBindingId id, const char* name = nullptr) override;
120 
121  void VisitPadLayer(const IConnectableLayer*,
122  const PadDescriptor&,
123  const char* name = nullptr) override;
124 
125  void VisitPermuteLayer(const IConnectableLayer* layer,
126  const PermuteDescriptor& permuteDescriptor,
127  const char* name = nullptr) override;
128 
129  void VisitPooling2dLayer(const IConnectableLayer* layer,
130  const Pooling2dDescriptor& pooling2dDescriptor,
131  const char* name = nullptr) override;
132 
133  void VisitPreluLayer(const IConnectableLayer* layer,
134  const char* name = nullptr) override;
135 
136  void VisitReshapeLayer(const IConnectableLayer* layer,
137  const ReshapeDescriptor& reshapeDescriptor,
138  const char* name = nullptr) override;
139 
140  void VisitResizeLayer(const IConnectableLayer* layer,
141  const ResizeDescriptor& resizeDescriptor,
142  const char* name = nullptr) override;
143 
144  ARMNN_DEPRECATED_MSG("Use VisitResizeLayer instead")
146  const ResizeBilinearDescriptor& resizeDesc,
147  const char* name = nullptr) override;
148 
149  ARMNN_DEPRECATED_MSG("Use VisitElementwiseUnaryLayer instead")
151  const char* name = nullptr) override;
152 
153  void VisitSliceLayer(const IConnectableLayer* layer,
154  const SliceDescriptor& sliceDescriptor,
155  const char* name = nullptr) override;
156 
157  void VisitSoftmaxLayer(const IConnectableLayer* layer,
158  const SoftmaxDescriptor& softmaxDescriptor,
159  const char* name = nullptr) override;
160 
162  const SpaceToBatchNdDescriptor& spaceToBatchNdDescriptor,
163  const char* name = nullptr) override;
164 
165  void VisitSpaceToDepthLayer(const IConnectableLayer* layer,
166  const SpaceToDepthDescriptor& spaceToDepthDescriptor,
167  const char* name = nullptr) override;
168 
169  void VisitSplitterLayer(const IConnectableLayer* layer,
170  const SplitterDescriptor& splitterDescriptor,
171  const char* name = nullptr) override;
172 
173  void VisitStackLayer(const IConnectableLayer* layer,
174  const StackDescriptor& stackDescriptor,
175  const char* name = nullptr) override;
176 
177  void VisitStridedSliceLayer(const IConnectableLayer* layer,
178  const StridedSliceDescriptor& stridedSliceDescriptor,
179  const char* name = nullptr) override;
180 
181  void VisitSubtractionLayer(const IConnectableLayer* layer,
182  const char* name = nullptr) override;
183 
185  const TransposeConvolution2dDescriptor& descriptor,
186  const ConstTensor& weights,
187  const Optional<ConstTensor>& biases,
188  const char* name = nullptr) override;
189 
191  INetworkPtr RetrieveFinalNetwork() { return std::move(m_QuantizedNetwork); }
192 
193 private:
195  void SetQuantizedInputConnections(const IConnectableLayer* srcLayer, IConnectableLayer* quantizedLayer);
196 
198  void RecordLayer(const IConnectableLayer* srcLayer, IConnectableLayer* qLayer);
199 
201  ConstTensor CreateQuantizedBias(const IConnectableLayer* srcLayer,
202  const ConstTensor& weights,
203  const Optional<ConstTensor>& biases,
204  std::vector<int32_t>& weightsBacking);
205 
207  const RangeTracker& m_Ranges;
208 
210  INetworkPtr m_QuantizedNetwork;
211 
213  std::unordered_map<LayerGuid, LayerGuid> m_OriginalToQuantizedGuidMap;
214 
216  std::unordered_map<LayerGuid, IConnectableLayer*> m_QuantizedGuidToLayerMap;
217 
218  const IQuantizationScheme* m_QuantizationScheme;
219 
220  const bool m_PreserveType;
221 };
222 
223 } //namespace armnn
void VisitPreluLayer(const IConnectableLayer *layer, const char *name=nullptr) override
void VisitStridedSliceLayer(const IConnectableLayer *layer, const StridedSliceDescriptor &stridedSliceDescriptor, const char *name=nullptr) override
void VisitDepthwiseConvolution2dLayer(const IConnectableLayer *layer, const DepthwiseConvolution2dDescriptor &desc, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
A NormalizationDescriptor for the NormalizationLayer.
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:199
void VisitSliceLayer(const IConnectableLayer *layer, const SliceDescriptor &sliceDescriptor, const char *name=nullptr) override
void VisitElementwiseUnaryLayer(const IConnectableLayer *layer, const ElementwiseUnaryDescriptor &elementwiseUnaryDescriptor, const char *name=nullptr) override
void VisitReshapeLayer(const IConnectableLayer *layer, const ReshapeDescriptor &reshapeDescriptor, const char *name=nullptr) override
void VisitBatchNormalizationLayer(const IConnectableLayer *layer, const BatchNormalizationDescriptor &desc, const ConstTensor &mean, const ConstTensor &variance, const ConstTensor &beta, const ConstTensor &gamma, const char *name=nullptr) override
QuantizerVisitor(const RangeTracker &rangeTracker, const IQuantizationScheme *quantizationScheme, bool preserveType=false)
A PadDescriptor for the PadLayer.
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:20
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
void VisitAdditionLayer(const IConnectableLayer *layer, const char *name=nullptr) override
void VisitConstantLayer(const IConnectableLayer *layer, const ConstTensor &input, const char *name=nullptr) override
void VisitNormalizationLayer(const IConnectableLayer *layer, const NormalizationDescriptor &normalizationDescriptor, const char *name=nullptr) override
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.
void VisitLogSoftmaxLayer(const IConnectableLayer *layer, const LogSoftmaxDescriptor &logSoftmaxDescriptor, const char *name=nullptr) override
void VisitFullyConnectedLayer(const IConnectableLayer *layer, const FullyConnectedDescriptor &desc, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
A SpaceToDepthDescriptor for the SpaceToDepthLayer.
A ReshapeDescriptor for the ReshapeLayer.
void VisitConcatLayer(const IConnectableLayer *layer, const OriginsDescriptor &originsDescriptor, const char *name=nullptr) override
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
Definition: Descriptors.hpp:82
void VisitConvolution2dLayer(const IConnectableLayer *layer, const Convolution2dDescriptor &convolution2dDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
void VisitPermuteLayer(const IConnectableLayer *layer, const PermuteDescriptor &permuteDescriptor, const char *name=nullptr) override
void VisitPooling2dLayer(const IConnectableLayer *layer, const Pooling2dDescriptor &pooling2dDescriptor, const char *name=nullptr) override
void VisitSubtractionLayer(const IConnectableLayer *layer, const char *name=nullptr) override
void VisitSpaceToDepthLayer(const IConnectableLayer *layer, const SpaceToDepthDescriptor &spaceToDepthDescriptor, const char *name=nullptr) override
INetworkPtr RetrieveFinalNetwork()
Extract the quantized network.
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
A FullyConnectedDescriptor for the FullyConnectedLayer.
void VisitResizeBilinearLayer(const IConnectableLayer *layer, const ResizeBilinearDescriptor &resizeDesc, const char *name=nullptr) override
void VisitTransposeConvolution2dLayer(const IConnectableLayer *layer, const TransposeConvolution2dDescriptor &descriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:85
A StackDescriptor for the StackLayer.
void VisitSoftmaxLayer(const IConnectableLayer *layer, const SoftmaxDescriptor &softmaxDescriptor, const char *name=nullptr) override
void VisitPadLayer(const IConnectableLayer *, const PadDescriptor &, const char *name=nullptr) override
A ResizeBilinearDescriptor for the ResizeBilinearLayer.
A SoftmaxDescriptor for the SoftmaxLayer.
void VisitMultiplicationLayer(const IConnectableLayer *layer, const char *name=nullptr) override
void VisitStackLayer(const IConnectableLayer *layer, const StackDescriptor &stackDescriptor, const char *name=nullptr) override
Visitor object for quantizing layers in a network.
void VisitComparisonLayer(const IConnectableLayer *layer, const ComparisonDescriptor &comparisonDescriptor, const char *name=nullptr) override
void VisitActivationLayer(const IConnectableLayer *layer, const ActivationDescriptor &activationDescriptor, const char *name=nullptr) override
void VisitMeanLayer(const IConnectableLayer *layer, const MeanDescriptor &meanDescriptor, const char *name=nullptr) override
void VisitInputLayer(const IConnectableLayer *layer, LayerBindingId id, const char *name=nullptr) override
void VisitSplitterLayer(const IConnectableLayer *layer, const SplitterDescriptor &splitterDescriptor, const char *name=nullptr) override
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
A Pooling2dDescriptor for the Pooling2dLayer.
void VisitBatchToSpaceNdLayer(const IConnectableLayer *layer, const BatchToSpaceNdDescriptor &batchToSpaceNdDescriptor, const char *name=nullptr) override
A SliceDescriptor for the SliceLayer.
void VisitInstanceNormalizationLayer(const IConnectableLayer *layer, const InstanceNormalizationDescriptor &instanceNormalizationDescriptor, const char *name=nullptr) override
void VisitAbsLayer(const IConnectableLayer *layer, const char *name=nullptr) override
Functions to quantize the individual layers, overridden from ILayerVisitor.
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
void VisitOutputLayer(const IConnectableLayer *layer, LayerBindingId id, const char *name=nullptr) override
A PermuteDescriptor for the PermuteLayer.
A Convolution2dDescriptor for the Convolution2dLayer.
A MeanDescriptor for the MeanLayer.
A SpaceToBatchNdDescriptor for the SpaceToBatchNdLayer.
void VisitResizeLayer(const IConnectableLayer *layer, const ResizeDescriptor &resizeDescriptor, const char *name=nullptr) override
#define ARMNN_DEPRECATED_MSG(message)
Definition: Deprecated.hpp:43
An ArgMinMaxDescriptor for ArgMinMaxLayer.
Definition: Descriptors.hpp:43
void VisitDepthToSpaceLayer(const IConnectableLayer *layer, const DepthToSpaceDescriptor &depthToSpaceDescriptor, const char *name=nullptr) override
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:168
void VisitArgMinMaxLayer(const IConnectableLayer *layer, const ArgMinMaxDescriptor &argMinMaxDescriptor, const char *name=nullptr) override
A ResizeDescriptor for the ResizeLayer.
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:62
void VisitRsqrtLayer(const IConnectableLayer *, const char *name=nullptr) override
void VisitSpaceToBatchNdLayer(const IConnectableLayer *layer, const SpaceToBatchNdDescriptor &spaceToBatchNdDescriptor, const char *name=nullptr) override
An OriginsDescriptor for the ConcatLayer. Descriptor to configure the concatenation process...
A StridedSliceDescriptor for the StridedSliceLayer.