diff options
author | Keith Davis <keith.davis@arm.com> | 2022-04-07 11:32:00 +0100 |
---|---|---|
committer | Keith Davis <keith.davis@arm.com> | 2022-05-16 16:08:54 +0100 |
commit | b4dd5cc86d4eb841de670f0f102ede599e0d9c40 (patch) | |
tree | 77857cf739baecaf63701b66c1a2646b7930a834 /src/backends/backendsCommon/test/OptimizeSubgraphViewTests.cpp | |
parent | b86ec6641b4b06ccddad5eebbc21010d6184fe79 (diff) | |
download | armnn-b4dd5cc86d4eb841de670f0f102ede599e0d9c40.tar.gz |
IVGCVSW-6124 ConstTensorsAsInput: Conv2d - FrontEnd
* Update Front-end and Tools.
* Updated Serializer, Deserializer and unit tests to reflect this.
* Updated TfLiteDelegate, TfLiteParser and OnnxParser.
* Updated Ref.
* Fixed resulting Neon / CL tests
* Unified optimizers for conv2d ops
* Optimizer Fix - Fp32ToBf16
* Partial implementation for ACL backends to fix VTS failures
!android-nn-driver:7477
Signed-off-by: Keith Davis <keith.davis@arm.com>
Change-Id: I5fb18877f7ee32643e15a9818945356274bb401b
Diffstat (limited to 'src/backends/backendsCommon/test/OptimizeSubgraphViewTests.cpp')
-rw-r--r-- | src/backends/backendsCommon/test/OptimizeSubgraphViewTests.cpp | 505 |
1 files changed, 395 insertions, 110 deletions
diff --git a/src/backends/backendsCommon/test/OptimizeSubgraphViewTests.cpp b/src/backends/backendsCommon/test/OptimizeSubgraphViewTests.cpp index ad59704e2a..45fcf19f90 100644 --- a/src/backends/backendsCommon/test/OptimizeSubgraphViewTests.cpp +++ b/src/backends/backendsCommon/test/OptimizeSubgraphViewTests.cpp @@ -106,6 +106,21 @@ Convolution2dLayer* AddConvolutionLayer(Graph& graph, return convLayer; } +// Convenience function to add a constant layer to a graph +ConstantLayer* AddConstantLayer(Graph& graph, + LayerNameToLayerMap& layersInGraph, + const std::string& layerName, + const ConstTensor& constTensor, + const TensorInfo& outputInfo) +{ + ConstantLayer* const constantLayer = graph.AddLayer<ConstantLayer>(layerName.c_str()); + CHECK(constantLayer); + constantLayer->m_LayerOutput = std::make_shared<ScopedTensorHandle>(constTensor); + constantLayer->GetOutputSlot(0).SetTensorInfo(outputInfo); + layersInGraph.insert(std::make_pair(constantLayer->GetName(), constantLayer)); + return constantLayer; +} + // Convenience function to add a pooling layer to a graph Pooling2dLayer* AddPoolingLayer(Graph& graph, LayerNameToLayerMap& layersInGraph, @@ -246,7 +261,7 @@ SubgraphView::SubgraphViewPtr BuildFullyUnsupportedSubgraph1(Graph& graph, Layer poolingLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); // Create the subgraph view for the whole network - return CreateSubgraphViewFrom(CreateInputsFrom({poolingLayer}), + return CreateSubgraphViewFrom(CreateInputsFrom(poolingLayer), CreateOutputsFrom({poolingLayer}), {poolingLayer}); } @@ -287,7 +302,7 @@ SubgraphView::SubgraphViewPtr BuildFullyUnsupportedSubgraph2(Graph& graph, Layer pooling3Layer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); // Create the subgraph view for the whole network - return CreateSubgraphViewFrom(CreateInputsFrom({pooling1Layer}), + return CreateSubgraphViewFrom(CreateInputsFrom(pooling1Layer), CreateOutputsFrom({pooling3Layer}), {pooling1Layer, pooling2Layer, @@ -299,8 +314,11 @@ SubgraphView::SubgraphViewPtr BuildFullyOptimizableSubgraph1(Graph& graph, Layer { const TensorInfo inputInfo ({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); const TensorInfo outputInfo({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); - const TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); - const TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); + TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + + weightInfo.SetConstant(true); + biasInfo.SetConstant(true); Convolution2dDescriptor convolutionDescriptor; convolutionDescriptor.m_StrideX = 1; @@ -308,20 +326,34 @@ SubgraphView::SubgraphViewPtr BuildFullyOptimizableSubgraph1(Graph& graph, Layer convolutionDescriptor.m_BiasEnabled = true; convolutionDescriptor.m_DataLayout = DataLayout::NHWC; + std::vector<float> weightsVector(64); + ConstTensor constWeightsTensor(weightInfo, weightsVector); + + std::vector<float> biasVector(16); + ConstTensor constBiasTensor(biasInfo, biasVector); + // Construct the graph Layer* const inputLayer = AddInputLayer(graph, "input layer", inputInfo); Convolution2dLayer* const convLayer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv layer", weightInfo, biasInfo, outputInfo); + + ConstantLayer* const weightsLayer = + AddConstantLayer(graph, layersInGraph, "Weights Layer", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer = AddConstantLayer(graph, layersInGraph, "Bias Layer", constBiasTensor, outputInfo); + Layer* const outputLayer = AddOutputLayer(graph, "output layer"); // Connect the network inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0)); + weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1)); + biasLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2)); convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + std::vector<unsigned int> ignoreSlots = {1, 2}; // Create the subgraph view for the whole network - return CreateSubgraphViewFrom(CreateInputsFrom({convLayer}), + return CreateSubgraphViewFrom(CreateInputsFrom(convLayer, ignoreSlots), CreateOutputsFrom({convLayer}), - {convLayer}); + {convLayer, weightsLayer, biasLayer}); } // Creates a subgraph with five convolutions layers, all supported by the mock backend @@ -329,8 +361,18 @@ SubgraphView::SubgraphViewPtr BuildFullyOptimizableSubgraph2(Graph& graph, Layer { const TensorInfo inputInfo ({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); const TensorInfo outputInfo({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); - const TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); - const TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); + TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + + weightInfo.SetConstant(true); + biasInfo.SetConstant(true); + + std::vector<float> weightsVector(64); + ConstTensor constWeightsTensor(weightInfo, weightsVector); + + std::vector<float> biasVector(16); + ConstTensor constBiasTensor(biasInfo, biasVector); + Convolution2dDescriptor convolutionDescriptor; convolutionDescriptor.m_StrideX = 1; @@ -342,32 +384,84 @@ SubgraphView::SubgraphViewPtr BuildFullyOptimizableSubgraph2(Graph& graph, Layer Layer* const inputLayer = AddInputLayer(graph, "input layer", inputInfo); Convolution2dLayer* const conv1Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv1 layer", weightInfo, biasInfo, outputInfo); + ConstantLayer* const weightsLayer1 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 1", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer1 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 1", constBiasTensor, outputInfo); + Convolution2dLayer* const conv2Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv2 layer", weightInfo, biasInfo, outputInfo); + ConstantLayer* const weightsLayer2 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 2", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer2 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 2", constBiasTensor, outputInfo); + + Convolution2dLayer* const conv3Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv3 layer", weightInfo, biasInfo, outputInfo); + ConstantLayer* const weightsLayer3 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 3", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer3 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 3", constBiasTensor, outputInfo); + Convolution2dLayer* const conv4Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv4 layer", weightInfo, biasInfo, outputInfo); + ConstantLayer* const weightsLayer4 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 4", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer4 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 4", constBiasTensor, outputInfo); + Convolution2dLayer* const conv5Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv5 layer", weightInfo, biasInfo, outputInfo); + ConstantLayer* const weightsLayer5 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 5", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer5 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 5", constBiasTensor, outputInfo); + + Layer* const outputLayer = AddOutputLayer(graph, "output layer"); // Connect the network inputLayer->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(0)); + weightsLayer1->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(1)); + biasLayer1->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(2)); + conv1Layer->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(0)); + weightsLayer2->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(1)); + biasLayer2->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(2)); + conv2Layer->GetOutputSlot(0).Connect(conv3Layer->GetInputSlot(0)); + weightsLayer3->GetOutputSlot(0).Connect(conv3Layer->GetInputSlot(1)); + biasLayer3->GetOutputSlot(0).Connect(conv3Layer->GetInputSlot(2)); + conv3Layer->GetOutputSlot(0).Connect(conv4Layer->GetInputSlot(0)); + weightsLayer4->GetOutputSlot(0).Connect(conv4Layer->GetInputSlot(1)); + biasLayer4->GetOutputSlot(0).Connect(conv4Layer->GetInputSlot(2)); + conv4Layer->GetOutputSlot(0).Connect(conv5Layer->GetInputSlot(0)); - conv5Layer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + weightsLayer5->GetOutputSlot(0).Connect(conv5Layer->GetInputSlot(1)); + biasLayer5->GetOutputSlot(0).Connect(conv5Layer->GetInputSlot(2)); + conv5Layer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + std::vector<unsigned int> ignoreSlots = {1, 2}; // Create the subgraph view for the whole network - return CreateSubgraphViewFrom(CreateInputsFrom({conv1Layer}), - CreateOutputsFrom({conv5Layer}), - {conv1Layer, - conv2Layer, - conv3Layer, - conv4Layer, - conv5Layer}); + return CreateSubgraphViewFrom(CreateInputsFrom(conv1Layer, ignoreSlots), + CreateOutputsFrom({ conv5Layer }), + { weightsLayer1, + biasLayer1, + conv1Layer, + weightsLayer2, + biasLayer2, + conv2Layer, + weightsLayer3, + biasLayer3, + conv3Layer, + weightsLayer4, + biasLayer4, + conv4Layer, + weightsLayer5, + biasLayer5, + conv5Layer }); } // Creates a subgraph with both supported and unsupported layers @@ -376,8 +470,17 @@ SubgraphView::SubgraphViewPtr BuildPartiallySupportedSubgraph(Graph& graph, Laye { const TensorInfo inputInfo ({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); const TensorInfo outputInfo({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); - const TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); - const TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); + TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + + weightInfo.SetConstant(true); + biasInfo.SetConstant(true); + + std::vector<float> weightsVector(64); + ConstTensor constWeightsTensor(weightInfo, weightsVector); + + std::vector<float> biasVector(16); + ConstTensor constBiasTensor(biasInfo, biasVector); Convolution2dDescriptor convolutionDescriptor; convolutionDescriptor.m_StrideX = 1; @@ -400,12 +503,25 @@ SubgraphView::SubgraphViewPtr BuildPartiallySupportedSubgraph(Graph& graph, Laye // Construct the graph Layer* const inputLayer = AddInputLayer(graph, "input layer", inputInfo); + ConstantLayer* const weightsLayer1 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 1", constWeightsTensor, outputInfo); + + ConstantLayer* const biasLayer1 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 1", constBiasTensor, outputInfo); + Convolution2dLayer* const conv1Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv1 layer", weightInfo, biasInfo, outputInfo); Pooling2dLayer* const pooling1Layer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor, "pooling1 layer", outputInfo); Pooling2dLayer* const pooling2Layer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor, "pooling2 layer", outputInfo); + + ConstantLayer* const weightsLayer2 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 2", constWeightsTensor, outputInfo); + + ConstantLayer* const biasLayer2 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 2", constBiasTensor, outputInfo); + Convolution2dLayer* const conv2Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv2 layer", weightInfo, biasInfo, outputInfo); Pooling2dLayer* const pooling3Layer = AddPoolingLayer(graph, layersInGraph, poolingDescriptor, @@ -414,18 +530,27 @@ SubgraphView::SubgraphViewPtr BuildPartiallySupportedSubgraph(Graph& graph, Laye // Connect the network inputLayer->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(0)); + weightsLayer1->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(1)); + biasLayer1->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(2)); conv1Layer->GetOutputSlot(0).Connect(pooling1Layer->GetInputSlot(0)); pooling1Layer->GetOutputSlot(0).Connect(pooling2Layer->GetInputSlot(0)); pooling2Layer->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(0)); + weightsLayer2->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(1)); + biasLayer2->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(2)); conv2Layer->GetOutputSlot(0).Connect(pooling3Layer->GetInputSlot(0)); pooling3Layer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + std::vector<unsigned int> ignoreSlots = {1, 2}; // Create the subgraph view for the whole network - return CreateSubgraphViewFrom(CreateInputsFrom({conv1Layer}), + return CreateSubgraphViewFrom(CreateInputsFrom(conv1Layer, ignoreSlots), CreateOutputsFrom({pooling3Layer}), - {conv1Layer, + {weightsLayer1, + biasLayer1, + conv1Layer, pooling1Layer, pooling2Layer, + weightsLayer2, + biasLayer2, conv2Layer, pooling3Layer}); } @@ -435,9 +560,17 @@ SubgraphView::SubgraphViewPtr BuildFullyUnoptimizableSubgraph1(Graph& graph, Lay { const TensorInfo inputInfo ({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); const TensorInfo outputInfo({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); - const TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); - const TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); + TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + weightInfo.SetConstant(true); + biasInfo.SetConstant(true); + + std::vector<float> weightsVector(64); + ConstTensor constWeightsTensor(weightInfo, weightsVector); + + std::vector<float> biasVector(16); + ConstTensor constBiasTensor(biasInfo, biasVector); Convolution2dDescriptor convolutionDescriptor; convolutionDescriptor.m_StrideX = 1; convolutionDescriptor.m_StrideY = 1; @@ -446,6 +579,13 @@ SubgraphView::SubgraphViewPtr BuildFullyUnoptimizableSubgraph1(Graph& graph, Lay // Construct the graph Layer* const inputLayer = AddInputLayer(graph, "input layer", inputInfo); + + ConstantLayer* const weightsLayer = + AddConstantLayer(graph, layersInGraph, "Weights Layer unoptimizable", constWeightsTensor, outputInfo); + + ConstantLayer* const biasLayer = + AddConstantLayer(graph, layersInGraph, "Bias Layer unoptimizable", constBiasTensor, outputInfo); + Convolution2dLayer* const convLayer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv layer unoptimizable", weightInfo, biasInfo, outputInfo); @@ -453,12 +593,15 @@ SubgraphView::SubgraphViewPtr BuildFullyUnoptimizableSubgraph1(Graph& graph, Lay // Connect the network inputLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(0)); + weightsLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(1)); + biasLayer->GetOutputSlot(0).Connect(convLayer->GetInputSlot(2)); convLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + std::vector<unsigned int> ignoreSlots = {1, 2}; // Create the subgraph view for the whole network - return CreateSubgraphViewFrom(CreateInputsFrom({convLayer}), + return CreateSubgraphViewFrom(CreateInputsFrom(convLayer, ignoreSlots), CreateOutputsFrom({convLayer}), - {convLayer}); + {convLayer, weightsLayer, biasLayer}); } // Creates a subgraph with some unoptimizable layers ("unoptimizable" is added to the layer's name) @@ -466,8 +609,17 @@ SubgraphView::SubgraphViewPtr BuildPartiallyOptimizableSubgraph1(Graph& graph, L { const TensorInfo inputInfo ({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); const TensorInfo outputInfo({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); - const TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); - const TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); + TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + + weightInfo.SetConstant(true); + biasInfo.SetConstant(true); + + std::vector<float> weightsVector(64); + ConstTensor constWeightsTensor(weightInfo, weightsVector); + + std::vector<float> biasVector(16); + ConstTensor constBiasTensor(biasInfo, biasVector); Convolution2dDescriptor convolutionDescriptor; convolutionDescriptor.m_StrideX = 1; @@ -477,36 +629,93 @@ SubgraphView::SubgraphViewPtr BuildPartiallyOptimizableSubgraph1(Graph& graph, L // Construct the graph Layer* const inputLayer = AddInputLayer(graph, "input layer", inputInfo); - Convolution2dLayer* const conv1Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, - "conv1 layer", weightInfo, biasInfo, outputInfo); - Convolution2dLayer* const conv2Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, - "conv2 layer unoptimizable", weightInfo, biasInfo, - outputInfo); - Convolution2dLayer* const conv3Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, - "conv3 layer", weightInfo, biasInfo, outputInfo); - Convolution2dLayer* const conv4Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, - "conv4 layer unoptimizable", weightInfo, biasInfo, - outputInfo); - Convolution2dLayer* const conv5Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, - "conv5 layer", weightInfo, biasInfo, outputInfo); - Layer* const outputLayer = AddOutputLayer(graph, "output layer"); + + ConstantLayer* const weightsLayer1 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 1", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer1 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 1", constBiasTensor, outputInfo); + ConstantLayer* const weightsLayer2 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 2 unoptimizable", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer2 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 2 unoptimizable", constBiasTensor, outputInfo); + ConstantLayer* const weightsLayer3 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 3", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer3 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 3", constBiasTensor, outputInfo); + ConstantLayer* const weightsLayer4 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 4 unoptimizable", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer4 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 4 unoptimizable", constBiasTensor, outputInfo); + ConstantLayer* const weightsLayer5 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 5", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer5 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 5", constBiasTensor, outputInfo); + + Convolution2dLayer* const conv1Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, + "conv1 layer", weightInfo, biasInfo, outputInfo); + Convolution2dLayer* const conv2Layer = AddConvolutionLayer(graph, + layersInGraph, + convolutionDescriptor, + "conv2 layer unoptimizable", + weightInfo, + biasInfo, + outputInfo); + Convolution2dLayer* const conv3Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, + "conv3 layer", weightInfo, biasInfo, outputInfo); + Convolution2dLayer* const conv4Layer = AddConvolutionLayer(graph, + layersInGraph, + convolutionDescriptor, + "conv4 layer unoptimizable", + weightInfo, + biasInfo, + outputInfo); + Convolution2dLayer* const conv5Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, + "conv5 layer", weightInfo, biasInfo, outputInfo); + + Layer* const outputLayer = AddOutputLayer(graph, "output layer"); // Connect the network inputLayer->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(0)); + weightsLayer1->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(1)); + biasLayer1->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(2)); + conv1Layer->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(0)); + weightsLayer2->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(1)); + biasLayer2->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(2)); + conv2Layer->GetOutputSlot(0).Connect(conv3Layer->GetInputSlot(0)); + weightsLayer3->GetOutputSlot(0).Connect(conv3Layer->GetInputSlot(1)); + biasLayer3->GetOutputSlot(0).Connect(conv3Layer->GetInputSlot(2)); + conv3Layer->GetOutputSlot(0).Connect(conv4Layer->GetInputSlot(0)); + weightsLayer4->GetOutputSlot(0).Connect(conv4Layer->GetInputSlot(1)); + biasLayer4->GetOutputSlot(0).Connect(conv4Layer->GetInputSlot(2)); + conv4Layer->GetOutputSlot(0).Connect(conv5Layer->GetInputSlot(0)); + weightsLayer5->GetOutputSlot(0).Connect(conv5Layer->GetInputSlot(1)); + biasLayer5->GetOutputSlot(0).Connect(conv5Layer->GetInputSlot(2)); + conv5Layer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); + std::vector<unsigned int> ignoreSlots = {1, 2}; // Create the subgraph view for the whole network - return CreateSubgraphViewFrom(CreateInputsFrom({conv1Layer}), + return CreateSubgraphViewFrom(CreateInputsFrom(conv1Layer, ignoreSlots), CreateOutputsFrom({conv5Layer}), - {conv1Layer, - conv2Layer, - conv3Layer, - conv4Layer, - conv5Layer}); + {weightsLayer1, + biasLayer1, + conv1Layer, + weightsLayer2, + biasLayer2, + conv2Layer, + weightsLayer3, + biasLayer3, + conv3Layer, + weightsLayer4, + biasLayer4, + conv4Layer, + weightsLayer5, + biasLayer5, + conv5Layer}); } // Creates a subgraph with some input unoptimizable layers ("unoptimizable" is added to the layer's name), @@ -515,8 +724,17 @@ SubgraphView::SubgraphViewPtr BuildPartiallyOptimizableSubgraph2(Graph& graph, L { const TensorInfo inputInfo ({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); const TensorInfo outputInfo({ 1, 16, 16, 16 }, DataType::QAsymmU8, 1.0f, 0); - const TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); - const TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + TensorInfo weightInfo({ 16, 1, 1, 16 }, DataType::QAsymmU8, 0.9f, 0); + TensorInfo biasInfo ({ 1, 1, 1, 16 }, DataType::Signed32, 0.9f, 0); + + weightInfo.SetConstant(true); + biasInfo.SetConstant(true); + + std::vector<float> weightsVector(64); + ConstTensor constWeightsTensor(weightInfo, weightsVector); + + std::vector<float> biasVector(16); + ConstTensor constBiasTensor(biasInfo, biasVector); Convolution2dDescriptor convolutionDescriptor; convolutionDescriptor.m_StrideX = 1; @@ -527,6 +745,20 @@ SubgraphView::SubgraphViewPtr BuildPartiallyOptimizableSubgraph2(Graph& graph, L // Construct the graph Layer* const input1Layer = AddInputLayer(graph, "input1 layer", inputInfo, 0); Layer* const input2Layer = AddInputLayer(graph, "input2 layer", inputInfo, 1); + + ConstantLayer* const weightsLayer1 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 1", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer1 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 1", constBiasTensor, outputInfo); + ConstantLayer* const weightsLayer2 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 2 unoptimizable", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer2 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 2 unoptimizable", constBiasTensor, outputInfo); + ConstantLayer* const weightsLayer3 = + AddConstantLayer(graph, layersInGraph, "Weights Layer 3", constWeightsTensor, outputInfo); + ConstantLayer* const biasLayer3 = + AddConstantLayer(graph, layersInGraph, "Bias Layer 3", constBiasTensor, outputInfo); + Convolution2dLayer* const conv1Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, "conv1 layer", weightInfo, biasInfo, outputInfo); Convolution2dLayer* const conv2Layer = AddConvolutionLayer(graph, layersInGraph, convolutionDescriptor, @@ -539,20 +771,35 @@ SubgraphView::SubgraphViewPtr BuildPartiallyOptimizableSubgraph2(Graph& graph, L // Connect the network input1Layer->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(0)); - input2Layer->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(0)); + weightsLayer1->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(1)); + biasLayer1->GetOutputSlot(0).Connect(conv1Layer->GetInputSlot(2)); conv1Layer->GetOutputSlot(0).Connect(addLayer->GetInputSlot(0)); + + input2Layer->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(0)); + weightsLayer2->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(1)); + biasLayer2->GetOutputSlot(0).Connect(conv2Layer->GetInputSlot(2)); conv2Layer->GetOutputSlot(0).Connect(conv3Layer->GetInputSlot(0)); + weightsLayer3->GetOutputSlot(0).Connect(conv3Layer->GetInputSlot(1)); + biasLayer3->GetOutputSlot(0).Connect(conv3Layer->GetInputSlot(2)); conv3Layer->GetOutputSlot(0).Connect(addLayer->GetInputSlot(1)); + addLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0)); // Create the subgraph view for the whole network + std::vector<unsigned int> ignoreSlots = {1, 2}; return CreateSubgraphViewFrom(CreateInputsFrom({conv1Layer, - conv2Layer}), + conv2Layer}, ignoreSlots), CreateOutputsFrom({addLayer}), - {conv1Layer, - conv2Layer, - conv3Layer, - addLayer}); + { weightsLayer1, + biasLayer1, + weightsLayer2, + biasLayer2, + weightsLayer3, + biasLayer3, + conv1Layer, + conv2Layer, + conv3Layer, + addLayer }); } // The input subgraph contains only a single unsupported layer (only convolutions are unsupported by the mock backend) @@ -713,9 +960,11 @@ void FullyOptimizableSubgraphTestImpl1() CHECK(subgraphInputSlots.size() == 1); CHECK(subgraphOutputSlots.size() == 1); - CHECK(subgraphLayers.size() == 1); + CHECK(subgraphLayers.size() == 3); CHECK(Contains(layersInGraph, "conv layer")); + CHECK(Contains(layersInGraph, "Weights Layer")); + CHECK(Contains(layersInGraph, "Bias Layer")); // Create a mock backend object MockBackendInitialiser initialiser; // Register the Mock Backend @@ -776,15 +1025,25 @@ void FullyOptimizableSubgraphTestImpl2() const SubgraphView::IOutputSlots& subgraphOutputSlots = subgraphPtr->GetIOutputSlots(); const SubgraphView::IConnectableLayers& subgraphLayers = subgraphPtr->GetIConnectableLayers(); - CHECK(subgraphPtr->GetIInputSlots().size() == 1); - CHECK(subgraphPtr->GetIOutputSlots().size() == 1); - CHECK(subgraphPtr->GetIConnectableLayers().size() == 5); + CHECK(subgraphInputSlots.size() == 1); + CHECK(subgraphOutputSlots.size() == 1); + CHECK(subgraphPtr->GetIConnectableLayers().size() == 15); CHECK(Contains(layersInGraph, "conv1 layer")); CHECK(Contains(layersInGraph, "conv2 layer")); CHECK(Contains(layersInGraph, "conv3 layer")); CHECK(Contains(layersInGraph, "conv4 layer")); CHECK(Contains(layersInGraph, "conv5 layer")); + CHECK(Contains(layersInGraph, "Weights Layer 1")); + CHECK(Contains(layersInGraph, "Weights Layer 2")); + CHECK(Contains(layersInGraph, "Weights Layer 3")); + CHECK(Contains(layersInGraph, "Weights Layer 4")); + CHECK(Contains(layersInGraph, "Weights Layer 5")); + CHECK(Contains(layersInGraph, "Bias Layer 1")); + CHECK(Contains(layersInGraph, "Bias Layer 2")); + CHECK(Contains(layersInGraph, "Bias Layer 3")); + CHECK(Contains(layersInGraph, "Bias Layer 4")); + CHECK(Contains(layersInGraph, "Bias Layer 5")); // Create a mock backend object MockBackendInitialiser initialiser; // Register the Mock Backend @@ -811,20 +1070,31 @@ void FullyOptimizableSubgraphTestImpl2() const OptimizationViews::Substitutions& substitutions = optimizationViews.GetSubstitutions(); CHECK(substitutions.size() == 1); - std::list<IConnectableLayer*> expectedSubstitutableLayers{ layersInGraph.at("conv1 layer"), + std::list<IConnectableLayer*> expectedSubstitutableLayers{ + layersInGraph.at("Weights Layer 1"), + layersInGraph.at("Weights Layer 2"), + layersInGraph.at("Weights Layer 3"), + layersInGraph.at("Weights Layer 4"), + layersInGraph.at("Weights Layer 5"), + layersInGraph.at("Bias Layer 1"), + layersInGraph.at("Bias Layer 2"), + layersInGraph.at("Bias Layer 3"), + layersInGraph.at("Bias Layer 4"), + layersInGraph.at("Bias Layer 5"), + layersInGraph.at("conv1 layer"), layersInGraph.at("conv2 layer"), layersInGraph.at("conv3 layer"), layersInGraph.at("conv4 layer"), - layersInGraph.at("conv5 layer") }; + layersInGraph.at("conv5 layer")}; const OptimizationViews::SubstitutionPair& substitution = substitutions.at(0); - CheckSubstitution(substitution, - { subgraphInputSlots.size(), subgraphOutputSlots.size(), subgraphLayers.size() }, - { subgraphInputSlots.size(), subgraphOutputSlots.size(), 1 }, - subgraphInputSlots, - subgraphOutputSlots, - expectedSubstitutableLayers); + CheckSubstitution( + substitution, + {subgraphInputSlots.size(), subgraphOutputSlots.size(), + subgraphLayers.size()}, + {subgraphInputSlots.size(), subgraphOutputSlots.size(), 1}, + subgraphInputSlots, subgraphOutputSlots, expectedSubstitutableLayers); const SubgraphView::IConnectableLayers& substitutableSubgraphLayers = substitution.m_SubstitutableSubgraph.GetIConnectableLayers(); @@ -865,11 +1135,15 @@ void PartiallySupportedSubgraphTestImpl() CHECK(subgraphInputSlots.size() == 1); CHECK(subgraphOutputSlots.size() == 1); - CHECK(subgraphLayers.size() == 5); + CHECK(subgraphLayers.size() == 9); + CHECK(Contains(layersInGraph, "Weights Layer 1")); + CHECK(Contains(layersInGraph, "Bias Layer 1")); CHECK(Contains(layersInGraph, "conv1 layer")); CHECK(Contains(layersInGraph, "pooling1 layer")); CHECK(Contains(layersInGraph, "pooling2 layer")); + CHECK(Contains(layersInGraph, "Weights Layer 2")); + CHECK(Contains(layersInGraph, "Bias Layer 2")); CHECK(Contains(layersInGraph, "conv2 layer")); CHECK(Contains(layersInGraph, "pooling3 layer")); @@ -903,16 +1177,16 @@ void PartiallySupportedSubgraphTestImpl() s2.m_SubstitutableSubgraph.GetIConnectableLayers().front()->GetName()) < 0; }); - std::vector<ExpectedSubgraphSize> expectedSubstitutableSubgraphSizes{ { 1, 1, 1 }, - { 1, 1, 1 } }; + std::vector<ExpectedSubgraphSize> expectedSubstitutableSubgraphSizes{ { 1, 1, 3 }, + { 1, 1, 3 } }; std::vector<ExpectedSubgraphSize> expectedReplacementSubgraphSizes{ { 1, 1, 1 }, { 1, 1, 1 } }; std::vector<SubgraphView::IInputSlots> expectedSubstitutableInputSlots { ConvertSlotsToISlots<InputSlot, IInputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv1 layer")->GetInputSlots())), + {ConvertReferenceTypeToPointerType(layersInGraph.at("conv1 layer")->GetInputSlot(0))}), ConvertSlotsToISlots<InputSlot, IInputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv2 layer")->GetInputSlots())) + {ConvertReferenceTypeToPointerType(layersInGraph.at("conv2 layer")->GetInputSlot(0))}) }; std::vector<SubgraphView::IOutputSlots> expectedSubstitutableOutputSlots @@ -924,8 +1198,8 @@ void PartiallySupportedSubgraphTestImpl() }; std::vector<SubgraphView::IConnectableLayers> expectedSubstitutableLayers { - { layersInGraph.at("conv1 layer") }, - { layersInGraph.at("conv2 layer") } + { layersInGraph.at("Weights Layer 1"), layersInGraph.at("Bias Layer 1"), layersInGraph.at("conv1 layer") }, + { layersInGraph.at("Weights Layer 2"), layersInGraph.at("Bias Layer 2"), layersInGraph.at("conv2 layer") } }; for (size_t substitutionIndex = 0; substitutionIndex < substitutions.size(); substitutionIndex++) @@ -1005,7 +1279,7 @@ void FullyUnoptimizableSubgraphTestImpl1() CHECK(subgraphInputSlots.size() == 1); CHECK(subgraphOutputSlots.size() == 1); - CHECK(subgraphLayers.size() == 1); + CHECK(subgraphLayers.size() == 3); CHECK(Contains(layersInGraph, "conv layer unoptimizable")); @@ -1047,9 +1321,9 @@ void FullyUnoptimizableSubgraphTestImpl1() CHECK(untouchedSubgraphs.size() == 1); CheckUntouchedSubgraph(untouchedSubgraphs.at(0), - { subgraphInputSlots.size(), subgraphOutputSlots.size(), subgraphLayers.size() }, - subgraphInputSlots, - subgraphOutputSlots, + {subgraphInputSlots.size(), + subgraphOutputSlots.size(), subgraphLayers.size()}, + subgraphInputSlots, subgraphOutputSlots, subgraphLayers); } @@ -1069,7 +1343,7 @@ void PartiallyOptimizableSubgraphTestImpl1() CHECK(subgraphInputSlots.size() == 1); CHECK(subgraphOutputSlots.size() == 1); - CHECK(subgraphLayers.size() == 5); + CHECK(subgraphLayers.size() == 15); CHECK(Contains(layersInGraph, "conv1 layer")); CHECK(Contains(layersInGraph, "conv2 layer unoptimizable")); @@ -1107,20 +1381,20 @@ void PartiallyOptimizableSubgraphTestImpl1() { return strcmp(s1.m_SubstitutableSubgraph.GetIConnectableLayers().front()->GetName(), s2.m_SubstitutableSubgraph.GetIConnectableLayers().front()->GetName()) < 0; }); - std::vector<ExpectedSubgraphSize> expectedSubstitutableSubgraphSizes{ { 1, 1, 1 }, - { 1, 1, 1 }, - { 1, 1, 1 } }; + std::vector<ExpectedSubgraphSize> expectedSubstitutableSubgraphSizes{ { 1, 1, 3 }, + { 1, 1, 3 }, + { 1, 1, 3 } }; std::vector<ExpectedSubgraphSize> expectedReplacementSubgraphSizes{ { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 } }; std::vector<SubgraphView::IInputSlots> expectedSubstitutableInputSlots { ConvertSlotsToISlots<InputSlot, IInputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv1 layer")->GetInputSlots())), + {ConvertReferenceTypeToPointerType(layersInGraph.at("conv1 layer")->GetInputSlot(0))}), ConvertSlotsToISlots<InputSlot, IInputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv3 layer")->GetInputSlots())), + {ConvertReferenceTypeToPointerType(layersInGraph.at("conv3 layer")->GetInputSlot(0))}), ConvertSlotsToISlots<InputSlot, IInputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv5 layer")->GetInputSlots())) + {ConvertReferenceTypeToPointerType(layersInGraph.at("conv5 layer")->GetInputSlot(0))}) }; std::vector<SubgraphView::IOutputSlots> expectedSubstitutableOutputSlots { @@ -1133,9 +1407,9 @@ void PartiallyOptimizableSubgraphTestImpl1() }; std::vector<SubgraphView::IConnectableLayers> expectedSubstitutableLayers { - { layersInGraph.at("conv1 layer") }, - { layersInGraph.at("conv3 layer") }, - { layersInGraph.at("conv5 layer") } + { layersInGraph.at("Weights Layer 1"), layersInGraph.at("Bias Layer 1"), layersInGraph.at("conv1 layer") }, + { layersInGraph.at("Weights Layer 3"), layersInGraph.at("Bias Layer 3"), layersInGraph.at("conv3 layer") }, + { layersInGraph.at("Weights Layer 5"), layersInGraph.at("Bias Layer 5"), layersInGraph.at("conv5 layer") } }; for (size_t substitutionIndex = 0; substitutionIndex < substitutions.size(); substitutionIndex++) @@ -1166,27 +1440,33 @@ void PartiallyOptimizableSubgraphTestImpl1() s2.GetIConnectableLayers().front()->GetName()) < 0; }); - std::vector<ExpectedSubgraphSize> expectedUntouchedSubgraphSizes{ { 1, 1, 1 }, - { 1, 1, 1 } }; - std::vector<SubgraphView::IInputSlots> expectedUntouchedInputSlots - { - ConvertSlotsToISlots<InputSlot, IInputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv2 layer unoptimizable")->GetInputSlots())), - ConvertSlotsToISlots<InputSlot, IInputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv4 layer unoptimizable")->GetInputSlots())) - }; + std::vector<ExpectedSubgraphSize> expectedUntouchedSubgraphSizes{ { 1, 1, 3 }, + { 1, 1, 3 } }; + std::vector<SubgraphView::IInputSlots> expectedUntouchedInputSlots{ + ConvertSlotsToISlots<InputSlot, + IInputSlot>({ConvertReferenceTypeToPointerType( + layersInGraph.at("conv2 layer unoptimizable")->GetInputSlot(0))}), + ConvertSlotsToISlots<InputSlot, + IInputSlot>({ConvertReferenceTypeToPointerType( + layersInGraph.at("conv4 layer unoptimizable")->GetInputSlot(0))})}; + std::vector<SubgraphView::IOutputSlots> expectedUntouchedOutputSlots - { + { ConvertSlotsToISlots<OutputSlot, IOutputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv2 layer unoptimizable")->GetOutputSlots())), + ConvertReferenceTypeToPointerType(layersInGraph.at("conv2 layer unoptimizable")->GetOutputSlots())), ConvertSlotsToISlots<OutputSlot, IOutputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv4 layer unoptimizable")->GetOutputSlots())) - }; + ConvertReferenceTypeToPointerType(layersInGraph.at("conv4 layer unoptimizable")->GetOutputSlots())) + }; + std::vector<SubgraphView::IConnectableLayers> expectedUntouchedLayers - { - { layersInGraph.at("conv2 layer unoptimizable") }, - { layersInGraph.at("conv4 layer unoptimizable") } - }; + { + { layersInGraph.at("Weights Layer 2 unoptimizable"), + layersInGraph.at("Bias Layer 2 unoptimizable"), + layersInGraph.at("conv2 layer unoptimizable") }, + { layersInGraph.at("Weights Layer 4 unoptimizable"), + layersInGraph.at("Bias Layer 4 unoptimizable"), + layersInGraph.at("conv4 layer unoptimizable") } + }; for (size_t untouchedIndex = 0; untouchedIndex < untouchedSubgraphs.size(); untouchedIndex++) { @@ -1215,7 +1495,7 @@ void PartiallyOptimizableSubgraphTestImpl2() CHECK(subgraphInputSlots.size() == 2); CHECK(subgraphOutputSlots.size() == 1); - CHECK(subgraphLayers.size() == 4); + CHECK(subgraphLayers.size() == 10); CHECK(Contains(layersInGraph, "conv1 layer")); CHECK(Contains(layersInGraph, "conv2 layer unoptimizable")); @@ -1247,7 +1527,7 @@ void PartiallyOptimizableSubgraphTestImpl2() const OptimizationViews::Substitutions& substitutions = optimizationViews.GetSubstitutions(); CHECK(substitutions.size() == 1); - ExpectedSubgraphSize expectedSubstitutableSubgraphSizes{ 2, 1, 3 }; + ExpectedSubgraphSize expectedSubstitutableSubgraphSizes{ 2, 1, 7 }; ExpectedSubgraphSize expectedReplacementSubgraphSizes{ 2, 1, 1 }; SubgraphView::IInputSlots expectedSubstitutableInputSlots @@ -1266,6 +1546,10 @@ void PartiallyOptimizableSubgraphTestImpl2() SubgraphView::IConnectableLayers expectedSubstitutableLayers { + layersInGraph.at("Weights Layer 1"), + layersInGraph.at("Weights Layer 3"), + layersInGraph.at("Bias Layer 1"), + layersInGraph.at("Bias Layer 3"), layersInGraph.at("conv1 layer"), layersInGraph.at("conv3 layer"), layersInGraph.at("add layer") @@ -1291,12 +1575,12 @@ void PartiallyOptimizableSubgraphTestImpl2() const OptimizationViews::Subgraphs& untouchedSubgraphs = optimizationViews.GetUntouchedSubgraphs(); CHECK(untouchedSubgraphs.size() == 1); - std::vector<ExpectedSubgraphSize> expectedUntouchedSubgraphSizes{ { 1, 1, 1 } }; + std::vector<ExpectedSubgraphSize> expectedUntouchedSubgraphSizes{ { 1, 1, 3 } }; std::vector<SubgraphView::IInputSlots> expectedUntouchedInputSlots { - ConvertSlotsToISlots<InputSlot, IInputSlot>( - ConvertReferenceTypeToPointerType(layersInGraph.at("conv2 layer unoptimizable")->GetInputSlots())) - }; + ConvertSlotsToISlots<InputSlot, + IInputSlot>({ConvertReferenceTypeToPointerType( + layersInGraph.at("conv2 layer unoptimizable")->GetInputSlot(0))})}; std::vector<SubgraphView::IOutputSlots> expectedUntouchedOutputSlots { ConvertSlotsToISlots<OutputSlot, IOutputSlot>( @@ -1304,7 +1588,8 @@ void PartiallyOptimizableSubgraphTestImpl2() }; std::vector<SubgraphView::IConnectableLayers> expectedUntouchedLayers { - { layersInGraph.at("conv2 layer unoptimizable") } + { layersInGraph.at("conv2 layer unoptimizable"), layersInGraph.at("Weights Layer 2 unoptimizable"), + layersInGraph.at("Bias Layer 2 unoptimizable") } }; for (size_t untouchedIndex = 0; untouchedIndex < untouchedSubgraphs.size(); untouchedIndex++) |