14 #include <fmt/format.h>
17 using namespace armnn;
18 namespace fb = flatbuffers;
24 ISerializer::ISerializer() : pSerializerImpl(new SerializerImpl())
28 ISerializer::~ISerializer() =
default;
47 pSerializerImpl->Serialize(inNetwork);
50 bool ISerializer::SaveSerializedToStream(std::ostream& stream)
52 return pSerializerImpl->SaveSerializedToStream(stream);
60 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
62 return serializer::ActivationFunction::ActivationFunction_TanH;
64 return serializer::ActivationFunction::ActivationFunction_Linear;
66 return serializer::ActivationFunction::ActivationFunction_ReLu;
68 return serializer::ActivationFunction::ActivationFunction_BoundedReLu;
70 return serializer::ActivationFunction::ActivationFunction_LeakyReLu;
72 return serializer::ActivationFunction::ActivationFunction_Abs;
74 return serializer::ActivationFunction::ActivationFunction_Sqrt;
76 return serializer::ActivationFunction::ActivationFunction_Square;
78 return serializer::ActivationFunction::ActivationFunction_Elu;
80 return serializer::ActivationFunction::ActivationFunction_HardSwish;
82 return serializer::ActivationFunction::ActivationFunction_Sigmoid;
91 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Max;
94 return serializer::ArgMinMaxFunction::ArgMinMaxFunction_Min;
98 uint32_t SerializerStrategy::GetSerializedId(
LayerGuid guid)
100 if (m_guidMap.empty())
102 m_guidMap.insert(std::make_pair(guid, m_layerId));
104 else if (m_guidMap.find(guid) == m_guidMap.end())
107 m_guidMap.insert(std::make_pair(guid, m_layerId));
111 return m_guidMap[guid];
120 auto flatBufferInputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Input);
123 auto flatBufferInputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
124 flatBufferInputBaseLayer,
127 m_inputIds.push_back(
id);
130 auto flatBufferInputLayer = serializer::CreateInputLayer(m_flatBufferBuilder, flatBufferInputBindableBaseLayer);
133 CreateAnyLayer(flatBufferInputLayer.o, serializer::Layer::Layer_InputLayer);
143 auto flatBufferOutputBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Output);
146 auto flatBufferOutputBindableBaseLayer = serializer::CreateBindableLayerBase(m_flatBufferBuilder,
147 flatBufferOutputBaseLayer,
150 m_outputIds.push_back(
id);
153 auto flatBufferOutputLayer = serializer::CreateOutputLayer(m_flatBufferBuilder, flatBufferOutputBindableBaseLayer);
155 CreateAnyLayer(flatBufferOutputLayer.o, serializer::Layer::Layer_OutputLayer);
166 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Activation);
169 auto flatBufferDescriptor = CreateActivationDescriptor(m_flatBufferBuilder,
175 auto flatBufferAdditionLayer = CreateActivationLayer(m_flatBufferBuilder,
177 flatBufferDescriptor);
180 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_ActivationLayer);
189 auto flatBufferAdditionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Addition);
192 auto flatBufferAdditionLayer = serializer::CreateAdditionLayer(m_flatBufferBuilder, flatBufferAdditionBaseLayer);
195 CreateAnyLayer(flatBufferAdditionLayer.o, serializer::Layer::Layer_AdditionLayer);
206 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ArgMinMax);
209 auto flatBufferDescriptor = CreateArgMinMaxDescriptor(m_flatBufferBuilder,
214 auto flatBufferLayer = CreateArgMinMaxLayer(m_flatBufferBuilder,
216 flatBufferDescriptor);
218 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ArgMinMaxLayer);
228 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchMatMul);
231 auto flatBufferDescriptor = CreateBatchMatMulDescriptor(m_flatBufferBuilder,
240 auto flatBufferBatchMatMulLayer = CreateBatchMatMulLayer(m_flatBufferBuilder,
242 flatBufferDescriptor);
245 CreateAnyLayer(flatBufferBatchMatMulLayer.o, serializer::Layer::Layer_BatchMatMulLayer);
256 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchToSpaceNd);
258 std::vector<unsigned int> crops;
259 crops.reserve(descriptor.
m_Crops.size() * 2);
260 for (
auto& crop : descriptor.
m_Crops)
262 crops.push_back(crop.first);
263 crops.push_back(crop.second);
266 auto flatBufferDescriptor =
267 CreateBatchToSpaceNdDescriptor(m_flatBufferBuilder,
268 m_flatBufferBuilder.CreateVector(descriptor.
m_BlockShape),
269 m_flatBufferBuilder.CreateVector(crops),
272 auto flatBufferLayer = serializer::CreateBatchToSpaceNdLayer(m_flatBufferBuilder,
274 flatBufferDescriptor);
276 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_BatchToSpaceNdLayer);
279 void SerializerStrategy::SerializeBatchNormalizationLayer(
282 const std::vector<armnn::ConstTensor>& constants,
292 auto fbBatchNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_BatchNormalization);
293 auto fbBatchNormalizationDescriptor = serializer::CreateBatchNormalizationDescriptor(
295 batchNormDescriptor.
m_Eps,
298 auto fbMeanConstTensorInfo = CreateConstTensorInfo(mean);
299 auto fbVarianceConstTensorInfo = CreateConstTensorInfo(variance);
300 auto fbBetaConstTensorInfo = CreateConstTensorInfo(beta);
301 auto fbGammaConstTensorInfo = CreateConstTensorInfo(gamma);
302 auto fbBatchNormalizationLayer = serializer::CreateBatchNormalizationLayer(m_flatBufferBuilder,
303 fbBatchNormalizationBaseLayer,
304 fbBatchNormalizationDescriptor,
305 fbMeanConstTensorInfo,
306 fbVarianceConstTensorInfo,
307 fbBetaConstTensorInfo,
308 fbGammaConstTensorInfo);
310 CreateAnyLayer(fbBatchNormalizationLayer.o, serializer::Layer::Layer_BatchNormalizationLayer);
318 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Cast);
319 auto fbCastLayer = serializer::CreateCastLayer(m_flatBufferBuilder, fbBaseLayer);
320 CreateAnyLayer(fbCastLayer.o, serializer::Layer::Layer_CastLayer);
328 auto fbDescriptor = CreateChannelShuffleDescriptor(m_flatBufferBuilder,
331 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ChannelShuffle);
332 auto fbChannelShuffleLayer = serializer::CreateChannelShuffleLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
333 CreateAnyLayer(fbChannelShuffleLayer.o, serializer::Layer::Layer_ChannelShuffleLayer);
342 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Comparison);
343 auto fbDescriptor = serializer::CreateComparisonDescriptor(
347 auto fbLayer = serializer::CreateComparisonLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
348 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ComparisonLayer);
353 const std::vector<armnn::ConstTensor>& constants,
361 auto flatBufferConstantBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Constant);
363 auto flatBufferConstTensorInfo = CreateConstTensorInfo(input);
366 auto flatBufferLayer = CreateConstantLayer(m_flatBufferBuilder,
367 flatBufferConstantBaseLayer,
368 flatBufferConstTensorInfo);
371 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConstantLayer);
382 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
384 auto flatBufferDescriptor = CreateConvolution2dDescriptor(m_flatBufferBuilder,
397 auto flatBufferLayer = CreateConvolution2dLayer(m_flatBufferBuilder,
399 flatBufferDescriptor);
402 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution2dLayer);
413 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution3d);
415 auto flatBufferDescriptor = CreateConvolution3dDescriptor(m_flatBufferBuilder,
432 auto flatBufferLayer = CreateConvolution3dLayer(m_flatBufferBuilder,
434 flatBufferDescriptor);
437 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_Convolution3dLayer);
446 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthToSpace);
447 auto fbDescriptor = CreateDepthToSpaceDescriptor(m_flatBufferBuilder,
451 auto fbLayer = serializer::CreateDepthToSpaceLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
453 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_DepthToSpaceLayer);
462 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DepthwiseConvolution2d);
463 auto fbDescriptor = CreateDepthwiseConvolution2dDescriptor(m_flatBufferBuilder,
475 auto flatBufferLayer = CreateDepthwiseConvolution2dLayer(m_flatBufferBuilder,
479 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DepthwiseConvolution2dLayer);
487 auto fbDequantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Dequantize);
488 auto fbDequantizeLayer = serializer::CreateDequantizeLayer(m_flatBufferBuilder, fbDequantizeBaseLayer);
490 CreateAnyLayer(fbDequantizeLayer.o, serializer::Layer::Layer_DequantizeLayer);
495 const std::vector<armnn::ConstTensor>& constants,
502 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_DetectionPostProcess);
503 auto fbDescriptor = CreateDetectionPostProcessDescriptor(m_flatBufferBuilder,
516 flatbuffers::Offset<serializer::ConstTensor> fbAnchorsConstTensorInfo = CreateConstTensorInfo(anchors);
518 auto flatBufferLayer = CreateDetectionPostProcessLayer(m_flatBufferBuilder,
521 fbAnchorsConstTensorInfo);
523 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_DetectionPostProcessLayer);
530 auto fbDivisionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Division);
531 auto fbDivisionLayer = serializer::CreateDivisionLayer(m_flatBufferBuilder, fbDivisionBaseLayer);
533 CreateAnyLayer(fbDivisionLayer.o, serializer::Layer::Layer_DivisionLayer);
542 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseBinary);
543 auto fbDescriptor = serializer::CreateElementwiseBinaryDescriptor(
547 auto fbLayer = serializer::CreateElementwiseBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
548 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseBinaryLayer);
557 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_ElementwiseUnary);
558 auto fbDescriptor = serializer::CreateElementwiseUnaryDescriptor(
562 auto fbLayer = serializer::CreateElementwiseUnaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
563 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_ElementwiseUnaryLayer);
572 auto fbFillBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Fill);
574 auto fbDescriptor = serializer::CreateFillDescriptor(m_flatBufferBuilder, fillDescriptor.
m_Value);
576 auto fbFillLayer = serializer::CreateFillLayer(m_flatBufferBuilder, fbFillBaseLayer, fbDescriptor);
578 CreateAnyLayer(fbFillLayer.o, serializer::Layer::Layer_FillLayer);
585 auto flatBufferFloorBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Floor);
586 auto flatBufferFloorLayer = serializer::CreateFloorLayer(m_flatBufferBuilder, flatBufferFloorBaseLayer);
588 CreateAnyLayer(flatBufferFloorLayer.o, serializer::Layer::Layer_FloorLayer);
597 auto fbGatherDescriptor = CreateGatherDescriptor(m_flatBufferBuilder,
599 auto fbGatherBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Gather);
600 auto flatBufferLayer = serializer::CreateGatherLayer(m_flatBufferBuilder, fbGatherBaseLayer, fbGatherDescriptor);
602 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherLayer);
610 auto fbGatherNdBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_GatherNd);
611 auto flatBufferLayer = serializer::CreateGatherNdLayer(m_flatBufferBuilder, fbGatherNdBaseLayer);
613 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_GatherNdLayer);
616 void SerializerStrategy::SerializeInstanceNormalizationLayer(
623 auto fbDescriptor = serializer::CreateInstanceNormalizationDescriptor(
625 instanceNormalizationDescriptor.
m_Gamma,
626 instanceNormalizationDescriptor.
m_Beta,
627 instanceNormalizationDescriptor.
m_Eps,
630 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_InstanceNormalization);
631 auto fbLayer = serializer::CreateInstanceNormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
633 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_InstanceNormalizationLayer);
643 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_L2Normalization);
646 auto fbDescriptor = serializer::CreateL2NormalizationDescriptor(
649 l2NormalizationDescriptor.
m_Eps);
652 auto fbLayer = serializer::CreateL2NormalizationLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
654 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_L2NormalizationLayer);
663 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogicalBinary);
664 auto fbDescriptor = serializer::CreateLogicalBinaryDescriptor(
668 auto fbLayer = serializer::CreateLogicalBinaryLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
669 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_LogicalBinaryLayer);
679 auto flatBufferLogSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_LogSoftmax);
682 auto flatBufferLogSoftmaxDesc =
683 serializer::CreateLogSoftmaxDescriptor(m_flatBufferBuilder,
684 logSoftmaxDescriptor.
m_Beta,
685 logSoftmaxDescriptor.
m_Axis);
688 auto flatBufferLogSoftmaxLayer =
689 serializer::CreateLogSoftmaxLayer(m_flatBufferBuilder,
690 flatBufferLogSoftmaxBaseLayer,
691 flatBufferLogSoftmaxDesc);
693 CreateAnyLayer(flatBufferLogSoftmaxLayer.o, serializer::Layer::Layer_LogSoftmaxLayer);
698 const std::vector<armnn::ConstTensor>& constants,
703 auto fbLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Lstm);
705 auto fbLstmDescriptor = serializer::CreateLstmDescriptor(
719 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
720 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
721 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
722 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
723 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
724 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
725 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
726 auto cellBias = CreateConstTensorInfo(constants[i++]);
727 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
732 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
733 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
734 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
735 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
736 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
737 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
738 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
739 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
740 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
741 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
742 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
743 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
747 inputToInputWeights = CreateConstTensorInfo(constants[i++]);
748 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
749 inputGateBias = CreateConstTensorInfo(constants[i++]);
756 cellToInputWeights = CreateConstTensorInfo(constants[i++]);
758 cellToForgetWeights = CreateConstTensorInfo(constants[i++]);
759 cellToOutputWeights = CreateConstTensorInfo(constants[i++]);
764 projectionWeights = CreateConstTensorInfo(constants[i++]);
765 projectionBias = CreateConstTensorInfo(constants[i++]);
772 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]);
774 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]);
775 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]);
776 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]);
779 auto fbLstmParams = serializer::CreateLstmInputParams(
781 inputToForgetWeights,
783 inputToOutputWeights,
784 recurrentToForgetWeights,
785 recurrentToCellWeights,
786 recurrentToOutputWeights,
791 recurrentToInputWeights,
798 inputLayerNormWeights,
799 forgetLayerNormWeights,
800 cellLayerNormWeights,
801 outputLayerNormWeights);
803 auto fbLstmLayer = serializer::CreateLstmLayer(
809 CreateAnyLayer(fbLstmLayer.o, serializer::Layer::Layer_LstmLayer);
816 auto fbMaximumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Maximum);
817 auto fbMaximumLayer = serializer::CreateMaximumLayer(m_flatBufferBuilder, fbMaximumBaseLayer);
819 CreateAnyLayer(fbMaximumLayer.o, serializer::Layer::Layer_MaximumLayer);
828 auto fbMeanBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Mean);
829 auto fbMeanDescriptor = serializer::CreateMeanDescriptor(m_flatBufferBuilder,
830 m_flatBufferBuilder.CreateVector(descriptor.
m_Axis),
833 auto fbMeanLayer = serializer::CreateMeanLayer(m_flatBufferBuilder,
837 CreateAnyLayer(fbMeanLayer.o, serializer::Layer::Layer_MeanLayer);
844 auto fbMinimumBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Minimum);
845 auto fbMinimumLayer = serializer::CreateMinimumLayer(m_flatBufferBuilder, fbMinimumBaseLayer);
847 CreateAnyLayer(fbMinimumLayer.o, serializer::Layer::Layer_MinimumLayer);
854 auto fbMergeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Merge);
855 auto fbMergeLayer = serializer::CreateMergeLayer(m_flatBufferBuilder, fbMergeBaseLayer);
857 CreateAnyLayer(fbMergeLayer.o, serializer::Layer::Layer_MergeLayer);
866 auto flatBufferConcatBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Concat);
868 std::vector<flatbuffers::Offset<UintVector>> views;
869 for (
unsigned int v = 0; v < concatDescriptor.
GetNumViews(); ++v)
872 std::vector<uint32_t> origins;
875 origins.push_back(origin[d]);
877 auto view = m_flatBufferBuilder.CreateVector(origins);
878 auto uintVector = CreateUintVector(m_flatBufferBuilder, view);
879 views.push_back(uintVector);
882 auto flatBufferConcatDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
886 m_flatBufferBuilder.CreateVector(views));
888 auto flatBufferLayer = CreateConcatLayer(m_flatBufferBuilder,
889 flatBufferConcatBaseLayer,
890 flatBufferConcatDescriptor);
892 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ConcatLayer);
899 auto fbMultiplicationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Multiplication);
900 auto fbMultiplicationLayer = serializer::CreateMultiplicationLayer(m_flatBufferBuilder,
901 fbMultiplicationBaseLayer);
903 CreateAnyLayer(fbMultiplicationLayer.o, serializer::Layer::Layer_MultiplicationLayer);
912 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pad);
914 std::vector<unsigned int> padList;
917 padList.push_back(p.first);
918 padList.push_back(p.second);
921 auto flatBufferPadDesc = serializer::CreatePadDescriptor(m_flatBufferBuilder,
922 m_flatBufferBuilder.CreateVector(padList),
926 auto flatBufferPadLayer = serializer::CreatePadLayer(m_flatBufferBuilder,
930 CreateAnyLayer(flatBufferPadLayer.o, serializer::Layer::Layer_PadLayer);
940 auto flatBufferPermuteBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Permute);
942 std::vector<unsigned int> dimMappings;
948 auto flatBufferPermuteDesc = serializer::CreatePermuteDescriptor(m_flatBufferBuilder,
949 m_flatBufferBuilder.CreateVector(dimMappings));
952 auto flatBufferPermuteLayer = serializer::CreatePermuteLayer(m_flatBufferBuilder,
953 flatBufferPermuteBaseLayer,
954 flatBufferPermuteDesc);
957 CreateAnyLayer(flatBufferPermuteLayer.o, serializer::Layer::Layer_PermuteLayer);
965 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Rank);
966 auto flatBufferRankLayer = serializer::CreateRankLayer(m_flatBufferBuilder, flatBufferBaseLayer);
968 CreateAnyLayer(flatBufferRankLayer.o, serializer::Layer::Layer_RankLayer);
975 auto fbReduceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reduce);
976 auto fbDescriptor = CreateReduceDescriptor(m_flatBufferBuilder,
978 m_flatBufferBuilder.CreateVector(reduceDescriptor.
m_vAxis),
980 auto fbReduceLayer = serializer::CreateReduceLayer(m_flatBufferBuilder,
984 CreateAnyLayer(fbReduceLayer.o, serializer::Layer::Layer_ReduceLayer);
995 auto flatBufferReshapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Reshape);
997 std::vector<unsigned int> targetShape;
1003 auto flatBufferReshapeDesc = serializer::CreateReshapeDescriptor(m_flatBufferBuilder,
1004 m_flatBufferBuilder.CreateVector(targetShape));
1007 auto flatBufferReshapeLayer = serializer::CreateReshapeLayer(m_flatBufferBuilder, flatBufferReshapeBaseLayer,
1008 flatBufferReshapeDesc);
1011 CreateAnyLayer(flatBufferReshapeLayer.o, serializer::Layer::Layer_ReshapeLayer);
1020 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Resize);
1022 auto flatBufferDescriptor =
1023 CreateResizeDescriptor(m_flatBufferBuilder,
1031 auto flatBufferLayer = serializer::CreateResizeLayer(m_flatBufferBuilder,
1032 flatBufferBaseLayer,
1033 flatBufferDescriptor);
1035 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_ResizeLayer);
1044 auto fbSliceBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Slice);
1045 auto fbSliceDescriptor = CreateSliceDescriptor(m_flatBufferBuilder,
1046 m_flatBufferBuilder.CreateVector(sliceDescriptor.
m_Begin),
1047 m_flatBufferBuilder.CreateVector(sliceDescriptor.
m_Size));
1049 auto fbSliceLayer = serializer::CreateSliceLayer(m_flatBufferBuilder, fbSliceBaseLayer, fbSliceDescriptor);
1051 CreateAnyLayer(fbSliceLayer.o, serializer::Layer::Layer_SliceLayer);
1062 auto flatBufferSoftmaxBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Softmax);
1065 auto flatBufferSoftmaxDesc =
1066 serializer::CreateSoftmaxDescriptor(m_flatBufferBuilder,
1067 softmaxDescriptor.
m_Beta,
1068 softmaxDescriptor.
m_Axis);
1071 auto flatBufferSoftmaxLayer =
1072 serializer::CreateSoftmaxLayer(m_flatBufferBuilder,
1073 flatBufferSoftmaxBaseLayer,
1074 flatBufferSoftmaxDesc);
1076 CreateAnyLayer(flatBufferSoftmaxLayer.o, serializer::Layer::Layer_SoftmaxLayer);
1085 auto fbPooling2dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling2d);
1086 auto fbPooling2dDescriptor = serializer::CreatePooling2dDescriptor(
1087 m_flatBufferBuilder,
1101 auto fbPooling2dLayer = serializer::CreatePooling2dLayer(m_flatBufferBuilder,
1102 fbPooling2dBaseLayer,
1103 fbPooling2dDescriptor);
1105 CreateAnyLayer(fbPooling2dLayer.o, serializer::Layer::Layer_Pooling2dLayer);
1114 auto fbPooling3dBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Pooling3d);
1115 auto fbPooling3dDescriptor = serializer::CreatePooling3dDescriptor(
1116 m_flatBufferBuilder,
1134 auto fbPooling3dLayer = serializer::CreatePooling3dLayer(m_flatBufferBuilder,
1135 fbPooling3dBaseLayer,
1136 fbPooling3dDescriptor);
1138 CreateAnyLayer(fbPooling3dLayer.o, serializer::Layer::Layer_Pooling3dLayer);
1147 auto flatBufferPreluBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Prelu);
1150 auto flatBufferPreluLayer = serializer::CreatePreluLayer(m_flatBufferBuilder, flatBufferPreluBaseLayer);
1153 CreateAnyLayer(flatBufferPreluLayer.o, serializer::Layer::Layer_PreluLayer);
1160 auto fbQuantizeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Quantize);
1161 auto fbQuantizeLayer = serializer::CreateQuantizeLayer(m_flatBufferBuilder,
1162 fbQuantizeBaseLayer);
1163 CreateAnyLayer(fbQuantizeLayer.o, serializer::Layer::Layer_QuantizeLayer);
1172 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_FullyConnected);
1175 auto flatBufferDescriptor =
1176 serializer::CreateFullyConnectedDescriptor(m_flatBufferBuilder,
1182 auto flatBufferLayer = serializer::CreateFullyConnectedLayer(m_flatBufferBuilder,
1183 flatBufferBaseLayer,
1184 flatBufferDescriptor);
1187 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_FullyConnectedLayer);
1198 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToBatchNd);
1200 std::vector<unsigned int> padList;
1201 padList.reserve(spaceToBatchNdDescriptor.
m_PadList.size()*2);
1202 for (
auto& pad : spaceToBatchNdDescriptor.
m_PadList)
1204 padList.push_back(pad.first);
1205 padList.push_back(pad.second);
1208 auto flatBufferDescriptor =
1209 CreateSpaceToBatchNdDescriptor(m_flatBufferBuilder,
1210 m_flatBufferBuilder.CreateVector(spaceToBatchNdDescriptor.
m_BlockShape),
1211 m_flatBufferBuilder.CreateVector(padList),
1214 auto flatBufferLayer = serializer::CreateSpaceToBatchNdLayer(m_flatBufferBuilder,
1215 flatBufferBaseLayer,
1216 flatBufferDescriptor);
1218 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToBatchNdLayer);
1228 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_SpaceToDepth);
1229 auto flatBufferDescriptor =
1230 CreateSpaceToDepthDescriptor(m_flatBufferBuilder,
1234 auto flatBufferLayer = serializer::CreateSpaceToDepthLayer(m_flatBufferBuilder,
1235 flatBufferBaseLayer,
1236 flatBufferDescriptor);
1238 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_SpaceToDepthLayer);
1249 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewOrigins;
1250 flatBufferViewOrigins.reserve(viewsDescriptor.
GetNumViews());
1252 for(
unsigned int vIdx = 0; vIdx < viewsDescriptor.
GetNumViews(); ++vIdx)
1254 std::vector<uint32_t> viewOrigin;
1258 for(
unsigned int dIdx = 0; dIdx < viewsDescriptor.
GetNumDimensions(); ++dIdx)
1260 viewOrigin.push_back(viewsDescriptor.
GetViewOrigin(vIdx)[dIdx]);
1263 flatBufferViewOrigins.push_back(CreateUintVector(m_flatBufferBuilder,
1264 m_flatBufferBuilder.CreateVector(viewOrigin)));
1268 auto flatBufferOriginDescriptor = CreateOriginsDescriptor(m_flatBufferBuilder,
1272 m_flatBufferBuilder.CreateVector(flatBufferViewOrigins));
1275 std::vector<flatbuffers::Offset<UintVector>> flatBufferViewSizes;
1276 flatBufferViewSizes.reserve(viewsDescriptor.
GetNumViews());
1278 for(
unsigned int vIdx = 0; vIdx < viewsDescriptor.
GetNumViews(); ++vIdx)
1280 std::vector<uint32_t> viewSize;
1284 for(
unsigned int dIdx = 0; dIdx < viewsDescriptor.
GetNumDimensions(); ++dIdx)
1286 viewSize.push_back(viewsDescriptor.
GetViewSizes(vIdx)[dIdx]);
1289 flatBufferViewSizes.push_back(CreateUintVector(m_flatBufferBuilder,
1290 m_flatBufferBuilder.CreateVector(viewSize)));
1294 auto flatBufferViewsDescriptor = CreateViewsDescriptor(m_flatBufferBuilder,
1295 flatBufferOriginDescriptor,
1296 m_flatBufferBuilder.CreateVector(flatBufferViewSizes));
1299 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Splitter);
1301 auto flatBufferSplitterLayer = serializer::CreateSplitterLayer(m_flatBufferBuilder,
1302 flatBufferBaseLayer,
1303 flatBufferViewsDescriptor);
1305 CreateAnyLayer(flatBufferSplitterLayer.o, serializer::Layer::Layer_SplitterLayer);
1314 auto fbNormalizationBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Normalization);
1316 auto fbNormalizationDescriptor = serializer::CreateNormalizationDescriptor(
1317 m_flatBufferBuilder,
1326 auto flatBufferLayer = serializer::CreateNormalizationLayer(m_flatBufferBuilder,
1327 fbNormalizationBaseLayer,
1328 fbNormalizationDescriptor);
1330 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_NormalizationLayer);
1338 auto shapeBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Shape);
1339 auto shapeLayer = serializer::CreateShapeLayer(m_flatBufferBuilder, shapeBaseLayer);
1341 CreateAnyLayer(shapeLayer.o, serializer::Layer::Layer_ShapeLayer);
1350 auto stackBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Stack);
1352 std::vector<unsigned int> inputShape;
1358 auto flatBufferStackDescriptor = CreateStackDescriptor(m_flatBufferBuilder,
1361 m_flatBufferBuilder.CreateVector(inputShape));
1363 auto stackLayer = serializer::CreateStackLayer(m_flatBufferBuilder, stackBaseLayer, flatBufferStackDescriptor);
1364 CreateAnyLayer(stackLayer.o, serializer::Layer::Layer_StackLayer);
1373 auto fbDescriptor = serializer::CreateStandInDescriptor(m_flatBufferBuilder,
1377 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StandIn);
1378 auto fbLayer = serializer::CreateStandInLayer(m_flatBufferBuilder, fbBaseLayer, fbDescriptor);
1380 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_StandInLayer);
1389 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_StridedSlice);
1391 auto flatBufferDescriptor =
1392 CreateStridedSliceDescriptor(m_flatBufferBuilder,
1393 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.
m_Begin),
1394 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.
m_End),
1395 m_flatBufferBuilder.CreateVector(stridedSliceDescriptor.
m_Stride),
1403 auto flatBufferLayer = serializer::CreateStridedSliceLayer(m_flatBufferBuilder,
1404 flatBufferBaseLayer,
1405 flatBufferDescriptor);
1407 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_StridedSliceLayer);
1414 auto fbSubtractionBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Subtraction);
1415 auto fbSubtractionLayer = serializer::CreateSubtractionLayer(m_flatBufferBuilder, fbSubtractionBaseLayer);
1417 CreateAnyLayer(fbSubtractionLayer.o, serializer::Layer::Layer_SubtractionLayer);
1424 auto fbSwitchBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Switch);
1425 auto fbSwitchLayer = serializer::CreateSwitchLayer(m_flatBufferBuilder, fbSwitchBaseLayer);
1427 CreateAnyLayer(fbSwitchLayer.o, serializer::Layer::Layer_SwitchLayer);
1430 void SerializerStrategy::SerializeTransposeConvolution2dLayer(
1433 const std::vector<armnn::ConstTensor>& constants,
1440 auto fbBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Convolution2d);
1441 auto fbDescriptor = CreateTransposeConvolution2dDescriptor(m_flatBufferBuilder,
1452 auto fbWeightsConstTensorInfo = CreateConstTensorInfo(weights);
1453 flatbuffers::Offset<serializer::ConstTensor> fbBiasesConstTensorInfo;
1454 if (constants.size() > 1)
1457 fbBiasesConstTensorInfo = CreateConstTensorInfo(biases);
1460 auto fbLayer = CreateTransposeConvolution2dLayer(m_flatBufferBuilder,
1463 fbWeightsConstTensorInfo,
1464 fbBiasesConstTensorInfo);
1466 CreateAnyLayer(fbLayer.o, serializer::Layer::Layer_TransposeConvolution2dLayer);
1476 auto flatBufferBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_Transpose);
1478 std::vector<unsigned int> dimMappings;
1484 auto flatBufferDesc = serializer::CreateTransposeDescriptor(m_flatBufferBuilder,
1485 m_flatBufferBuilder.CreateVector(dimMappings));
1488 auto flatBufferLayer = serializer::CreateTransposeLayer(m_flatBufferBuilder,
1489 flatBufferBaseLayer,
1493 CreateAnyLayer(flatBufferLayer.o, serializer::Layer::Layer_TransposeLayer);
1498 const std::vector<armnn::ConstTensor>& constants,
1503 auto fbQLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QLstm);
1505 auto fbQLstmDescriptor = serializer::CreateQLstmDescriptor(
1506 m_flatBufferBuilder,
1525 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1526 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1527 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
1528 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1529 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1530 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
1531 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1532 auto cellBias = CreateConstTensorInfo(constants[i++]);
1533 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
1536 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1537 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1538 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1542 inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1543 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1544 inputGateBias = CreateConstTensorInfo(constants[i++]);
1548 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1549 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1550 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1556 cellToInputWeights = CreateConstTensorInfo(constants[i++]);
1558 cellToForgetWeights = CreateConstTensorInfo(constants[i++]);
1559 cellToOutputWeights = CreateConstTensorInfo(constants[i++]);
1563 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1564 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1568 projectionWeights = CreateConstTensorInfo(constants[i++]);
1569 projectionBias = CreateConstTensorInfo(constants[i++]);
1573 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1574 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1575 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1576 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1582 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]);
1584 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]);
1585 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]);
1586 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]);
1589 auto fbQLstmParams = serializer::CreateQLstmInputParams(
1590 m_flatBufferBuilder,
1591 inputToForgetWeights,
1593 inputToOutputWeights,
1594 recurrentToForgetWeights,
1595 recurrentToCellWeights,
1596 recurrentToOutputWeights,
1600 inputToInputWeights,
1601 recurrentToInputWeights,
1606 cellToForgetWeights,
1607 cellToOutputWeights,
1608 inputLayerNormWeights,
1609 forgetLayerNormWeights,
1610 cellLayerNormWeights,
1611 outputLayerNormWeights);
1613 auto fbQLstmLayer = serializer::CreateQLstmLayer(
1614 m_flatBufferBuilder,
1619 CreateAnyLayer(fbQLstmLayer.o, serializer::Layer::Layer_QLstmLayer);
1623 const std::vector<armnn::ConstTensor>& constants,
1628 auto fbQuantizedLstmBaseLayer = CreateLayerBase(layer, serializer::LayerType::LayerType_QuantizedLstm);
1634 auto inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1635 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1636 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1637 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
1639 auto recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1640 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1641 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1642 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
1644 auto inputGateBias = CreateConstTensorInfo(constants[i++]);
1645 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1646 auto cellBias = CreateConstTensorInfo(constants[i++]);
1647 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
1649 auto fbQuantizedLstmParams = serializer::CreateQuantizedLstmInputParams(
1650 m_flatBufferBuilder,
1651 inputToInputWeights,
1652 inputToForgetWeights,
1654 inputToOutputWeights,
1655 recurrentToInputWeights,
1656 recurrentToForgetWeights,
1657 recurrentToCellWeights,
1658 recurrentToOutputWeights,
1664 auto fbQuantizedLstmLayer = serializer::CreateQuantizedLstmLayer(
1665 m_flatBufferBuilder,
1666 fbQuantizedLstmBaseLayer,
1667 fbQuantizedLstmParams);
1669 CreateAnyLayer(fbQuantizedLstmLayer.o, serializer::Layer::Layer_QuantizedLstmLayer);
1672 void SerializerStrategy::SerializeUnidirectionalSequenceLstmLayer(
1675 const std::vector<armnn::ConstTensor>& constants,
1680 auto fbUnidirectionalSequenceLstmBaseLayer =
1681 CreateLayerBase(layer, serializer::LayerType::LayerType_UnidirectionalSequenceLstm);
1683 auto fbUnidirectionalSequenceLstmDescriptor = serializer::CreateUnidirectionalSequenceLstmDescriptor(
1684 m_flatBufferBuilder,
1698 auto inputToForgetWeights = CreateConstTensorInfo(constants[i++]);
1699 auto inputToCellWeights = CreateConstTensorInfo(constants[i++]);
1700 auto inputToOutputWeights = CreateConstTensorInfo(constants[i++]);
1701 auto recurrentToForgetWeights = CreateConstTensorInfo(constants[i++]);
1702 auto recurrentToCellWeights = CreateConstTensorInfo(constants[i++]);
1703 auto recurrentToOutputWeights = CreateConstTensorInfo(constants[i++]);
1704 auto forgetGateBias = CreateConstTensorInfo(constants[i++]);
1705 auto cellBias = CreateConstTensorInfo(constants[i++]);
1706 auto outputGateBias = CreateConstTensorInfo(constants[i++]);
1709 flatbuffers::Offset<serializer::ConstTensor> inputToInputWeights;
1710 flatbuffers::Offset<serializer::ConstTensor> recurrentToInputWeights;
1711 flatbuffers::Offset<serializer::ConstTensor> cellToInputWeights;
1712 flatbuffers::Offset<serializer::ConstTensor> inputGateBias;
1713 flatbuffers::Offset<serializer::ConstTensor> projectionWeights;
1714 flatbuffers::Offset<serializer::ConstTensor> projectionBias;
1715 flatbuffers::Offset<serializer::ConstTensor> cellToForgetWeights;
1716 flatbuffers::Offset<serializer::ConstTensor> cellToOutputWeights;
1717 flatbuffers::Offset<serializer::ConstTensor> inputLayerNormWeights;
1718 flatbuffers::Offset<serializer::ConstTensor> forgetLayerNormWeights;
1719 flatbuffers::Offset<serializer::ConstTensor> cellLayerNormWeights;
1720 flatbuffers::Offset<serializer::ConstTensor> outputLayerNormWeights;
1724 inputToInputWeights = CreateConstTensorInfo(constants[i++]);
1725 recurrentToInputWeights = CreateConstTensorInfo(constants[i++]);
1726 inputGateBias = CreateConstTensorInfo(constants[i++]);
1733 cellToInputWeights = CreateConstTensorInfo(constants[i++]);
1735 cellToForgetWeights = CreateConstTensorInfo(constants[i++]);
1736 cellToOutputWeights = CreateConstTensorInfo(constants[i++]);
1741 projectionWeights = CreateConstTensorInfo(constants[i++]);
1742 projectionBias = CreateConstTensorInfo(constants[i++]);
1749 inputLayerNormWeights = CreateConstTensorInfo(constants[i++]);
1751 forgetLayerNormWeights = CreateConstTensorInfo(constants[i++]);
1752 cellLayerNormWeights = CreateConstTensorInfo(constants[i++]);
1753 outputLayerNormWeights = CreateConstTensorInfo(constants[i++]);
1756 auto fbUnidirectionalSequenceLstmParams = serializer::CreateLstmInputParams(
1757 m_flatBufferBuilder,
1758 inputToForgetWeights,
1760 inputToOutputWeights,
1761 recurrentToForgetWeights,
1762 recurrentToCellWeights,
1763 recurrentToOutputWeights,
1767 inputToInputWeights,
1768 recurrentToInputWeights,
1773 cellToForgetWeights,
1774 cellToOutputWeights,
1775 inputLayerNormWeights,
1776 forgetLayerNormWeights,
1777 cellLayerNormWeights,
1778 outputLayerNormWeights);
1780 auto fbUnidirectionalSequenceLstmLayer = serializer::CreateUnidirectionalSequenceLstmLayer(
1781 m_flatBufferBuilder,
1782 fbUnidirectionalSequenceLstmBaseLayer,
1783 fbUnidirectionalSequenceLstmDescriptor,
1784 fbUnidirectionalSequenceLstmParams);
1786 CreateAnyLayer(fbUnidirectionalSequenceLstmLayer.o, serializer::Layer::Layer_UnidirectionalSequenceLstmLayer);
1789 fb::Offset<serializer::LayerBase> SerializerStrategy::CreateLayerBase(
const IConnectableLayer* layer,
1793 uint32_t fbIndex = GetSerializedId(layer->
GetGuid());
1795 std::vector<fb::Offset<serializer::InputSlot>> inputSlots = CreateInputSlots(layer);
1796 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots = CreateOutputSlots(layer);
1798 return serializer::CreateLayerBase(m_flatBufferBuilder,
1800 m_flatBufferBuilder.CreateString(layer->
GetName()),
1802 m_flatBufferBuilder.CreateVector(inputSlots),
1803 m_flatBufferBuilder.CreateVector(outputSlots));
1806 void SerializerStrategy::CreateAnyLayer(
const flatbuffers::Offset<void>& layer,
const serializer::Layer serializerLayer)
1809 auto anyLayer = armnnSerializer::CreateAnyLayer(m_flatBufferBuilder, serializerLayer, layer);
1810 m_serializedLayers.push_back(anyLayer);
1813 template <
typename T>
1814 flatbuffers::Offset<flatbuffers::Vector<T>> SerializerStrategy::CreateDataVector(
const void* memory,
unsigned int size)
1816 const T* buffer =
reinterpret_cast<const T*
>(memory);
1817 std::vector<T> vector(buffer, buffer + (size /
sizeof(T)));
1818 auto fbVector = m_flatBufferBuilder.CreateVector(vector);
1822 flatbuffers::Offset<TensorInfo> SerializerStrategy::CreateTensorInfo(
const armnn::TensorInfo& tensorInfo)
1825 std::vector<unsigned int> shape;
1826 std::vector<bool> specificity;
1829 for(
unsigned int dim = 0; dim < tensorInfo.
GetShape().GetNumDimensions(); ++dim)
1835 shape.push_back(tensorInfo.
GetShape()[dim]);
1846 auto flatBufferTensorInfo =
1847 serializer::CreateTensorInfo(m_flatBufferBuilder,
1848 m_flatBufferBuilder.CreateVector(shape),
1854 static_cast<unsigned int>
1856 m_flatBufferBuilder.CreateVector(specificity));
1857 return flatBufferTensorInfo;
1861 auto flatBufferTensorInfo = serializer::CreateTensorInfo(m_flatBufferBuilder,
1862 m_flatBufferBuilder.CreateVector(shape),
1868 static_cast<unsigned int>
1870 m_flatBufferBuilder.CreateVector(specificity));
1871 return flatBufferTensorInfo;
1874 flatbuffers::Offset<serializer::ConstTensor>
1879 flatbuffers::Offset<void> fbPayload;
1886 flatbuffers::Offset<serializer::LongData> flatBuffersData = serializer::CreateLongData(
1887 m_flatBufferBuilder,
1889 fbPayload = flatBuffersData.o;
1896 flatbuffers::Offset<serializer::IntData> flatBuffersData = serializer::CreateIntData(
1897 m_flatBufferBuilder,
1899 fbPayload = flatBuffersData.o;
1907 flatbuffers::Offset<serializer::ShortData> flatBuffersData = serializer::CreateShortData(
1908 m_flatBufferBuilder,
1910 fbPayload = flatBuffersData.o;
1920 flatbuffers::Offset<serializer::ByteData> flatBuffersData = serializer::CreateByteData(
1921 m_flatBufferBuilder,
1923 fbPayload = flatBuffersData.o;
1926 flatbuffers::Offset<serializer::ConstTensor> flatBufferConstTensor = serializer::CreateConstTensor(
1927 m_flatBufferBuilder,
1928 CreateTensorInfo(tensorInfo),
1931 return flatBufferConstTensor;
1934 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> SerializerStrategy::GetVersionTable()
1936 flatbuffers::Offset<armnnSerializer::FeatureCompatibilityVersions> versionsTable =
1937 serializer::CreateFeatureCompatibilityVersions(
1938 m_flatBufferBuilder,
1943 return versionsTable;
1946 std::vector<fb::Offset<serializer::InputSlot>>
1949 std::vector<fb::Offset<serializer::InputSlot>> inputSlots;
1952 for (
unsigned int slotIndex = 0; slotIndex<layer->
GetNumInputSlots(); ++slotIndex)
1963 inputSlots.push_back(serializer::CreateInputSlot(m_flatBufferBuilder, slotIndex, &conn));
1968 std::vector<fb::Offset<serializer::OutputSlot>>
1971 std::vector<fb::Offset<serializer::OutputSlot>> outputSlots;
1974 for (
unsigned int slotIndex = 0; slotIndex < layer->
GetNumOutputSlots(); ++slotIndex)
1980 outputSlots.push_back(serializer::CreateOutputSlot(m_flatBufferBuilder,
1982 CreateTensorInfo(tensorInfo)));
1989 const std::vector<armnn::ConstTensor>& constants,
2001 SerializeActivationLayer(layer, layerDescriptor, name);
2006 SerializeAdditionLayer(layer, name);
2013 SerializeArgMinMaxLayer(layer, layerDescriptor, name);
2020 SerializeBatchMatMulLayer(layer,
2029 SerializeBatchNormalizationLayer(layer,
2039 SerializeBatchToSpaceNdLayer(layer,
2046 SerializeCastLayer(layer, name);
2053 SerializeChannelShuffleLayer(layer,
2062 SerializeComparisonLayer(layer,
2071 SerializeConcatLayer(layer,
2078 SerializeConstantLayer(layer,
2087 SerializeConvolution2dLayer(layer,
2096 SerializeConvolution3dLayer(layer,
2105 SerializeDepthToSpaceLayer(layer,
2114 SerializeDepthwiseConvolution2dLayer(layer,
2121 SerializeDequantizeLayer(layer,
2129 SerializeDetectionPostProcessLayer(layer, layerDescriptor, constants, name);
2134 SerializeDivisionLayer(layer, name);
2141 SerializeElementwiseBinaryLayer(layer, layerDescriptor, name);
2148 SerializeElementwiseUnaryLayer(layer, layerDescriptor, name);
2155 SerializeFillLayer(layer, layerDescriptor, name);
2160 SerializeFloorLayer(layer, name);
2167 SerializeFullyConnectedLayer(layer, layerDescriptor, name);
2174 SerializeGatherLayer(layer, layerDescriptor, name);
2179 SerializeGatherNdLayer(layer, name);
2184 SerializeInputLayer(layer,
id, name);
2191 SerializeInstanceNormalizationLayer(layer, layerDescriptor, name);
2198 SerializeL2NormalizationLayer(layer, layerDescriptor, name);
2205 SerializeLogicalBinaryLayer(layer, layerDescriptor, name);
2212 SerializeLogSoftmaxLayer(layer, layerDescriptor, name);
2219 SerializeLstmLayer(layer, layerDescriptor, constants, name);
2226 SerializeQLstmLayer(layer, layerDescriptor, constants, name);
2231 SerializeMaximumLayer(layer, name);
2238 SerializeMeanLayer(layer, layerDescriptor, name);
2243 SerializeMergeLayer(layer, name);
2248 SerializeMinimumLayer(layer, name);
2253 SerializeMultiplicationLayer(layer, name);
2260 SerializeNormalizationLayer(layer, layerDescriptor, name);
2265 SerializeOutputLayer(layer,
id, name);
2272 SerializePadLayer(layer, layerDescriptor, name);
2279 SerializePermuteLayer(layer, layerDescriptor, name);
2286 SerializePooling2dLayer(layer, layerDescriptor, name);
2293 SerializePooling3dLayer(layer, layerDescriptor, name);
2298 SerializePreluLayer(layer, name);
2303 SerializeQuantizeLayer(layer, name);
2307 SerializeQuantizedLstmLayer(layer, constants, name);
2313 SerializeReshapeLayer(layer, layerDescriptor, name);
2318 SerializeRankLayer(layer, name);
2325 SerializeReduceLayer(layer, layerDescriptor, name);
2332 SerializeResizeLayer(layer, layerDescriptor, name);
2337 SerializeShapeLayer(layer, name);
2344 SerializeSliceLayer(layer, layerDescriptor, name);
2351 SerializeSoftmaxLayer(layer, layerDescriptor, name);
2358 SerializeSpaceToBatchNdLayer(layer, layerDescriptor, name);
2365 SerializeSpaceToDepthLayer(layer, layerDescriptor, name);
2372 SerializeSplitterLayer(layer, layerDescriptor, name);
2379 SerializeStackLayer(layer, layerDescriptor, name);
2386 SerializeStandInLayer(layer, layerDescriptor, name);
2393 SerializeStridedSliceLayer(layer, layerDescriptor, name);
2398 SerializeSubtractionLayer(layer, name);
2403 SerializeSwitchLayer(layer, name);
2410 SerializeTransposeLayer(layer, layerDescriptor, name);
2417 SerializeTransposeConvolution2dLayer(layer, layerDescriptor, constants, name);
2424 SerializeUnidirectionalSequenceLstmLayer(layer, layerDescriptor, constants, name);
2430 fmt::format(
"A layer of unknown type was given to the serializer. Layer name: {}; Layer Id: {}",
2437 void ISerializer::SerializerImpl::Serialize(
const INetwork& inNetwork)
2441 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
2444 auto serializedGraph = serializer::CreateSerializedGraph(
2446 fbBuilder.CreateVector(m_SerializerStrategy.GetSerializedLayers()),
2447 fbBuilder.CreateVector(m_SerializerStrategy.GetInputIds()),
2448 fbBuilder.CreateVector(m_SerializerStrategy.GetOutputIds()),
2449 m_SerializerStrategy.GetVersionTable());
2452 fbBuilder.Finish(serializedGraph);
2456 bool ISerializer::SerializerImpl::SaveSerializedToStream(std::ostream& stream)
2458 flatbuffers::FlatBufferBuilder& fbBuilder = m_SerializerStrategy.GetFlatBufferBuilder();
2460 auto bytesToWrite = armnn::numeric_cast<std::streamsize>(fbBuilder.GetSize());
2461 stream.write(
reinterpret_cast<const char*
>(fbBuilder.GetBufferPointer()), bytesToWrite);
2462 return !stream.bad();