20 : m_Ranges(rangeTracker)
21 , m_QuantizedNetwork(
INetwork::Create())
22 , m_QuantizationScheme(quantizationScheme)
23 , m_PreserveType(preserveType)
27 void QuantizerVisitor::SetQuantizedInputConnections(
const IConnectableLayer* srcLayer,
34 const InputSlot* inputSlot = PolymorphicDowncast<const InputSlot*>(&srcInputSlot);
42 auto found = m_OriginalToQuantizedGuidMap.find(layerToFind.
GetGuid());
43 if (found == m_OriginalToQuantizedGuidMap.end())
54 newOutputSlot.
Connect(newInputSlot);
63 info.SetQuantizationOffset(qParams.second);
64 info.SetQuantizationScale(qParams.first);
72 std::vector<int32_t>& backing)
76 auto inputSlot = PolymorphicDowncast<const InputSlot*>(&srcInputSlot);
78 const OutputSlot* outputSlot = inputSlot->GetConnectedOutputSlot();
84 auto found = m_OriginalToQuantizedGuidMap.find(layerToFind.
GetGuid());
85 if (found == m_OriginalToQuantizedGuidMap.end())
89 return biases.
value();
101 backing.resize(biases.
value().GetInfo().GetNumElements());
104 for (
size_t i = 0; i < backing.size(); ++i)
106 float fp32Value =
static_cast<const float*
>(biases.
value().GetMemoryArea())[i];
115 m_OriginalToQuantizedGuidMap.insert(std::make_pair(srcLayer->
GetGuid(), quantizedLayer->
GetGuid()));
116 m_QuantizedGuidToLayerMap.insert(std::make_pair(quantizedLayer->
GetGuid(), quantizedLayer));
128 IConnectableLayer* newLayer = m_QuantizedNetwork->AddActivationLayer(activationDescriptor, name);
129 RecordLayer(layer, newLayer);
130 SetQuantizedInputConnections(layer, newLayer);
136 RecordLayer(layer, newLayer);
137 SetQuantizedInputConnections(layer, newLayer);
144 IConnectableLayer* newLayer = m_QuantizedNetwork->AddArgMinMaxLayer(argMinMaxDescriptor, name);
145 RecordLayer(layer, newLayer);
146 SetQuantizedInputConnections(layer, newLayer);
157 std::vector<uint8_t> meanBacking;
160 std::vector<uint8_t> varianceBacking;
163 std::vector<uint8_t> betaBacking;
166 std::vector<uint8_t> gammaBacking;
169 IConnectableLayer* newLayer = m_QuantizedNetwork->AddBatchNormalizationLayer(desc,
176 RecordLayer(layer, newLayer);
177 SetQuantizedInputConnections(layer, newLayer);
184 IConnectableLayer* newLayer = m_QuantizedNetwork->AddBatchToSpaceNdLayer(batchToSpaceNdDescriptor, name);
185 RecordLayer(layer, newLayer);
186 SetQuantizedInputConnections(layer, newLayer);
193 IConnectableLayer* newLayer = m_QuantizedNetwork->AddComparisonLayer(comparisonDescriptor, name);
194 RecordLayer(layer, newLayer);
195 SetQuantizedInputConnections(layer, newLayer);
202 IConnectableLayer* newLayer = m_QuantizedNetwork->AddConcatLayer(originsDescriptor, name);
203 RecordLayer(layer, newLayer);
204 SetQuantizedInputConnections(layer, newLayer);
211 std::vector<uint8_t> inputBacking;
214 IConnectableLayer* newLayer = m_QuantizedNetwork->AddConstantLayer(qInput, name);
215 RecordLayer(layer, newLayer);
224 std::vector<uint8_t> weightsBacking;
227 std::vector<int32_t> biasesBacking;
231 ConstTensor qBiases = CreateQuantizedBias(layer, qWeights, biases, biasesBacking);
235 IConnectableLayer* newLayer = m_QuantizedNetwork->AddConvolution2dLayer(convolution2dDescriptor,
240 RecordLayer(layer, newLayer);
241 SetQuantizedInputConnections(layer, newLayer);
248 IConnectableLayer* newLayer = m_QuantizedNetwork->AddDepthToSpaceLayer(descriptor, name);
249 RecordLayer(layer, newLayer);
250 SetQuantizedInputConnections(layer, newLayer);
259 std::vector<uint8_t> weightsBacking;
262 std::vector<int32_t> biasesBacking;
266 ConstTensor qBiases = CreateQuantizedBias(layer, qWeights, biases, biasesBacking);
270 IConnectableLayer* newLayer = m_QuantizedNetwork->AddDepthwiseConvolution2dLayer(desc,
275 RecordLayer(layer, newLayer);
276 SetQuantizedInputConnections(layer, newLayer);
283 IConnectableLayer* newLayer = m_QuantizedNetwork->AddElementwiseUnaryLayer(elementwiseUnaryDescriptor, name);
284 RecordLayer(layer, newLayer);
285 SetQuantizedInputConnections(layer, newLayer);
293 RecordLayer(layer, newLayer);
294 SetQuantizedInputConnections(layer, newLayer);
303 std::vector<uint8_t> weightsBacking;
306 std::vector<int32_t> biasesBacking;
310 ConstTensor qBiases = CreateQuantizedBias(layer, qWeights, biases, biasesBacking);
319 RecordLayer(layer, newLayer);
320 SetQuantizedInputConnections(layer, newLayer);
333 RecordLayer(layer, quantizeLayer);
337 RecordLayer(layer, inputLayer);
345 IConnectableLayer* newLayer = m_QuantizedNetwork->AddInstanceNormalizationLayer(descriptor, name);
346 RecordLayer(layer, newLayer);
347 SetQuantizedInputConnections(layer, newLayer);
354 IConnectableLayer* newLayer = m_QuantizedNetwork->AddLogSoftmaxLayer(logSoftmaxDescriptor, name);
355 RecordLayer(layer, newLayer);
356 SetQuantizedInputConnections(layer, newLayer);
363 IConnectableLayer* newLayer = m_QuantizedNetwork->AddMeanLayer(meanDescriptor, name);
364 RecordLayer(layer, newLayer);
365 SetQuantizedInputConnections(layer, newLayer);
372 RecordLayer(layer, newLayer);
373 SetQuantizedInputConnections(layer, newLayer);
380 IConnectableLayer* newLayer = m_QuantizedNetwork->AddNormalizationLayer(normalizationDescriptor, name);
381 RecordLayer(layer, newLayer);
382 SetQuantizedInputConnections(layer, newLayer);
394 RecordLayer(layer, dequantizeLayer);
395 SetQuantizedInputConnections(layer, dequantizeLayer);
401 RecordLayer(layer, outputLayer);
402 SetQuantizedInputConnections(layer, outputLayer);
410 IConnectableLayer* newLayer = m_QuantizedNetwork->AddPadLayer(padDescriptor, name);
411 RecordLayer(layer, newLayer);
412 SetQuantizedInputConnections(layer, newLayer);
419 IConnectableLayer* newLayer = m_QuantizedNetwork->AddPermuteLayer(permuteDescriptor, name);
420 RecordLayer(layer, newLayer);
421 SetQuantizedInputConnections(layer, newLayer);
428 IConnectableLayer* newLayer = m_QuantizedNetwork->AddPooling2dLayer(pooling2dDescriptor, name);
429 RecordLayer(layer, newLayer);
430 SetQuantizedInputConnections(layer, newLayer);
437 RecordLayer(layer, newLayer);
438 SetQuantizedInputConnections(layer, newLayer);
445 IConnectableLayer* newLayer = m_QuantizedNetwork->AddReshapeLayer(reshapeDescriptor, name);
446 RecordLayer(layer, newLayer);
447 SetQuantizedInputConnections(layer, newLayer);
467 IConnectableLayer* newLayer = m_QuantizedNetwork->AddResizeLayer(resizeDescriptor, name);
468 RecordLayer(layer, newLayer);
469 SetQuantizedInputConnections(layer, newLayer);
481 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSliceLayer(sliceDescriptor, name);
482 RecordLayer(layer, newLayer);
483 SetQuantizedInputConnections(layer, newLayer);
490 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSoftmaxLayer(softmaxDescriptor, name);
491 RecordLayer(layer, newLayer);
492 SetQuantizedInputConnections(layer, newLayer);
499 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSpaceToBatchNdLayer(spaceToBatchNdDescriptor, name);
500 RecordLayer(layer, newLayer);
501 SetQuantizedInputConnections(layer, newLayer);
508 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSpaceToDepthLayer(spaceToDepthDescriptor, name);
509 RecordLayer(layer, newLayer);
510 SetQuantizedInputConnections(layer, newLayer);
517 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSplitterLayer(splitterDescriptor, name);
518 RecordLayer(layer, newLayer);
519 SetQuantizedInputConnections(layer, newLayer);
526 IConnectableLayer* newLayer = m_QuantizedNetwork->AddStackLayer(stackDescriptor, name);
527 RecordLayer(layer, newLayer);
528 SetQuantizedInputConnections(layer, newLayer);
535 IConnectableLayer* newLayer = m_QuantizedNetwork->AddStridedSliceLayer(stridedSliceDescriptor, name);
536 RecordLayer(layer, newLayer);
537 SetQuantizedInputConnections(layer, newLayer);
544 RecordLayer(layer, newLayer);
545 SetQuantizedInputConnections(layer, newLayer);
555 std::vector<uint8_t> weightsBacking;
559 std::vector<int32_t> biasesBacking;
563 ConstTensor qBiases = CreateQuantizedBias(layer, qWeights, biases, biasesBacking);
567 IConnectableLayer* newLayer = m_QuantizedNetwork->AddTransposeConvolution2dLayer(descriptor,
572 RecordLayer(layer, newLayer);
573 SetQuantizedInputConnections(layer, newLayer);
580 IConnectableLayer* newLayer = m_QuantizedNetwork->AddTransposeLayer(transposeDescriptor, name);
581 RecordLayer(layer, newLayer);
582 SetQuantizedInputConnections(layer, newLayer);
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...
std::pair< float, int > OffsetScalePair
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.
QuantizerVisitor(const RangeTracker &rangeTracker, const IQuantizationScheme *quantizationScheme, bool preserveType=false)
virtual unsigned int GetNumInputSlots() const =0
Returns the number of connectable input slots.
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.
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.
uint32_t m_TargetWidth
Target width value.
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...
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
A Convolution2dDescriptor for the Convolution2dLayer.
Layer & GetOwningLayer() const
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...
ResizeMethod m_Method
The Interpolation method to use (Bilinear, NearestNeighbor).
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...
Main network class which provides the interface for building up a neural network. ...
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.
virtual OffsetScalePair ComputeScheme(double min, double max) const =0
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).
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...
virtual void SetTensorInfo(const TensorInfo &tensorInfo)=0
void VisitAbsLayer(const IConnectableLayer *layer, const char *name=nullptr) override
Functions to quantize the individual layers, overridden from ILayerVisitor.
A ResizeDescriptor for the ResizeLayer.
MinMaxRange GetRange(LayerGuid guid, unsigned int idx) const
Retrieve the Range for a particular output slot on a particular layer.
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.
#define ARMNN_ASSERT_MSG(COND, MSG)
An output connection slot for a layer.
An ArgMinMaxDescriptor for ArgMinMaxLayer.
float GetQuantizationScale() const
DataType GetDataType() const
An OriginsDescriptor for the ConcatLayer.
bool has_value() const noexcept
A FullyConnectedDescriptor for the FullyConnectedLayer.
virtual LayerGuid GetGuid() const =0
Returns the unique id of the layer.
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.
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...
uint32_t m_TargetWidth
Target width value.
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...
#define ARMNN_ASSERT(COND)
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.
const TensorInfo & GetInfo() const
uint32_t m_TargetHeight
Target height value.
uint32_t m_TargetHeight
Target height value.
A SliceDescriptor for the SliceLayer.
void VisitFillLayer(const IConnectableLayer *layer, const FillDescriptor &desc, const char *name) override
Function a fill layer should call back to when its Accept(ILayerVisitor&) function is invoked...
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...
virtual DataType GetDataType() const =0
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
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...
virtual const IInputSlot & GetInputSlot(unsigned int index) const =0
Get a const input slot handle by slot index.
A MeanDescriptor for the MeanLayer.
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
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...
virtual const TensorInfo & GetTensorInfo() const =0
virtual const IOutputSlot & GetOutputSlot(unsigned int index) const =0
Get the const output slot handle by slot index.
virtual int Connect(IInputSlot &destination)=0
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.
ConstTensor CreateQuantizedConst(const ConstTensor &tensor, std::vector< uint8_t > &backing)
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...
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
A ResizeBilinearDescriptor for the ResizeBilinearLayer.
const TensorInfo & GetTensorInfo() const override
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 FillDescriptor for the FillLayer.
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...
LayerGuid GetGuid() const final
Returns the unique id of the layer.
unsigned int CalculateIndexOnOwner() const override