ArmNN
 20.05
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 
24 /// Visitor object for quantizing layers in a network
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 
34  /// Functions to quantize the individual layers, overridden from ILayerVisitor
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 
190  void VisitTransposeLayer(const IConnectableLayer* layer,
191  const TransposeDescriptor& descriptor,
192  const char* name = nullptr) override;
193 
194  /// Extract the quantized network
195  INetworkPtr RetrieveFinalNetwork() { return std::move(m_QuantizedNetwork); }
196 
197 private:
198  /// Connects the layer to preceeding layers and sets the quantization parameters based on recorded ranges
199  void SetQuantizedInputConnections(const IConnectableLayer* srcLayer, IConnectableLayer* quantizedLayer);
200 
201  /// Record the guids so we can easily find the layers later
202  void RecordLayer(const IConnectableLayer* srcLayer, IConnectableLayer* qLayer);
203 
204  /// Sets the bias quantization scale based on input and weight scales
205  ConstTensor CreateQuantizedBias(const IConnectableLayer* srcLayer,
206  const ConstTensor& weights,
207  const Optional<ConstTensor>& biases,
208  std::vector<int32_t>& weightsBacking);
209 
210  /// Reference to the static range visitor used to retrieve the quantization ranges
211  const RangeTracker& m_Ranges;
212 
213  /// Quantized version of the model we are building up
214  INetworkPtr m_QuantizedNetwork;
215 
216  /// Mapping from input network guids to quantized network guids
217  std::unordered_map<LayerGuid, LayerGuid> m_OriginalToQuantizedGuidMap;
218 
219  /// Mapping from guid to layer in quantized network
220  std::unordered_map<LayerGuid, IConnectableLayer*> m_QuantizedGuidToLayerMap;
221 
222  const IQuantizationScheme* m_QuantizationScheme;
223 
224  const bool m_PreserveType;
225 };
226 
227 } //namespace armnn
void VisitInputLayer(const IConnectableLayer *layer, LayerBindingId id, const char *name=nullptr) override
Function that an InputLayer should call back to when its Accept(ILayerVisitor&) function is invoked...
void VisitTransposeConvolution2dLayer(const IConnectableLayer *layer, const TransposeConvolution2dDescriptor &descriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
Function that a 2D transpose convolution layer should call back to when its Accept(ILayerVisitor&) fu...
A ViewsDescriptor for the SplitterLayer.
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
QuantizerVisitor(const RangeTracker &rangeTracker, const IQuantizationScheme *quantizationScheme, bool preserveType=false)
void VisitRsqrtLayer(const IConnectableLayer *, const char *name=nullptr) override
Function a Reciprocal of square root layer should call back to when its Accept(ILayerVisitor&) functi...
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
A ReshapeDescriptor for the ReshapeLayer.
INetworkPtr RetrieveFinalNetwork()
Extract the quantized network.
void VisitPadLayer(const IConnectableLayer *, const PadDescriptor &, const char *name=nullptr) override
Function a pad layer should call back to when its Accept(ILayerVisitor&) function is invoked...
void VisitMultiplicationLayer(const IConnectableLayer *layer, const char *name=nullptr) override
Function that a multiplication layer should call back to when its Accept(ILayerVisitor&) function is ...
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:70
void VisitInstanceNormalizationLayer(const IConnectableLayer *layer, const InstanceNormalizationDescriptor &instanceNormalizationDescriptor, const char *name=nullptr) override
Function that an instance normalization layer should call back to when its Accept(ILayerVisitor&) fun...
A Convolution2dDescriptor for the Convolution2dLayer.
void VisitReshapeLayer(const IConnectableLayer *layer, const ReshapeDescriptor &reshapeDescriptor, const char *name=nullptr) override
Function a reshape layer should call back to when its Accept(ILayerVisitor&) function is invoked...
void VisitAdditionLayer(const IConnectableLayer *layer, const char *name=nullptr) override
Function that an addition layer should call back to when its Accept(ILayerVisitor&) function is invok...
void VisitLogSoftmaxLayer(const IConnectableLayer *layer, const LogSoftmaxDescriptor &logSoftmaxDescriptor, const char *name=nullptr) override
Function that a log softmax layer should call back to when its Accept(ILayerVisitor&) function is inv...
void VisitResizeBilinearLayer(const IConnectableLayer *layer, const ResizeBilinearDescriptor &resizeDesc, const char *name=nullptr) override
Function that a resize bilinear layer should call back to when its Accept(ILayerVisitor&) function is...
void VisitStridedSliceLayer(const IConnectableLayer *layer, const StridedSliceDescriptor &stridedSliceDescriptor, const char *name=nullptr) override
Function a strided slice layer should call back to when its Accept(ILayerVisitor&) function is invoke...
Copyright (c) 2020 ARM Limited.
void VisitStackLayer(const IConnectableLayer *layer, const StackDescriptor &stackDescriptor, const char *name=nullptr) override
Function a stack layer should call back to when its Accept(ILayerVisitor&) function is invoked...
A SpaceToDepthDescriptor for the SpaceToDepthLayer.
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
Function that a batch normalization layer should call back to when its Accept(ILayerVisitor&) functio...
void VisitSubtractionLayer(const IConnectableLayer *layer, const char *name=nullptr) override
Function a subtraction layer should call back to when its Accept(ILayerVisitor&) function is invoked...
A BatchToSpaceNdDescriptor for the BatchToSpaceNdLayer.
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
Definition: Types.hpp:171
void VisitSpaceToBatchNdLayer(const IConnectableLayer *layer, const SpaceToBatchNdDescriptor &spaceToBatchNdDescriptor, const char *name=nullptr) override
Function a space to batch layer should call back to when its Accept(ILayerVisitor&) function is invok...
void VisitAbsLayer(const IConnectableLayer *layer, const char *name=nullptr) override
Functions to quantize the individual layers, overridden from ILayerVisitor.
A ResizeDescriptor for the ResizeLayer.
A StackDescriptor for the StackLayer.
void VisitDepthwiseConvolution2dLayer(const IConnectableLayer *layer, const DepthwiseConvolution2dDescriptor &desc, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
Function that a 2D depthwise convolution layer with biases should call back to when its Accept(ILayer...
void VisitResizeLayer(const IConnectableLayer *layer, const ResizeDescriptor &resizeDescriptor, const char *name=nullptr) override
Function that a resize layer should call back to when its Accept(ILayerVisitor&) function is invoked...
A PadDescriptor for the PadLayer.
An ArgMinMaxDescriptor for ArgMinMaxLayer.
Definition: Descriptors.hpp:51
An OriginsDescriptor for the ConcatLayer.
A FullyConnectedDescriptor for the FullyConnectedLayer.
void VisitTransposeLayer(const IConnectableLayer *layer, const TransposeDescriptor &descriptor, const char *name=nullptr) override
Function that a transpose layer should call back to when its Accept(ILayerVisitor&) function is invok...
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
Definition: Tensor.hpp:199
void VisitDepthToSpaceLayer(const IConnectableLayer *layer, const DepthToSpaceDescriptor &depthToSpaceDescriptor, const char *name=nullptr) override
Function a depth to space layer should call back to when its Accept(ILayerVisitor&) function is invok...
void VisitConcatLayer(const IConnectableLayer *layer, const OriginsDescriptor &originsDescriptor, const char *name=nullptr) override
Function that a concat layer should call back to when its Accept(ILayerVisitor&) function is invoked...
Visitor object for quantizing layers in a network.
void VisitConvolution2dLayer(const IConnectableLayer *layer, const Convolution2dDescriptor &convolution2dDescriptor, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
Function that a 2D convolution layer should call back to when its Accept(ILayerVisitor&) function is ...
void VisitPermuteLayer(const IConnectableLayer *layer, const PermuteDescriptor &permuteDescriptor, const char *name=nullptr) override
Function that a permute layer should call back to when its Accept(ILayerVisitor&) function is invoked...
An ActivationDescriptor for the ActivationLayer.
Definition: Descriptors.hpp:20
A SliceDescriptor for the SliceLayer.
Visitor base class with empty implementations.
A SpaceToBatchNdDescriptor for the SpaceToBatchNdLayer.
void VisitActivationLayer(const IConnectableLayer *layer, const ActivationDescriptor &activationDescriptor, const char *name=nullptr) override
Function that an activation layer should call back to when its Accept(ILayerVisitor&) function is inv...
void VisitComparisonLayer(const IConnectableLayer *layer, const ComparisonDescriptor &comparisonDescriptor, const char *name=nullptr) override
Function a Comparison layer should call back to when its Accept(ILayerVisitor&) function is invoked...
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
Definition: Descriptors.hpp:90
void VisitSoftmaxLayer(const IConnectableLayer *layer, const SoftmaxDescriptor &softmaxDescriptor, const char *name=nullptr) override
Function that a softmax layer should call back to when its Accept(ILayerVisitor&) function is invoked...
void VisitMeanLayer(const IConnectableLayer *layer, const MeanDescriptor &meanDescriptor, const char *name=nullptr) override
Function a Mean layer should call back to when its Accept(ILayerVisitor&) function is invoked...
void VisitArgMinMaxLayer(const IConnectableLayer *layer, const ArgMinMaxDescriptor &argMinMaxDescriptor, const char *name=nullptr) override
Function that an arg min max layer should call back to when its Accept(ILayerVisitor&) function is in...
void VisitElementwiseUnaryLayer(const IConnectableLayer *layer, const ElementwiseUnaryDescriptor &elementwiseUnaryDescriptor, const char *name=nullptr) override
Function a ElementwiseUnary layer should call back to when its Accept(ILayerVisitor&) function is inv...
A MeanDescriptor for the MeanLayer.
A TransposeDescriptor for the TransposeLayer.
A StridedSliceDescriptor for the StridedSliceLayer.
void VisitConstantLayer(const IConnectableLayer *layer, const ConstTensor &input, const char *name=nullptr) override
Function a layer with no inputs and a single output, which always corresponds to the passed in consta...
#define ARMNN_DEPRECATED_MSG(message)
Definition: Deprecated.hpp:43
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Definition: INetwork.hpp:101
void VisitSpaceToDepthLayer(const IConnectableLayer *layer, const SpaceToDepthDescriptor &spaceToDepthDescriptor, const char *name=nullptr) override
Function a space to depth layer should call back to when its Accept(ILayerVisitor&) function is invok...
void VisitBatchToSpaceNdLayer(const IConnectableLayer *layer, const BatchToSpaceNdDescriptor &batchToSpaceNdDescriptor, const char *name=nullptr) override
Function that a batch to space ND layer should call back to when its Accept(ILayerVisitor&) function ...
A Pooling2dDescriptor for the Pooling2dLayer.
A NormalizationDescriptor for the NormalizationLayer.
void VisitSliceLayer(const IConnectableLayer *layer, const SliceDescriptor &sliceDescriptor, const char *name=nullptr) override
Function that a slice layer should call back to when its Accept(ILayerVisitor&) function is invoked...
void VisitOutputLayer(const IConnectableLayer *layer, LayerBindingId id, const char *name=nullptr) override
Function an output layer should call back to when its Accept(ILayerVisitor&) function is invoked...
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
A ResizeBilinearDescriptor for the ResizeBilinearLayer.
A SoftmaxDescriptor for the SoftmaxLayer.
void VisitPreluLayer(const IConnectableLayer *layer, const char *name=nullptr) override
Function that a PReLU activation layer should call back to when its Accept(ILayerVisitor&) function i...
void VisitNormalizationLayer(const IConnectableLayer *layer, const NormalizationDescriptor &normalizationDescriptor, const char *name=nullptr) override
Function that a normalization layer should call back to when its Accept(ILayerVisitor&) function is i...
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
A BatchNormalizationDescriptor for the BatchNormalizationLayer.
void VisitPooling2dLayer(const IConnectableLayer *layer, const Pooling2dDescriptor &pooling2dDescriptor, const char *name=nullptr) override
Function that a pooling layer should call back to when its Accept(ILayerVisitor&) function is invoked...
A PermuteDescriptor for the PermuteLayer.
void VisitFullyConnectedLayer(const IConnectableLayer *layer, const FullyConnectedDescriptor &desc, const ConstTensor &weights, const Optional< ConstTensor > &biases, const char *name=nullptr) override
Function that a fully connected layer should call back to when its Accept(ILayerVisitor&) function is...
void VisitSplitterLayer(const IConnectableLayer *layer, const SplitterDescriptor &splitterDescriptor, const char *name=nullptr) override
Function that a splitter layer should call back to when its Accept(ILayerVisitor&) function is invoke...