17 : m_Ranges(rangeTracker)
18 , m_QuantizedNetwork(
INetwork::Create())
19 , m_QuantizationScheme(quantizationScheme)
20 , m_PreserveType(preserveType)
24 void QuantizerVisitor::SetQuantizedInputConnections(
const IConnectableLayer* srcLayer,
27 BOOST_ASSERT(srcLayer);
31 const InputSlot* inputSlot = boost::polymorphic_downcast<const InputSlot*>(&srcInputSlot);
32 BOOST_ASSERT(inputSlot);
35 BOOST_ASSERT(outputSlot);
39 auto found = m_OriginalToQuantizedGuidMap.find(layerToFind.
GetGuid());
40 if (found == m_OriginalToQuantizedGuidMap.end())
43 BOOST_ASSERT_MSG(
false,
"Error in graph traversal");
51 newOutputSlot.
Connect(newInputSlot);
60 info.SetQuantizationOffset(qParams.second);
61 info.SetQuantizationScale(qParams.first);
69 std::vector<int32_t>& backing)
71 BOOST_ASSERT(srcLayer);
73 auto inputSlot = boost::polymorphic_downcast<const InputSlot*>(&srcInputSlot);
74 BOOST_ASSERT(inputSlot);
75 const OutputSlot* outputSlot = inputSlot->GetConnectedOutputSlot();
77 BOOST_ASSERT(outputSlot);
81 auto found = m_OriginalToQuantizedGuidMap.find(layerToFind.
GetGuid());
82 if (found == m_OriginalToQuantizedGuidMap.end())
85 BOOST_ASSERT_MSG(
false,
"Error in graph traversal");
86 return biases.
value();
98 backing.resize(biases.
value().GetInfo().GetNumElements());
101 for (
size_t i = 0; i < backing.size(); ++i)
103 float fp32Value =
static_cast<const float*
>(biases.
value().GetMemoryArea())[i];
112 m_OriginalToQuantizedGuidMap.insert(std::make_pair(srcLayer->
GetGuid(), quantizedLayer->
GetGuid()));
113 m_QuantizedGuidToLayerMap.insert(std::make_pair(quantizedLayer->
GetGuid(), quantizedLayer));
125 IConnectableLayer* newLayer = m_QuantizedNetwork->AddActivationLayer(activationDescriptor, name);
126 RecordLayer(layer, newLayer);
127 SetQuantizedInputConnections(layer, newLayer);
133 RecordLayer(layer, newLayer);
134 SetQuantizedInputConnections(layer, newLayer);
141 IConnectableLayer* newLayer = m_QuantizedNetwork->AddArgMinMaxLayer(argMinMaxDescriptor, name);
142 RecordLayer(layer, newLayer);
143 SetQuantizedInputConnections(layer, newLayer);
154 std::vector<uint8_t> meanBacking;
157 std::vector<uint8_t> varianceBacking;
160 std::vector<uint8_t> betaBacking;
163 std::vector<uint8_t> gammaBacking;
166 IConnectableLayer* newLayer = m_QuantizedNetwork->AddBatchNormalizationLayer(desc,
173 RecordLayer(layer, newLayer);
174 SetQuantizedInputConnections(layer, newLayer);
181 IConnectableLayer* newLayer = m_QuantizedNetwork->AddBatchToSpaceNdLayer(batchToSpaceNdDescriptor, name);
182 RecordLayer(layer, newLayer);
183 SetQuantizedInputConnections(layer, newLayer);
190 IConnectableLayer* newLayer = m_QuantizedNetwork->AddComparisonLayer(comparisonDescriptor, name);
191 RecordLayer(layer, newLayer);
192 SetQuantizedInputConnections(layer, newLayer);
199 IConnectableLayer* newLayer = m_QuantizedNetwork->AddConcatLayer(originsDescriptor, name);
200 RecordLayer(layer, newLayer);
201 SetQuantizedInputConnections(layer, newLayer);
208 std::vector<uint8_t> inputBacking;
211 IConnectableLayer* newLayer = m_QuantizedNetwork->AddConstantLayer(qInput, name);
212 RecordLayer(layer, newLayer);
221 std::vector<uint8_t> weightsBacking;
224 std::vector<int32_t> biasesBacking;
228 ConstTensor qBiases = CreateQuantizedBias(layer, qWeights, biases, biasesBacking);
232 IConnectableLayer* newLayer = m_QuantizedNetwork->AddConvolution2dLayer(convolution2dDescriptor,
237 RecordLayer(layer, newLayer);
238 SetQuantizedInputConnections(layer, newLayer);
245 IConnectableLayer* newLayer = m_QuantizedNetwork->AddDepthToSpaceLayer(descriptor, name);
246 RecordLayer(layer, newLayer);
247 SetQuantizedInputConnections(layer, newLayer);
256 std::vector<uint8_t> weightsBacking;
259 std::vector<int32_t> biasesBacking;
263 ConstTensor qBiases = CreateQuantizedBias(layer, qWeights, biases, biasesBacking);
267 IConnectableLayer* newLayer = m_QuantizedNetwork->AddDepthwiseConvolution2dLayer(desc,
272 RecordLayer(layer, newLayer);
273 SetQuantizedInputConnections(layer, newLayer);
280 IConnectableLayer* newLayer = m_QuantizedNetwork->AddElementwiseUnaryLayer(elementwiseUnaryDescriptor, name);
281 RecordLayer(layer, newLayer);
282 SetQuantizedInputConnections(layer, newLayer);
291 std::vector<uint8_t> weightsBacking;
294 std::vector<int32_t> biasesBacking;
298 ConstTensor qBiases = CreateQuantizedBias(layer, qWeights, biases, biasesBacking);
307 RecordLayer(layer, newLayer);
308 SetQuantizedInputConnections(layer, newLayer);
321 RecordLayer(layer, quantizeLayer);
325 RecordLayer(layer, inputLayer);
333 IConnectableLayer* newLayer = m_QuantizedNetwork->AddInstanceNormalizationLayer(descriptor, name);
334 RecordLayer(layer, newLayer);
335 SetQuantizedInputConnections(layer, newLayer);
342 IConnectableLayer* newLayer = m_QuantizedNetwork->AddLogSoftmaxLayer(logSoftmaxDescriptor, name);
343 RecordLayer(layer, newLayer);
344 SetQuantizedInputConnections(layer, newLayer);
351 IConnectableLayer* newLayer = m_QuantizedNetwork->AddMeanLayer(meanDescriptor, name);
352 RecordLayer(layer, newLayer);
353 SetQuantizedInputConnections(layer, newLayer);
360 RecordLayer(layer, newLayer);
361 SetQuantizedInputConnections(layer, newLayer);
368 IConnectableLayer* newLayer = m_QuantizedNetwork->AddNormalizationLayer(normalizationDescriptor, name);
369 RecordLayer(layer, newLayer);
370 SetQuantizedInputConnections(layer, newLayer);
382 RecordLayer(layer, dequantizeLayer);
383 SetQuantizedInputConnections(layer, dequantizeLayer);
389 RecordLayer(layer, outputLayer);
390 SetQuantizedInputConnections(layer, outputLayer);
398 IConnectableLayer* newLayer = m_QuantizedNetwork->AddPadLayer(padDescriptor, name);
399 RecordLayer(layer, newLayer);
400 SetQuantizedInputConnections(layer, newLayer);
407 IConnectableLayer* newLayer = m_QuantizedNetwork->AddPermuteLayer(permuteDescriptor, name);
408 RecordLayer(layer, newLayer);
409 SetQuantizedInputConnections(layer, newLayer);
416 IConnectableLayer* newLayer = m_QuantizedNetwork->AddPooling2dLayer(pooling2dDescriptor, name);
417 RecordLayer(layer, newLayer);
418 SetQuantizedInputConnections(layer, newLayer);
425 RecordLayer(layer, newLayer);
426 SetQuantizedInputConnections(layer, newLayer);
433 IConnectableLayer* newLayer = m_QuantizedNetwork->AddReshapeLayer(reshapeDescriptor, name);
434 RecordLayer(layer, newLayer);
435 SetQuantizedInputConnections(layer, newLayer);
455 IConnectableLayer* newLayer = m_QuantizedNetwork->AddResizeLayer(resizeDescriptor, name);
456 RecordLayer(layer, newLayer);
457 SetQuantizedInputConnections(layer, newLayer);
469 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSliceLayer(sliceDescriptor, name);
470 RecordLayer(layer, newLayer);
471 SetQuantizedInputConnections(layer, newLayer);
478 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSoftmaxLayer(softmaxDescriptor, name);
479 RecordLayer(layer, newLayer);
480 SetQuantizedInputConnections(layer, newLayer);
487 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSpaceToBatchNdLayer(spaceToBatchNdDescriptor, name);
488 RecordLayer(layer, newLayer);
489 SetQuantizedInputConnections(layer, newLayer);
496 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSpaceToDepthLayer(spaceToDepthDescriptor, name);
497 RecordLayer(layer, newLayer);
498 SetQuantizedInputConnections(layer, newLayer);
505 IConnectableLayer* newLayer = m_QuantizedNetwork->AddSplitterLayer(splitterDescriptor, name);
506 RecordLayer(layer, newLayer);
507 SetQuantizedInputConnections(layer, newLayer);
514 IConnectableLayer* newLayer = m_QuantizedNetwork->AddStackLayer(stackDescriptor, name);
515 RecordLayer(layer, newLayer);
516 SetQuantizedInputConnections(layer, newLayer);
523 IConnectableLayer* newLayer = m_QuantizedNetwork->AddStridedSliceLayer(stridedSliceDescriptor, name);
524 RecordLayer(layer, newLayer);
525 SetQuantizedInputConnections(layer, newLayer);
532 RecordLayer(layer, newLayer);
533 SetQuantizedInputConnections(layer, newLayer);
543 std::vector<uint8_t> weightsBacking;
547 std::vector<int32_t> biasesBacking;
551 ConstTensor qBiases = CreateQuantizedBias(layer, qWeights, biases, biasesBacking);
555 IConnectableLayer* newLayer = m_QuantizedNetwork->AddTransposeConvolution2dLayer(descriptor,
560 RecordLayer(layer, newLayer);
561 SetQuantizedInputConnections(layer, newLayer);
568 IConnectableLayer* newLayer = m_QuantizedNetwork->AddTransposeLayer(transposeDescriptor, name);
569 RecordLayer(layer, newLayer);
570 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.
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...
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
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.
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.
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 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