1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #include "ParserFlatbuffersFixture.hpp" 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("TensorflowLiteParser_DepthwiseConvolution2D") 10*89c4ff92SAndroid Build Coastguard Worker { 11*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dFixture : public ParserFlatbuffersFixture 12*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dFixtureDepthwiseConvolution2dFixture13*89c4ff92SAndroid Build Coastguard Worker explicit DepthwiseConvolution2dFixture(const std::string& inputShape, 14*89c4ff92SAndroid Build Coastguard Worker const std::string& outputShape, 15*89c4ff92SAndroid Build Coastguard Worker const std::string& filterShape, 16*89c4ff92SAndroid Build Coastguard Worker const std::string& filterData, 17*89c4ff92SAndroid Build Coastguard Worker const std::string& strides, 18*89c4ff92SAndroid Build Coastguard Worker const std::string& paddingType, 19*89c4ff92SAndroid Build Coastguard Worker const std::string biasShape = "", 20*89c4ff92SAndroid Build Coastguard Worker const std::string biasData = "") 21*89c4ff92SAndroid Build Coastguard Worker { 22*89c4ff92SAndroid Build Coastguard Worker std::string inputTensors = "[ 0, 2 ]"; 23*89c4ff92SAndroid Build Coastguard Worker std::string biasTensor = ""; 24*89c4ff92SAndroid Build Coastguard Worker std::string biasBuffer = ""; 25*89c4ff92SAndroid Build Coastguard Worker if (biasShape.size() > 0 && biasData.size() > 0) 26*89c4ff92SAndroid Build Coastguard Worker { 27*89c4ff92SAndroid Build Coastguard Worker inputTensors = "[ 0, 2, 3 ]"; 28*89c4ff92SAndroid Build Coastguard Worker biasTensor = R"( 29*89c4ff92SAndroid Build Coastguard Worker { 30*89c4ff92SAndroid Build Coastguard Worker "shape": )" + biasShape + R"( , 31*89c4ff92SAndroid Build Coastguard Worker "type": "INT32", 32*89c4ff92SAndroid Build Coastguard Worker "buffer": 3, 33*89c4ff92SAndroid Build Coastguard Worker "name": "biasTensor", 34*89c4ff92SAndroid Build Coastguard Worker "quantization": { 35*89c4ff92SAndroid Build Coastguard Worker "min": [ 0.0 ], 36*89c4ff92SAndroid Build Coastguard Worker "max": [ 255.0 ], 37*89c4ff92SAndroid Build Coastguard Worker "scale": [ 1.0 ], 38*89c4ff92SAndroid Build Coastguard Worker "zero_point": [ 0 ], 39*89c4ff92SAndroid Build Coastguard Worker } 40*89c4ff92SAndroid Build Coastguard Worker } )"; 41*89c4ff92SAndroid Build Coastguard Worker biasBuffer = R"( 42*89c4ff92SAndroid Build Coastguard Worker { "data": )" + biasData + R"(, }, )"; 43*89c4ff92SAndroid Build Coastguard Worker } 44*89c4ff92SAndroid Build Coastguard Worker m_JsonString = R"( 45*89c4ff92SAndroid Build Coastguard Worker { 46*89c4ff92SAndroid Build Coastguard Worker "version": 3, 47*89c4ff92SAndroid Build Coastguard Worker "operator_codes": [ { "builtin_code": "DEPTHWISE_CONV_2D" } ], 48*89c4ff92SAndroid Build Coastguard Worker "subgraphs": [ { 49*89c4ff92SAndroid Build Coastguard Worker "tensors": [ 50*89c4ff92SAndroid Build Coastguard Worker { 51*89c4ff92SAndroid Build Coastguard Worker "shape": )" + inputShape + R"(, 52*89c4ff92SAndroid Build Coastguard Worker "type": "UINT8", 53*89c4ff92SAndroid Build Coastguard Worker "buffer": 0, 54*89c4ff92SAndroid Build Coastguard Worker "name": "inputTensor", 55*89c4ff92SAndroid Build Coastguard Worker "quantization": { 56*89c4ff92SAndroid Build Coastguard Worker "min": [ 0.0 ], 57*89c4ff92SAndroid Build Coastguard Worker "max": [ 255.0 ], 58*89c4ff92SAndroid Build Coastguard Worker "scale": [ 1.0 ], 59*89c4ff92SAndroid Build Coastguard Worker "zero_point": [ 0 ], 60*89c4ff92SAndroid Build Coastguard Worker } 61*89c4ff92SAndroid Build Coastguard Worker }, 62*89c4ff92SAndroid Build Coastguard Worker { 63*89c4ff92SAndroid Build Coastguard Worker "shape": )" + outputShape + R"(, 64*89c4ff92SAndroid Build Coastguard Worker "type": "UINT8", 65*89c4ff92SAndroid Build Coastguard Worker "buffer": 1, 66*89c4ff92SAndroid Build Coastguard Worker "name": "outputTensor", 67*89c4ff92SAndroid Build Coastguard Worker "quantization": { 68*89c4ff92SAndroid Build Coastguard Worker "min": [ 0.0 ], 69*89c4ff92SAndroid Build Coastguard Worker "max": [ 511.0 ], 70*89c4ff92SAndroid Build Coastguard Worker "scale": [ 2.0 ], 71*89c4ff92SAndroid Build Coastguard Worker "zero_point": [ 0 ], 72*89c4ff92SAndroid Build Coastguard Worker } 73*89c4ff92SAndroid Build Coastguard Worker }, 74*89c4ff92SAndroid Build Coastguard Worker { 75*89c4ff92SAndroid Build Coastguard Worker "shape": )" + filterShape + R"(, 76*89c4ff92SAndroid Build Coastguard Worker "type": "UINT8", 77*89c4ff92SAndroid Build Coastguard Worker "buffer": 2, 78*89c4ff92SAndroid Build Coastguard Worker "name": "filterTensor", 79*89c4ff92SAndroid Build Coastguard Worker "quantization": { 80*89c4ff92SAndroid Build Coastguard Worker "min": [ 0.0 ], 81*89c4ff92SAndroid Build Coastguard Worker "max": [ 255.0 ], 82*89c4ff92SAndroid Build Coastguard Worker "scale": [ 1.0 ], 83*89c4ff92SAndroid Build Coastguard Worker "zero_point": [ 0 ], 84*89c4ff92SAndroid Build Coastguard Worker } 85*89c4ff92SAndroid Build Coastguard Worker }, )" + biasTensor + R"( 86*89c4ff92SAndroid Build Coastguard Worker ], 87*89c4ff92SAndroid Build Coastguard Worker "inputs": [ 0 ], 88*89c4ff92SAndroid Build Coastguard Worker "outputs": [ 1 ], 89*89c4ff92SAndroid Build Coastguard Worker "operators": [ 90*89c4ff92SAndroid Build Coastguard Worker { 91*89c4ff92SAndroid Build Coastguard Worker "opcode_index": 0, 92*89c4ff92SAndroid Build Coastguard Worker "inputs": )" + inputTensors + R"(, 93*89c4ff92SAndroid Build Coastguard Worker "outputs": [ 1 ], 94*89c4ff92SAndroid Build Coastguard Worker "builtin_options_type": "DepthwiseConv2DOptions", 95*89c4ff92SAndroid Build Coastguard Worker "builtin_options": { 96*89c4ff92SAndroid Build Coastguard Worker "padding": ")" + paddingType + R"(", 97*89c4ff92SAndroid Build Coastguard Worker "stride_w": )" + strides+ R"(, 98*89c4ff92SAndroid Build Coastguard Worker "stride_h": )" + strides+ R"(, 99*89c4ff92SAndroid Build Coastguard Worker "depth_multiplier": 1, 100*89c4ff92SAndroid Build Coastguard Worker "fused_activation_function": "NONE" 101*89c4ff92SAndroid Build Coastguard Worker }, 102*89c4ff92SAndroid Build Coastguard Worker "custom_options_format": "FLEXBUFFERS" 103*89c4ff92SAndroid Build Coastguard Worker } 104*89c4ff92SAndroid Build Coastguard Worker ], 105*89c4ff92SAndroid Build Coastguard Worker } ], 106*89c4ff92SAndroid Build Coastguard Worker "buffers" : [ 107*89c4ff92SAndroid Build Coastguard Worker { }, 108*89c4ff92SAndroid Build Coastguard Worker { }, 109*89c4ff92SAndroid Build Coastguard Worker { "data": )" + filterData + R"(, }, )" 110*89c4ff92SAndroid Build Coastguard Worker + biasBuffer + R"( 111*89c4ff92SAndroid Build Coastguard Worker ] 112*89c4ff92SAndroid Build Coastguard Worker } 113*89c4ff92SAndroid Build Coastguard Worker )"; 114*89c4ff92SAndroid Build Coastguard Worker SetupSingleInputSingleOutput("inputTensor", "outputTensor"); 115*89c4ff92SAndroid Build Coastguard Worker } 116*89c4ff92SAndroid Build Coastguard Worker }; 117*89c4ff92SAndroid Build Coastguard Worker 118*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dSameFixture : DepthwiseConvolution2dFixture 119*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dSameFixtureDepthwiseConvolution2dSameFixture120*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dSameFixture() 121*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture("[ 1, 3, 3, 1 ]", // inputShape 122*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 1 ]", // outputShape 123*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 1 ]", // filterShape 124*89c4ff92SAndroid Build Coastguard Worker "[ 9,8,7, 6,5,4, 3,2,1 ]", // filterData 125*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 126*89c4ff92SAndroid Build Coastguard Worker "SAME") // padding type 127*89c4ff92SAndroid Build Coastguard Worker {} 128*89c4ff92SAndroid Build Coastguard Worker }; 129*89c4ff92SAndroid Build Coastguard Worker 130*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dSameFixture, "ParseDepthwiseConv2DSame") 131*89c4ff92SAndroid Build Coastguard Worker { 132*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmU8>( 133*89c4ff92SAndroid Build Coastguard Worker 0, 134*89c4ff92SAndroid Build Coastguard Worker { 0, 1, 2, 135*89c4ff92SAndroid Build Coastguard Worker 3, 4, 5, 136*89c4ff92SAndroid Build Coastguard Worker 6, 7, 8 }, 137*89c4ff92SAndroid Build Coastguard Worker // the expected values were generated using the example python implementation at 138*89c4ff92SAndroid Build Coastguard Worker // https://eli.thegreenplace.net/2018/depthwise-separable-convolutions-for-machine-learning/ 139*89c4ff92SAndroid Build Coastguard Worker // divide the expected values by the output scale, as it is not 1.0 140*89c4ff92SAndroid Build Coastguard Worker { 14/2, 35/2, 38/2, 141*89c4ff92SAndroid Build Coastguard Worker 57/2, 120/2, 111/2, 142*89c4ff92SAndroid Build Coastguard Worker 110/2, 197/2, 158/2 }); 143*89c4ff92SAndroid Build Coastguard Worker } 144*89c4ff92SAndroid Build Coastguard Worker 145*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dValidFixture : DepthwiseConvolution2dFixture 146*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dValidFixtureDepthwiseConvolution2dValidFixture147*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dValidFixture () 148*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture("[ 1, 3, 3, 1 ]", // inputShape 149*89c4ff92SAndroid Build Coastguard Worker "[ 1, 1, 1, 1 ]", // outputShape 150*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 1 ]", // filterShape 151*89c4ff92SAndroid Build Coastguard Worker "[ 9,8,7, 6,5,4, 3,2,1 ]", // filterData 152*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 153*89c4ff92SAndroid Build Coastguard Worker "VALID") // padding type 154*89c4ff92SAndroid Build Coastguard Worker {} 155*89c4ff92SAndroid Build Coastguard Worker }; 156*89c4ff92SAndroid Build Coastguard Worker 157*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dValidFixture, "ParseDepthwiseConv2DValid") 158*89c4ff92SAndroid Build Coastguard Worker { 159*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmU8>( 160*89c4ff92SAndroid Build Coastguard Worker 0, 161*89c4ff92SAndroid Build Coastguard Worker { 0, 1, 2, 162*89c4ff92SAndroid Build Coastguard Worker 3, 4, 5, 163*89c4ff92SAndroid Build Coastguard Worker 6, 7, 8 }, 164*89c4ff92SAndroid Build Coastguard Worker // divide the expected values by the output scale, as it is not 1.0 165*89c4ff92SAndroid Build Coastguard Worker { 120/2 }); 166*89c4ff92SAndroid Build Coastguard Worker } 167*89c4ff92SAndroid Build Coastguard Worker 168*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dSameBiasFixture : DepthwiseConvolution2dFixture 169*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dSameBiasFixtureDepthwiseConvolution2dSameBiasFixture170*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dSameBiasFixture() 171*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture("[ 1, 3, 3, 1 ]", // inputShape 172*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 1 ]", // outputShape 173*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 1 ]", // filterShape 174*89c4ff92SAndroid Build Coastguard Worker "[ 9,8,7, 6,5,4, 3,2,1 ]", // filterData 175*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 176*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 177*89c4ff92SAndroid Build Coastguard Worker "[ 1 ]", // biasShape 178*89c4ff92SAndroid Build Coastguard Worker "[ 10, 0, 0, 0 ]") // biasData 179*89c4ff92SAndroid Build Coastguard Worker {} 180*89c4ff92SAndroid Build Coastguard Worker }; 181*89c4ff92SAndroid Build Coastguard Worker 182*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dSameBiasFixture, "ParseDepthwiseConv2DSameBias") 183*89c4ff92SAndroid Build Coastguard Worker { 184*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmU8>( 185*89c4ff92SAndroid Build Coastguard Worker 0, 186*89c4ff92SAndroid Build Coastguard Worker { 0, 1, 2, 187*89c4ff92SAndroid Build Coastguard Worker 3, 4, 5, 188*89c4ff92SAndroid Build Coastguard Worker 6, 7, 8 }, 189*89c4ff92SAndroid Build Coastguard Worker // divide the expected values by the output scale, as it is not 1.0 190*89c4ff92SAndroid Build Coastguard Worker { ( 14+10)/2, ( 35+10)/2, ( 38+10)/2, 191*89c4ff92SAndroid Build Coastguard Worker ( 57+10)/2, (120+10)/2, (111+10)/2, 192*89c4ff92SAndroid Build Coastguard Worker (110+10)/2, (197+10)/2, (158+10)/2 }); 193*89c4ff92SAndroid Build Coastguard Worker } 194*89c4ff92SAndroid Build Coastguard Worker 195*89c4ff92SAndroid Build Coastguard Worker struct DynamicDepthwiseConvolution2dSameBiasFixture : DepthwiseConvolution2dFixture 196*89c4ff92SAndroid Build Coastguard Worker { DynamicDepthwiseConvolution2dSameBiasFixtureDynamicDepthwiseConvolution2dSameBiasFixture197*89c4ff92SAndroid Build Coastguard Worker DynamicDepthwiseConvolution2dSameBiasFixture() 198*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture("[ 1, 3, 3, 1 ]", // inputShape 199*89c4ff92SAndroid Build Coastguard Worker "[ ]", // outputShape 200*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 1 ]", // filterShape 201*89c4ff92SAndroid Build Coastguard Worker "[ 9,8,7, 6,5,4, 3,2,1 ]", // filterData 202*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 203*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 204*89c4ff92SAndroid Build Coastguard Worker "[ 1 ]", // biasShape 205*89c4ff92SAndroid Build Coastguard Worker "[ 10, 0, 0, 0 ]") // biasData 206*89c4ff92SAndroid Build Coastguard Worker {} 207*89c4ff92SAndroid Build Coastguard Worker }; 208*89c4ff92SAndroid Build Coastguard Worker 209*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DynamicDepthwiseConvolution2dSameBiasFixture, "ParseDynamicDepthwiseConv2DSameBias") 210*89c4ff92SAndroid Build Coastguard Worker { 211*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmU8, armnn::DataType::QAsymmU8>(0, 212*89c4ff92SAndroid Build Coastguard Worker { { "inputTensor", { 0, 1, 2, 213*89c4ff92SAndroid Build Coastguard Worker 3, 4, 5, 214*89c4ff92SAndroid Build Coastguard Worker 6, 7, 8 } } }, 215*89c4ff92SAndroid Build Coastguard Worker { { "outputTensor", { ( 14+10)/2, ( 35+10)/2, ( 38+10)/2, 216*89c4ff92SAndroid Build Coastguard Worker ( 57+10)/2, (120+10)/2, (111+10)/2, 217*89c4ff92SAndroid Build Coastguard Worker (110+10)/2, (197+10)/2, (158+10)/2 } } }, 218*89c4ff92SAndroid Build Coastguard Worker true); 219*89c4ff92SAndroid Build Coastguard Worker } 220*89c4ff92SAndroid Build Coastguard Worker 221*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dFixture2 : public ParserFlatbuffersFixture 222*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dFixture2DepthwiseConvolution2dFixture2223*89c4ff92SAndroid Build Coastguard Worker explicit DepthwiseConvolution2dFixture2(const std::string& inputShape, 224*89c4ff92SAndroid Build Coastguard Worker const std::string& outputShape, 225*89c4ff92SAndroid Build Coastguard Worker const std::string& filterShape, 226*89c4ff92SAndroid Build Coastguard Worker const std::string& filterData, 227*89c4ff92SAndroid Build Coastguard Worker const std::string& strides, 228*89c4ff92SAndroid Build Coastguard Worker const std::string& paddingType, 229*89c4ff92SAndroid Build Coastguard Worker const std::string biasShape = "", 230*89c4ff92SAndroid Build Coastguard Worker const std::string biasData = "", 231*89c4ff92SAndroid Build Coastguard Worker const std::string filter_quant_min = "[ 0.0 ]", 232*89c4ff92SAndroid Build Coastguard Worker const std::string filter_quant_max = "[ 255.0 ]", 233*89c4ff92SAndroid Build Coastguard Worker const std::string filter_quant_scale = "[ 1.0 ]", 234*89c4ff92SAndroid Build Coastguard Worker const std::string filter_quant_zero_point = "[ 0 ]", 235*89c4ff92SAndroid Build Coastguard Worker const std::string filter_quant_axis = "", 236*89c4ff92SAndroid Build Coastguard Worker const std::string output_scale = "[ 1.0 ]") 237*89c4ff92SAndroid Build Coastguard Worker { 238*89c4ff92SAndroid Build Coastguard Worker std::string inputTensors = "[ 0, 2 ]"; 239*89c4ff92SAndroid Build Coastguard Worker std::string biasTensor = ""; 240*89c4ff92SAndroid Build Coastguard Worker std::string biasBuffer = ""; 241*89c4ff92SAndroid Build Coastguard Worker if (biasShape.size() > 0 && biasData.size() > 0) 242*89c4ff92SAndroid Build Coastguard Worker { 243*89c4ff92SAndroid Build Coastguard Worker inputTensors = "[ 0, 2, 3 ]"; 244*89c4ff92SAndroid Build Coastguard Worker biasTensor = R"( 245*89c4ff92SAndroid Build Coastguard Worker { 246*89c4ff92SAndroid Build Coastguard Worker "shape": )" + biasShape + R"( , 247*89c4ff92SAndroid Build Coastguard Worker "type": "INT32", 248*89c4ff92SAndroid Build Coastguard Worker "buffer": 3, 249*89c4ff92SAndroid Build Coastguard Worker "name": "biasTensor", 250*89c4ff92SAndroid Build Coastguard Worker "quantization": { 251*89c4ff92SAndroid Build Coastguard Worker "min": [ 0.0 ], 252*89c4ff92SAndroid Build Coastguard Worker "max": [ 255.0 ], 253*89c4ff92SAndroid Build Coastguard Worker "scale": [ 1.0 ], 254*89c4ff92SAndroid Build Coastguard Worker "zero_point": [ 0 ], 255*89c4ff92SAndroid Build Coastguard Worker } 256*89c4ff92SAndroid Build Coastguard Worker } )"; 257*89c4ff92SAndroid Build Coastguard Worker biasBuffer = R"( 258*89c4ff92SAndroid Build Coastguard Worker { "data": )" + biasData + R"(, }, )"; 259*89c4ff92SAndroid Build Coastguard Worker } 260*89c4ff92SAndroid Build Coastguard Worker 261*89c4ff92SAndroid Build Coastguard Worker std::string filter_qantization = 262*89c4ff92SAndroid Build Coastguard Worker R"( 263*89c4ff92SAndroid Build Coastguard Worker "min": )" + filter_quant_min + R"(, 264*89c4ff92SAndroid Build Coastguard Worker "max": )" + filter_quant_max + R"(, 265*89c4ff92SAndroid Build Coastguard Worker "scale": )" + filter_quant_scale + R"(, 266*89c4ff92SAndroid Build Coastguard Worker "zero_point": )" + filter_quant_zero_point; 267*89c4ff92SAndroid Build Coastguard Worker // A given quantization axis indicates if per channel quantization is used for filters 268*89c4ff92SAndroid Build Coastguard Worker if (filter_quant_axis.size() > 0) 269*89c4ff92SAndroid Build Coastguard Worker { 270*89c4ff92SAndroid Build Coastguard Worker filter_qantization += 271*89c4ff92SAndroid Build Coastguard Worker R"(, 272*89c4ff92SAndroid Build Coastguard Worker "quantized_dimension": )" + filter_quant_axis; 273*89c4ff92SAndroid Build Coastguard Worker } 274*89c4ff92SAndroid Build Coastguard Worker m_JsonString = R"( 275*89c4ff92SAndroid Build Coastguard Worker { 276*89c4ff92SAndroid Build Coastguard Worker "version": 3, 277*89c4ff92SAndroid Build Coastguard Worker "operator_codes": [ { "builtin_code": "DEPTHWISE_CONV_2D" } ], 278*89c4ff92SAndroid Build Coastguard Worker "subgraphs": [ { 279*89c4ff92SAndroid Build Coastguard Worker "tensors": [ 280*89c4ff92SAndroid Build Coastguard Worker { 281*89c4ff92SAndroid Build Coastguard Worker "shape": )" + inputShape + R"(, 282*89c4ff92SAndroid Build Coastguard Worker "type": "INT8", 283*89c4ff92SAndroid Build Coastguard Worker "buffer": 0, 284*89c4ff92SAndroid Build Coastguard Worker "name": "inputTensor", 285*89c4ff92SAndroid Build Coastguard Worker "quantization": { 286*89c4ff92SAndroid Build Coastguard Worker "min": [ 0.0 ], 287*89c4ff92SAndroid Build Coastguard Worker "max": [ 255.0 ], 288*89c4ff92SAndroid Build Coastguard Worker "scale": [ 1.0 ], 289*89c4ff92SAndroid Build Coastguard Worker "zero_point": [ 0 ], 290*89c4ff92SAndroid Build Coastguard Worker } 291*89c4ff92SAndroid Build Coastguard Worker }, 292*89c4ff92SAndroid Build Coastguard Worker { 293*89c4ff92SAndroid Build Coastguard Worker "shape": )" + outputShape + R"(, 294*89c4ff92SAndroid Build Coastguard Worker "type": "INT8", 295*89c4ff92SAndroid Build Coastguard Worker "buffer": 1, 296*89c4ff92SAndroid Build Coastguard Worker "name": "outputTensor", 297*89c4ff92SAndroid Build Coastguard Worker "quantization": { 298*89c4ff92SAndroid Build Coastguard Worker "min": [ 0.0 ], 299*89c4ff92SAndroid Build Coastguard Worker "max": [ 511.0 ], 300*89c4ff92SAndroid Build Coastguard Worker "scale": )" + output_scale + R"(, 301*89c4ff92SAndroid Build Coastguard Worker "zero_point": [ 0 ], 302*89c4ff92SAndroid Build Coastguard Worker } 303*89c4ff92SAndroid Build Coastguard Worker }, 304*89c4ff92SAndroid Build Coastguard Worker { 305*89c4ff92SAndroid Build Coastguard Worker "shape": )" + filterShape + R"(, 306*89c4ff92SAndroid Build Coastguard Worker "type": "INT8", 307*89c4ff92SAndroid Build Coastguard Worker "buffer": 2, 308*89c4ff92SAndroid Build Coastguard Worker "name": "filterTensor", 309*89c4ff92SAndroid Build Coastguard Worker "quantization": {)" + filter_qantization + R"( 310*89c4ff92SAndroid Build Coastguard Worker } 311*89c4ff92SAndroid Build Coastguard Worker }, )" + biasTensor + R"( 312*89c4ff92SAndroid Build Coastguard Worker ], 313*89c4ff92SAndroid Build Coastguard Worker "inputs": [ 0 ], 314*89c4ff92SAndroid Build Coastguard Worker "outputs": [ 1 ], 315*89c4ff92SAndroid Build Coastguard Worker "operators": [ 316*89c4ff92SAndroid Build Coastguard Worker { 317*89c4ff92SAndroid Build Coastguard Worker "opcode_index": 0, 318*89c4ff92SAndroid Build Coastguard Worker "inputs": )" + inputTensors + R"(, 319*89c4ff92SAndroid Build Coastguard Worker "outputs": [ 1 ], 320*89c4ff92SAndroid Build Coastguard Worker "builtin_options_type": "DepthwiseConv2DOptions", 321*89c4ff92SAndroid Build Coastguard Worker "builtin_options": { 322*89c4ff92SAndroid Build Coastguard Worker "padding": ")" + paddingType + R"(", 323*89c4ff92SAndroid Build Coastguard Worker "stride_w": )" + strides+ R"(, 324*89c4ff92SAndroid Build Coastguard Worker "stride_h": )" + strides+ R"(, 325*89c4ff92SAndroid Build Coastguard Worker "depth_multiplier": 1, 326*89c4ff92SAndroid Build Coastguard Worker "fused_activation_function": "NONE" 327*89c4ff92SAndroid Build Coastguard Worker }, 328*89c4ff92SAndroid Build Coastguard Worker "custom_options_format": "FLEXBUFFERS" 329*89c4ff92SAndroid Build Coastguard Worker } 330*89c4ff92SAndroid Build Coastguard Worker ], 331*89c4ff92SAndroid Build Coastguard Worker } ], 332*89c4ff92SAndroid Build Coastguard Worker "buffers" : [ 333*89c4ff92SAndroid Build Coastguard Worker { }, 334*89c4ff92SAndroid Build Coastguard Worker { }, 335*89c4ff92SAndroid Build Coastguard Worker { "data": )" + filterData + R"(, }, )" 336*89c4ff92SAndroid Build Coastguard Worker + biasBuffer + R"( 337*89c4ff92SAndroid Build Coastguard Worker ] 338*89c4ff92SAndroid Build Coastguard Worker } 339*89c4ff92SAndroid Build Coastguard Worker )"; 340*89c4ff92SAndroid Build Coastguard Worker SetupSingleInputSingleOutput("inputTensor", "outputTensor"); 341*89c4ff92SAndroid Build Coastguard Worker } 342*89c4ff92SAndroid Build Coastguard Worker }; 343*89c4ff92SAndroid Build Coastguard Worker 344*89c4ff92SAndroid Build Coastguard Worker 345*89c4ff92SAndroid Build Coastguard Worker // No quantization meaning scale=1.0 and offset=0.0 and tensor quantization 346*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dNoQuantFixture : DepthwiseConvolution2dFixture2 347*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dNoQuantFixtureDepthwiseConvolution2dNoQuantFixture348*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dNoQuantFixture() 349*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]", // inputShape 350*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // outputShape 351*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // filterShape 352*89c4ff92SAndroid Build Coastguard Worker "[ 9,8,7, 6,5,4, 3,2,1, " 353*89c4ff92SAndroid Build Coastguard Worker "9,8,7, 6,5,4, 3,2,1, " 354*89c4ff92SAndroid Build Coastguard Worker "9,8,7, 6,5,4, 3,2,1 ]", // filterData 355*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 356*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 357*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 358*89c4ff92SAndroid Build Coastguard Worker "" // bias data 359*89c4ff92SAndroid Build Coastguard Worker ) 360*89c4ff92SAndroid Build Coastguard Worker {} 361*89c4ff92SAndroid Build Coastguard Worker }; 362*89c4ff92SAndroid Build Coastguard Worker 363*89c4ff92SAndroid Build Coastguard Worker // No quantization meaning scale=1.0 and offset=0.0 and tensor quantization 364*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dNoQuantFixture, "ParseDepthwiseConv2DNoQuant") 365*89c4ff92SAndroid Build Coastguard Worker { 366*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 367*89c4ff92SAndroid Build Coastguard Worker 0, 368*89c4ff92SAndroid Build Coastguard Worker { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 369*89c4ff92SAndroid Build Coastguard Worker { 18, 14, 10, 36, 30, 24, 30, 26, 22, 27, 21, 15, 54, 45, 370*89c4ff92SAndroid Build Coastguard Worker 36, 45, 39, 33, 18, 14, 10, 36, 30, 24, 30, 26, 22}); 371*89c4ff92SAndroid Build Coastguard Worker } 372*89c4ff92SAndroid Build Coastguard Worker 373*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights but with scales = 1.0 and offsets = 0.0 374*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dNoChannelQuantFixture : DepthwiseConvolution2dFixture2 375*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dNoChannelQuantFixtureDepthwiseConvolution2dNoChannelQuantFixture376*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dNoChannelQuantFixture() 377*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]", // inputShape 378*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // outputShape 379*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // filterShape 380*89c4ff92SAndroid Build Coastguard Worker "[ 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1 ]", //filterData 381*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 382*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 383*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 384*89c4ff92SAndroid Build Coastguard Worker "", // bias data 385*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 386*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 387*89c4ff92SAndroid Build Coastguard Worker "[ 1.0, 1.0, 1.0]", // filter quantization scales 388*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0]", // filter quantization zero-points 389*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 390*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 391*89c4ff92SAndroid Build Coastguard Worker ) 392*89c4ff92SAndroid Build Coastguard Worker {} 393*89c4ff92SAndroid Build Coastguard Worker }; 394*89c4ff92SAndroid Build Coastguard Worker 395*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights but with scales = 1.0 and offsets = 0.0 396*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dNoChannelQuantFixture, "ParseDepthwiseConv2DFilterNoChannelQuant") 397*89c4ff92SAndroid Build Coastguard Worker { 398*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 399*89c4ff92SAndroid Build Coastguard Worker 0, 400*89c4ff92SAndroid Build Coastguard Worker { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 401*89c4ff92SAndroid Build Coastguard Worker { 18, 14, 10, 36, 30, 24, 30, 26, 22, 27, 21, 15, 54, 45, 402*89c4ff92SAndroid Build Coastguard Worker 36, 45, 39, 33, 18, 14, 10, 36, 30, 24, 30, 26, 22}); 403*89c4ff92SAndroid Build Coastguard Worker } 404*89c4ff92SAndroid Build Coastguard Worker 405*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights but all scales are set to the same value 406*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuantFixture : DepthwiseConvolution2dFixture2 407*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuantFixtureDepthwiseConvolution2dWeightsPerChannelQuantFixture408*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuantFixture() 409*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]", // inputShape 410*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // outputShape 411*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // filterShape 412*89c4ff92SAndroid Build Coastguard Worker // filterData is [ 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1 ] 413*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 414*89c4ff92SAndroid Build Coastguard Worker "[36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, " 415*89c4ff92SAndroid Build Coastguard Worker "20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 8, 4]", 416*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 417*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 418*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 419*89c4ff92SAndroid Build Coastguard Worker "", // bias data 420*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 421*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 422*89c4ff92SAndroid Build Coastguard Worker "[ 0.25, 0.25, 0.25]", // filter quantization scales 423*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0]", // filter quantization zero-points 424*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 425*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 426*89c4ff92SAndroid Build Coastguard Worker ) 427*89c4ff92SAndroid Build Coastguard Worker {} 428*89c4ff92SAndroid Build Coastguard Worker }; 429*89c4ff92SAndroid Build Coastguard Worker 430*89c4ff92SAndroid Build Coastguard Worker // Weights are per channel quantized but all scales are set to the same value 431*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuantFixture, 432*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant") 433*89c4ff92SAndroid Build Coastguard Worker { 434*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 435*89c4ff92SAndroid Build Coastguard Worker 0, 436*89c4ff92SAndroid Build Coastguard Worker { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 437*89c4ff92SAndroid Build Coastguard Worker { 18, 14, 10, 36, 30, 24, 30, 26, 22, 27, 21, 15, 54, 45, 438*89c4ff92SAndroid Build Coastguard Worker 36, 45, 39, 33, 18, 14, 10, 36, 30, 24, 30, 26, 22}); 439*89c4ff92SAndroid Build Coastguard Worker } 440*89c4ff92SAndroid Build Coastguard Worker 441*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights all scales are different in this test 442*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant1Fixture : DepthwiseConvolution2dFixture2 443*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant1FixtureDepthwiseConvolution2dWeightsPerChannelQuant1Fixture444*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant1Fixture() 445*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]", // inputShape 446*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // outputShape 447*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // filterShape 448*89c4ff92SAndroid Build Coastguard Worker // filterData is [ 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1, 9,8,7, 6,5,4, 3,2,1 ] 449*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 450*89c4ff92SAndroid Build Coastguard Worker "[36, 40, 70, 24, 25, 40, 12, 10, 10, 36, 40, 70, 24, " 451*89c4ff92SAndroid Build Coastguard Worker "25, 40, 12, 10, 10, 36, 40, 70, 24, 25, 40, 12, 10, 10]", 452*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 453*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 454*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 455*89c4ff92SAndroid Build Coastguard Worker "", // bias data 456*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 457*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 458*89c4ff92SAndroid Build Coastguard Worker "[ 0.25, 0.2, 0.1]", // filter quantization scales 459*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0]", // filter quantization zero-points 460*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 461*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 462*89c4ff92SAndroid Build Coastguard Worker ) 463*89c4ff92SAndroid Build Coastguard Worker {} 464*89c4ff92SAndroid Build Coastguard Worker }; 465*89c4ff92SAndroid Build Coastguard Worker 466*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights all scales are different in this test 467*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant1Fixture, 468*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant1") 469*89c4ff92SAndroid Build Coastguard Worker { 470*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 471*89c4ff92SAndroid Build Coastguard Worker 0, 472*89c4ff92SAndroid Build Coastguard Worker { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 473*89c4ff92SAndroid Build Coastguard Worker { 18, 14, 10, 36, 30, 24, 30, 26, 22, 27, 21, 15, 54, 45, 474*89c4ff92SAndroid Build Coastguard Worker 36, 45, 39, 33, 18, 14, 10, 36, 30, 24, 30, 26, 22}); 475*89c4ff92SAndroid Build Coastguard Worker } 476*89c4ff92SAndroid Build Coastguard Worker 477*89c4ff92SAndroid Build Coastguard Worker 478*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights all scales are different in this test 479*89c4ff92SAndroid Build Coastguard Worker // Uses different shape for weights and input compared to the other tests above 480*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant2Fixture : DepthwiseConvolution2dFixture2 481*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant2FixtureDepthwiseConvolution2dWeightsPerChannelQuant2Fixture482*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant2Fixture() 483*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]", // inputShape 484*89c4ff92SAndroid Build Coastguard Worker "[ 1, 4, 4, 4 ]", // outputShape 485*89c4ff92SAndroid Build Coastguard Worker "[ 1, 2, 2, 4 ]", // filterShape 486*89c4ff92SAndroid Build Coastguard Worker // filterData is [ 9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3 ] 487*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 488*89c4ff92SAndroid Build Coastguard Worker "[36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10]", 489*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 490*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 491*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 492*89c4ff92SAndroid Build Coastguard Worker "", // bias data 493*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 494*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 495*89c4ff92SAndroid Build Coastguard Worker "[ 0.25, 0.2, 0.1, 0.3]", // filter quantization scales 496*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0, 0]", // filter quantization zero-points 497*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 498*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 499*89c4ff92SAndroid Build Coastguard Worker ) 500*89c4ff92SAndroid Build Coastguard Worker {} 501*89c4ff92SAndroid Build Coastguard Worker }; 502*89c4ff92SAndroid Build Coastguard Worker 503*89c4ff92SAndroid Build Coastguard Worker // Uses per channel quantization on weights all scales are different in this test 504*89c4ff92SAndroid Build Coastguard Worker // Uses different shape for weights and input compared to the other tests above 505*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant2Fixture, 506*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant2") 507*89c4ff92SAndroid Build Coastguard Worker { 508*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 509*89c4ff92SAndroid Build Coastguard Worker 0, 510*89c4ff92SAndroid Build Coastguard Worker { 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 511*89c4ff92SAndroid Build Coastguard Worker 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 512*89c4ff92SAndroid Build Coastguard Worker 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 513*89c4ff92SAndroid Build Coastguard Worker 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, 514*89c4ff92SAndroid Build Coastguard Worker { 21, 26, 22, 18, 21, 26, 22, 18, 21, 26, 22, 18, 10, 17, 15, 13, 515*89c4ff92SAndroid Build Coastguard Worker 21, 26, 22, 18, 21, 26, 22, 18, 21, 26, 22, 18, 10, 17, 15, 13, 516*89c4ff92SAndroid Build Coastguard Worker 21, 26, 22, 18, 21, 26, 22, 18, 21, 26, 22, 18, 10, 17, 15, 13, 517*89c4ff92SAndroid Build Coastguard Worker 14, 12, 10, 8, 14, 12, 10, 8, 14, 12, 10, 8, 9, 8, 7, 6}); 518*89c4ff92SAndroid Build Coastguard Worker } 519*89c4ff92SAndroid Build Coastguard Worker 520*89c4ff92SAndroid Build Coastguard Worker // Test for depthwise_multiplier different to one (M > 1) 521*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4Fixture : DepthwiseConvolution2dFixture2 522*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant4FixtureDepthwiseConvolution2dWeightsPerChannelQuant4Fixture523*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant4Fixture() 524*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]", // inputShape 525*89c4ff92SAndroid Build Coastguard Worker "[ 1, 4, 4, 16 ]", // outputShape 526*89c4ff92SAndroid Build Coastguard Worker "[ 1, 2, 2, 16 ]", // filterShape 527*89c4ff92SAndroid Build Coastguard Worker // filter data is [ 9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3, 528*89c4ff92SAndroid Build Coastguard Worker // 9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3, 529*89c4ff92SAndroid Build Coastguard Worker // 9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3, 530*89c4ff92SAndroid Build Coastguard Worker // 9,8,7,6, 5,4,3,2, 1,9,8,7, 6,5,4,3 ] 531*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 532*89c4ff92SAndroid Build Coastguard Worker "[36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10, " 533*89c4ff92SAndroid Build Coastguard Worker "36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10, " 534*89c4ff92SAndroid Build Coastguard Worker "36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10, " 535*89c4ff92SAndroid Build Coastguard Worker "36, 40, 70, 20, 20, 20, 30, 6, 4, 45, 80, 23, 24, 25, 40, 10]", 536*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 537*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 538*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 539*89c4ff92SAndroid Build Coastguard Worker "", // bias data 540*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 541*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 542*89c4ff92SAndroid Build Coastguard Worker "[ 0.25, 0.2, 0.1, 0.3," 543*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.3," 544*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.3," 545*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.3]", // filter quantization scales 546*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0, 0]", // filter quantization zero-points 547*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 548*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 549*89c4ff92SAndroid Build Coastguard Worker ) 550*89c4ff92SAndroid Build Coastguard Worker {} 551*89c4ff92SAndroid Build Coastguard Worker }; 552*89c4ff92SAndroid Build Coastguard Worker 553*89c4ff92SAndroid Build Coastguard Worker // Test for depthwise_multiplier different to one (M > 1) 554*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4Fixture, 555*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4") 556*89c4ff92SAndroid Build Coastguard Worker { 557*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 558*89c4ff92SAndroid Build Coastguard Worker 0, 559*89c4ff92SAndroid Build Coastguard Worker { 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 560*89c4ff92SAndroid Build Coastguard Worker 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 561*89c4ff92SAndroid Build Coastguard Worker 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 562*89c4ff92SAndroid Build Coastguard Worker 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, 563*89c4ff92SAndroid Build Coastguard Worker { 36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 564*89c4ff92SAndroid Build Coastguard Worker 36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 565*89c4ff92SAndroid Build Coastguard Worker 36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 566*89c4ff92SAndroid Build Coastguard Worker 18, 16, 14, 12, 10, 8, 6, 4, 2, 18, 16, 14, 12, 10, 8, 6, 567*89c4ff92SAndroid Build Coastguard Worker 36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 568*89c4ff92SAndroid Build Coastguard Worker 36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 569*89c4ff92SAndroid Build Coastguard Worker 36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 570*89c4ff92SAndroid Build Coastguard Worker 18, 16, 14, 12, 10, 8, 6, 4, 2, 18, 16, 14, 12, 10, 8, 6, 571*89c4ff92SAndroid Build Coastguard Worker 36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 572*89c4ff92SAndroid Build Coastguard Worker 36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 573*89c4ff92SAndroid Build Coastguard Worker 36, 32, 28, 24, 20, 16, 12, 8, 4, 36, 32, 28, 24, 20, 16, 12, 574*89c4ff92SAndroid Build Coastguard Worker 18, 16, 14, 12, 10, 8, 6, 4, 2, 18, 16, 14, 12, 10, 8, 6, 575*89c4ff92SAndroid Build Coastguard Worker 18, 16, 14, 12, 10, 8, 6, 4, 2, 18, 16, 14, 12, 10, 8, 6, 576*89c4ff92SAndroid Build Coastguard Worker 18, 16, 14, 12, 10, 8, 6, 4, 2, 18, 16, 14, 12, 10, 8, 6, 577*89c4ff92SAndroid Build Coastguard Worker 18, 16, 14, 12, 10, 8, 6, 4, 2, 18, 16, 14, 12, 10, 8, 6, 578*89c4ff92SAndroid Build Coastguard Worker 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 8, 7, 6, 5, 4, 3}); 579*89c4ff92SAndroid Build Coastguard Worker } 580*89c4ff92SAndroid Build Coastguard Worker 581*89c4ff92SAndroid Build Coastguard Worker 582*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant6Fixture : DepthwiseConvolution2dFixture2 583*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant6FixtureDepthwiseConvolution2dWeightsPerChannelQuant6Fixture584*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant6Fixture() 585*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]", // inputShape 586*89c4ff92SAndroid Build Coastguard Worker "[ 1, 4, 4, 16 ]", // outputShape 587*89c4ff92SAndroid Build Coastguard Worker "[ 1, 2, 2, 16 ]", // filterShape 588*89c4ff92SAndroid Build Coastguard Worker // filter data is [ 3,4,1,1,1,3,3,2,1,4,3,4,1,2,2,4, 589*89c4ff92SAndroid Build Coastguard Worker // 2,0,3,1,0,2,4,3,4,3,0,1,3,4,4,1, 590*89c4ff92SAndroid Build Coastguard Worker // 3,3,2,0,0,0,1,3,3,2,4,4,3,1,1,3, 591*89c4ff92SAndroid Build Coastguard Worker // 1,0,0,2,3,0,1,1,4,2,2,1,2,3,2,0] 592*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 593*89c4ff92SAndroid Build Coastguard Worker "[12,20,10, 3, 4,15,30, 6, 4,20,30,12, 4,10,20,12," 594*89c4ff92SAndroid Build Coastguard Worker " 8, 0,30, 3, 0,10,40, 9,16,15, 0, 3,12,20,40, 3," 595*89c4ff92SAndroid Build Coastguard Worker " 12,15,20, 0, 0, 0,10, 9,12,10,40,12,12, 5,10, 9," 596*89c4ff92SAndroid Build Coastguard Worker " 4, 0, 0, 6,12, 0,10, 3,16,10,20, 3, 8,15,20, 0]", 597*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 598*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 599*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 600*89c4ff92SAndroid Build Coastguard Worker "", // bias data 601*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 602*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 603*89c4ff92SAndroid Build Coastguard Worker "[ 0.25, 0.2, 0.1, 0.333333333," 604*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.333333333," 605*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.333333333," 606*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.333333333]", // filter quantization scales 607*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0, 0]", // filter quantization zero-points 608*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 609*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 610*89c4ff92SAndroid Build Coastguard Worker ) 611*89c4ff92SAndroid Build Coastguard Worker {} 612*89c4ff92SAndroid Build Coastguard Worker }; 613*89c4ff92SAndroid Build Coastguard Worker 614*89c4ff92SAndroid Build Coastguard Worker 615*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant6Fixture, 616*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant6") 617*89c4ff92SAndroid Build Coastguard Worker { 618*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 619*89c4ff92SAndroid Build Coastguard Worker 0, 620*89c4ff92SAndroid Build Coastguard Worker { 1,0,1,2,0,4,4,0,2,1,2,0,1,3,3,0, 621*89c4ff92SAndroid Build Coastguard Worker 1,2,2,3,3,4,1,1,2,4,1,3,4,2,0,2, 622*89c4ff92SAndroid Build Coastguard Worker 0,3,1,3,4,3,2,0,1,2,3,3,0,2,4,2, 623*89c4ff92SAndroid Build Coastguard Worker 1,2,1,4,3,4,1,3,1,0,2,3,1,3,2,0}, 624*89c4ff92SAndroid Build Coastguard Worker { 9, 7, 3, 7,12, 8,22,22,27,22,13,17,13,10, 9,17, 625*89c4ff92SAndroid Build Coastguard Worker 15, 9,12, 6,16,14,24,27,19,26,18,23, 9,10, 7, 3, 626*89c4ff92SAndroid Build Coastguard Worker 18,14, 9,11, 7, 9,21,25,17,19,10,15,13, 9, 7, 9, 627*89c4ff92SAndroid Build Coastguard Worker 15,16, 9, 1, 3, 9,11,12, 3,12, 9,12, 6, 2, 2, 6, 628*89c4ff92SAndroid Build Coastguard Worker 13, 4,10,12,11,14,28,28,17,17,14,15,15,13,13,22, 629*89c4ff92SAndroid Build Coastguard Worker 26,24,17, 7,10,20,33,31,23,17,17,16,16,23,20, 7, 630*89c4ff92SAndroid Build Coastguard Worker 17,11,16, 6,10,16,24,22,26,18,23,20,22,23,21,23, 631*89c4ff92SAndroid Build Coastguard Worker 12,16, 4, 4, 2, 6, 8,10,12, 8,16,16, 8, 6, 6,14, 632*89c4ff92SAndroid Build Coastguard Worker 14, 3,14,10,15,15,27,25,16,14, 9,11,21,19,16,24, 633*89c4ff92SAndroid Build Coastguard Worker 24,25,13, 7, 3,13,21,24,25,23,14,17,24,24,21,12, 634*89c4ff92SAndroid Build Coastguard Worker 7, 7, 3, 3,11,10,17,13,33,32,21,26,18,17,17,23, 635*89c4ff92SAndroid Build Coastguard Worker 3, 3, 2, 0, 2, 6, 9,13,10,20,20,24, 2, 4, 4, 8, 636*89c4ff92SAndroid Build Coastguard Worker 9, 4,10, 4, 2,14,22,16, 5, 7, 3, 5,13,20,20,19, 637*89c4ff92SAndroid Build Coastguard Worker 11,12, 6, 4, 4,12,12, 8, 9,10, 3, 6,12,18,18,15, 638*89c4ff92SAndroid Build Coastguard Worker 5, 4, 4, 2, 0, 6,12, 9,10,14, 6,10, 3, 6, 6,12, 639*89c4ff92SAndroid Build Coastguard Worker 3, 4, 1, 1, 3, 9, 9, 6, 2, 8, 6, 8, 0, 0, 0, 0}); 640*89c4ff92SAndroid Build Coastguard Worker } 641*89c4ff92SAndroid Build Coastguard Worker 642*89c4ff92SAndroid Build Coastguard Worker 643*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant1_1Fixture : DepthwiseConvolution2dFixture2 644*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant1_1FixtureDepthwiseConvolution2dWeightsPerChannelQuant1_1Fixture645*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant1_1Fixture() 646*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]", // inputShape 647*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // outputShape 648*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // filterShape 649*89c4ff92SAndroid Build Coastguard Worker // filterData is [ 1,4,0,2,4,3,1,0,1, 650*89c4ff92SAndroid Build Coastguard Worker // 3,0,4,0,1,3,4,2,4, 651*89c4ff92SAndroid Build Coastguard Worker // 3,0,3,4,4,0,3,4,2] 652*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 653*89c4ff92SAndroid Build Coastguard Worker "[ 4,20, 0, 8,20,30, 4, 0,10,12," 654*89c4ff92SAndroid Build Coastguard Worker " 0,40, 0, 5,30,16,10,40,12, 0," 655*89c4ff92SAndroid Build Coastguard Worker "30,16,20, 0,12,20,20]", 656*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 657*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 658*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 659*89c4ff92SAndroid Build Coastguard Worker "", // bias data 660*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 661*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 662*89c4ff92SAndroid Build Coastguard Worker "[ 0.25, 0.2, 0.1]", // filter quantization scales 663*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0]", // filter quantization zero-points 664*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 665*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 666*89c4ff92SAndroid Build Coastguard Worker ) 667*89c4ff92SAndroid Build Coastguard Worker {} 668*89c4ff92SAndroid Build Coastguard Worker }; 669*89c4ff92SAndroid Build Coastguard Worker 670*89c4ff92SAndroid Build Coastguard Worker 671*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant1_1Fixture, 672*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant1_1") 673*89c4ff92SAndroid Build Coastguard Worker { 674*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 675*89c4ff92SAndroid Build Coastguard Worker 0, 676*89c4ff92SAndroid Build Coastguard Worker { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 677*89c4ff92SAndroid Build Coastguard Worker { 11,11, 9,17,11,16,10, 5,10, 678*89c4ff92SAndroid Build Coastguard Worker 14,15,13,21,19,20,13,13,13, 679*89c4ff92SAndroid Build Coastguard Worker 7, 7,11,11,11,15, 6, 9,10}); 680*89c4ff92SAndroid Build Coastguard Worker } 681*89c4ff92SAndroid Build Coastguard Worker 682*89c4ff92SAndroid Build Coastguard Worker // Same with input different to 1 683*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant1_2Fixture : DepthwiseConvolution2dFixture2 684*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant1_2FixtureDepthwiseConvolution2dWeightsPerChannelQuant1_2Fixture685*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant1_2Fixture() 686*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 3, 3, 3 ]", // inputShape 687*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // outputShape 688*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 3 ]", // filterShape 689*89c4ff92SAndroid Build Coastguard Worker // filterData is [ 1,4,0,2,4,3,1,0,1, 690*89c4ff92SAndroid Build Coastguard Worker // 3,0,4,0,1,3,4,2,4, 691*89c4ff92SAndroid Build Coastguard Worker // 3,0,3,4,4,0,3,4,2] 692*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 693*89c4ff92SAndroid Build Coastguard Worker "[ 4,20, 0, 8,20,30, 4, 0,10,12," 694*89c4ff92SAndroid Build Coastguard Worker " 0,40, 0, 5,30,16,10,40,12, 0," 695*89c4ff92SAndroid Build Coastguard Worker "30,16,20, 0,12,20,20]", 696*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 697*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 698*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 699*89c4ff92SAndroid Build Coastguard Worker "", // bias data 700*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 701*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 702*89c4ff92SAndroid Build Coastguard Worker "[ 0.25, 0.2, 0.1]", // filter quantization scales 703*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0]", // filter quantization zero-points 704*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 705*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 706*89c4ff92SAndroid Build Coastguard Worker ) 707*89c4ff92SAndroid Build Coastguard Worker {} 708*89c4ff92SAndroid Build Coastguard Worker }; 709*89c4ff92SAndroid Build Coastguard Worker 710*89c4ff92SAndroid Build Coastguard Worker 711*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant1_2Fixture, 712*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant1_2") 713*89c4ff92SAndroid Build Coastguard Worker { 714*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 715*89c4ff92SAndroid Build Coastguard Worker 0, 716*89c4ff92SAndroid Build Coastguard Worker { 3,2,0,0,4,3,0,1,2, 717*89c4ff92SAndroid Build Coastguard Worker 0,1,3,0,4,2,2,2,3, 718*89c4ff92SAndroid Build Coastguard Worker 2,4,3,2,0,4,3,4,0}, 719*89c4ff92SAndroid Build Coastguard Worker { 0,30,16,15,30,32, 8, 9,24, 720*89c4ff92SAndroid Build Coastguard Worker 20,33,28,34,48,50,18,38,35, 721*89c4ff92SAndroid Build Coastguard Worker 8, 8,36,20,28,33,10,28,25}); 722*89c4ff92SAndroid Build Coastguard Worker } 723*89c4ff92SAndroid Build Coastguard Worker 724*89c4ff92SAndroid Build Coastguard Worker 725*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_1Fixture : DepthwiseConvolution2dFixture2 726*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant4_1FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_1Fixture727*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant4_1Fixture() 728*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]", // inputShape 729*89c4ff92SAndroid Build Coastguard Worker "[ 1, 4, 4, 16 ]", // outputShape 730*89c4ff92SAndroid Build Coastguard Worker "[ 1, 2, 2, 16 ]", // filterShape 731*89c4ff92SAndroid Build Coastguard Worker // filter data is [ 3,4,1,1,1,3,3,2,1,4,3,4,1,2,2,4, 732*89c4ff92SAndroid Build Coastguard Worker // 2,0,3,1,0,2,4,3,4,3,0,1,3,4,4,1, 733*89c4ff92SAndroid Build Coastguard Worker // 3,3,2,0,0,0,1,3,3,2,4,4,3,1,1,3, 734*89c4ff92SAndroid Build Coastguard Worker // 1,0,0,2,3,0,1,1,4,2,2,1,2,3,2,0 ] 735*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 736*89c4ff92SAndroid Build Coastguard Worker "[12,20,10, 3, 4,15,30, 6, 4,20,30,13, 4,10,20,13," 737*89c4ff92SAndroid Build Coastguard Worker " 8, 0,30, 3, 0,10,40,10,16,15, 0, 3,12,20,40, 3," 738*89c4ff92SAndroid Build Coastguard Worker " 12,15,20, 0, 0, 0,10,10,12,10,40,13,12, 5,10,10," 739*89c4ff92SAndroid Build Coastguard Worker " 4, 0, 0, 6,12, 0,10, 3,16,10,20, 3, 8,15,20, 0]", 740*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 741*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 742*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 743*89c4ff92SAndroid Build Coastguard Worker "", // bias data 744*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 745*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 746*89c4ff92SAndroid Build Coastguard Worker "[ 0.25, 0.2, 0.1, 0.3," 747*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.3," 748*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.3," 749*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.3]", // filter quantization scales 750*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0, 0]", // filter quantization zero-points 751*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 752*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 753*89c4ff92SAndroid Build Coastguard Worker ) 754*89c4ff92SAndroid Build Coastguard Worker {} 755*89c4ff92SAndroid Build Coastguard Worker }; 756*89c4ff92SAndroid Build Coastguard Worker 757*89c4ff92SAndroid Build Coastguard Worker 758*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_1Fixture, 759*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_1") 760*89c4ff92SAndroid Build Coastguard Worker { 761*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 762*89c4ff92SAndroid Build Coastguard Worker 0, 763*89c4ff92SAndroid Build Coastguard Worker { 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 764*89c4ff92SAndroid Build Coastguard Worker 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 765*89c4ff92SAndroid Build Coastguard Worker 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 766*89c4ff92SAndroid Build Coastguard Worker 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1}, 767*89c4ff92SAndroid Build Coastguard Worker { 9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8, 768*89c4ff92SAndroid Build Coastguard Worker 9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8, 769*89c4ff92SAndroid Build Coastguard Worker 9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8, 770*89c4ff92SAndroid Build Coastguard Worker 6, 7, 3, 1, 1, 3, 4, 5, 4, 6, 7, 8, 4, 3, 3, 7, 771*89c4ff92SAndroid Build Coastguard Worker 9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8, 772*89c4ff92SAndroid Build Coastguard Worker 9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8, 773*89c4ff92SAndroid Build Coastguard Worker 9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8, 774*89c4ff92SAndroid Build Coastguard Worker 6, 7, 3, 1, 1, 3, 4, 5, 4, 6, 7, 8, 4, 3, 3, 7, 775*89c4ff92SAndroid Build Coastguard Worker 9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8, 776*89c4ff92SAndroid Build Coastguard Worker 9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8, 777*89c4ff92SAndroid Build Coastguard Worker 9, 7, 6, 4, 4, 5, 9, 9,12,11, 9,10, 9,10, 9, 8, 778*89c4ff92SAndroid Build Coastguard Worker 6, 7, 3, 1, 1, 3, 4, 5, 4, 6, 7, 8, 4, 3, 3, 7, 779*89c4ff92SAndroid Build Coastguard Worker 5, 4, 4, 2, 1, 5, 7, 5, 5, 7, 3, 5, 4, 6, 6, 5, 780*89c4ff92SAndroid Build Coastguard Worker 5, 4, 4, 2, 1, 5, 7, 5, 5, 7, 3, 5, 4, 6, 6, 5, 781*89c4ff92SAndroid Build Coastguard Worker 5, 4, 4, 2, 1, 5, 7, 5, 5, 7, 3, 5, 4, 6, 6, 5, 782*89c4ff92SAndroid Build Coastguard Worker 3, 4, 1, 1, 1, 3, 3, 2, 1, 4, 3, 4, 1, 2, 2, 4}); 783*89c4ff92SAndroid Build Coastguard Worker } 784*89c4ff92SAndroid Build Coastguard Worker 785*89c4ff92SAndroid Build Coastguard Worker 786*89c4ff92SAndroid Build Coastguard Worker 787*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_2Fixture : DepthwiseConvolution2dFixture2 788*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant4_2FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_2Fixture789*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant4_2Fixture() 790*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]", // inputShape 791*89c4ff92SAndroid Build Coastguard Worker "[ 1, 4, 4, 16 ]", // outputShape 792*89c4ff92SAndroid Build Coastguard Worker "[ 1, 2, 2, 16 ]", // filterShape 793*89c4ff92SAndroid Build Coastguard Worker // filter data is [ 3,4,1,1,1,3,3,2,1,4,3,4,1,2,2,4, 794*89c4ff92SAndroid Build Coastguard Worker // 2,0,3,1,0,2,4,3,4,3,0,1,3,4,4,1, 795*89c4ff92SAndroid Build Coastguard Worker // 3,3,2,0,0,0,1,3,3,2,4,4,3,1,1,3, 796*89c4ff92SAndroid Build Coastguard Worker // 1,0,0,2,3,0,1,1,4,2,2,1,2,3,2,0 ] 797*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 798*89c4ff92SAndroid Build Coastguard Worker "[12,20,10, 3, 4,15,30, 6, 4,20,30,13, 4,10,20,13," 799*89c4ff92SAndroid Build Coastguard Worker " 8, 0,30, 3, 0,10,40,10,16,15, 0, 3,12,20,40, 3," 800*89c4ff92SAndroid Build Coastguard Worker " 12,15,20, 0, 0, 0,10,10,12,10,40,13,12, 5,10,10," 801*89c4ff92SAndroid Build Coastguard Worker " 4, 0, 0, 6,12, 0,10, 3,16,10,20, 3, 8,15,20, 0]", 802*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 803*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 804*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 805*89c4ff92SAndroid Build Coastguard Worker "", // bias data 806*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 807*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 808*89c4ff92SAndroid Build Coastguard Worker "[ 0.25, 0.2, 0.1, 0.3," 809*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.3," 810*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.3," 811*89c4ff92SAndroid Build Coastguard Worker "0.25, 0.2, 0.1, 0.3]", // filter quantization scales 812*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0, 0]", // filter quantization zero-points 813*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 814*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 815*89c4ff92SAndroid Build Coastguard Worker ) 816*89c4ff92SAndroid Build Coastguard Worker {} 817*89c4ff92SAndroid Build Coastguard Worker }; 818*89c4ff92SAndroid Build Coastguard Worker 819*89c4ff92SAndroid Build Coastguard Worker 820*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_2Fixture, 821*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_2") 822*89c4ff92SAndroid Build Coastguard Worker { 823*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 824*89c4ff92SAndroid Build Coastguard Worker 0, 825*89c4ff92SAndroid Build Coastguard Worker { 3,3,3,4, 4,4,0,0, 0,3,4,3, 0,2,2,3, 826*89c4ff92SAndroid Build Coastguard Worker 3,0,3,0, 0,3,2,1, 4,1,2,2, 0,0,0,4, 827*89c4ff92SAndroid Build Coastguard Worker 3,2,2,2, 2,1,0,4, 4,3,2,4, 3,2,0,0, 828*89c4ff92SAndroid Build Coastguard Worker 4,1,4,4, 1,0,4,3, 3,2,0,3, 1,1,0,2}, 829*89c4ff92SAndroid Build Coastguard Worker { 26,21,21, 7,12,17,28,21,20,22,25,26, 6,11,10,16, 830*89c4ff92SAndroid Build Coastguard Worker 16,16, 4,12, 7,18,28,27,30,20,12,14,16,19,17, 6, 831*89c4ff92SAndroid Build Coastguard Worker 12,12, 8, 0, 3,13,18,15,18,26,20,26,26,32,28,21, 832*89c4ff92SAndroid Build Coastguard Worker 0, 0, 0, 0, 2, 6, 6, 4, 2, 8, 6, 8,15,10,10,24, 833*89c4ff92SAndroid Build Coastguard Worker 20,21, 9, 7, 3, 6,15,16,17,22,17,22,17,18,14, 7, 834*89c4ff92SAndroid Build Coastguard Worker 18, 6,16,12,12,11,17,15,18,18,10,12,27,26,22,18, 835*89c4ff92SAndroid Build Coastguard Worker 27,28,12,10, 7, 3, 8,13, 8,12,14,16,26,24,24,24, 836*89c4ff92SAndroid Build Coastguard Worker 9, 9, 6, 0, 0, 0, 2, 6, 0, 0, 0, 0, 4, 8, 8,16, 837*89c4ff92SAndroid Build Coastguard Worker 26,24,17, 7, 2, 8,11,10,30,24,30,28,32,33,30,24, 838*89c4ff92SAndroid Build Coastguard Worker 20,11,16,12, 7, 9,17,13,20,14,16,18,31,36,33,29, 839*89c4ff92SAndroid Build Coastguard Worker 28,25,19, 9, 6,13,20,19, 2, 8, 6, 8,17,17,15,25, 840*89c4ff92SAndroid Build Coastguard Worker 12,15, 5, 3, 2, 6, 7, 7, 0, 0, 0, 0, 6, 2, 2, 6, 841*89c4ff92SAndroid Build Coastguard Worker 14,16, 7, 5, 1, 3, 3, 2,20,28,12,20,13,20,20,19, 842*89c4ff92SAndroid Build Coastguard Worker 9, 4,10, 4, 0, 4, 8, 6, 4,16,12,16,12,18,18,15, 843*89c4ff92SAndroid Build Coastguard Worker 11,12, 6, 4, 2, 8,10, 7, 0, 0, 0, 0, 9,14,14,14, 844*89c4ff92SAndroid Build Coastguard Worker 3, 4, 1, 1, 1, 3, 3, 2, 0, 0, 0, 0, 2, 4, 4, 8}); 845*89c4ff92SAndroid Build Coastguard Worker } 846*89c4ff92SAndroid Build Coastguard Worker 847*89c4ff92SAndroid Build Coastguard Worker 848*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_5Fixture : DepthwiseConvolution2dFixture2 849*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant4_5FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_5Fixture850*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant4_5Fixture() 851*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]", // inputShape 852*89c4ff92SAndroid Build Coastguard Worker "[ 1, 4, 4, 16 ]", // outputShape 853*89c4ff92SAndroid Build Coastguard Worker "[ 1, 2, 2, 16 ]", // filterShape 854*89c4ff92SAndroid Build Coastguard Worker // filter data is [ 1, 4, 9, 16, 25, 36, 855*89c4ff92SAndroid Build Coastguard Worker // 49, 64, 81, 100, 121, 144, 856*89c4ff92SAndroid Build Coastguard Worker // 169, 196, 225, 256, 17, 36, 857*89c4ff92SAndroid Build Coastguard Worker // 57, 80, 105, 132, 161, 192, 858*89c4ff92SAndroid Build Coastguard Worker // 225, 260, 297, 336, 377, 420, 859*89c4ff92SAndroid Build Coastguard Worker // 465, 512, 33, 68, 105, 144, 860*89c4ff92SAndroid Build Coastguard Worker // 185, 228, 273, 320, 369, 420, 861*89c4ff92SAndroid Build Coastguard Worker // 473, 528, 585, 644, 705, 768, 862*89c4ff92SAndroid Build Coastguard Worker // 49, 100, 153, 208, 265, 324, 863*89c4ff92SAndroid Build Coastguard Worker // 385, 448, 513, 580, 649, 720, 864*89c4ff92SAndroid Build Coastguard Worker // 793, 868, 945,1024 ] 865*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 866*89c4ff92SAndroid Build Coastguard Worker "[ 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16," 867*89c4ff92SAndroid Build Coastguard Worker " 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32," 868*89c4ff92SAndroid Build Coastguard Worker " 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48," 869*89c4ff92SAndroid Build Coastguard Worker "49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64]", 870*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 871*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 872*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 873*89c4ff92SAndroid Build Coastguard Worker "", // bias data 874*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 875*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 876*89c4ff92SAndroid Build Coastguard Worker "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16]", // filter quantization scales 877*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0, 0]", // filter quantization zero-points 878*89c4ff92SAndroid Build Coastguard Worker "3", // filter quantized axis 879*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 880*89c4ff92SAndroid Build Coastguard Worker "[ 100.0 ]" // output scale 881*89c4ff92SAndroid Build Coastguard Worker ) 882*89c4ff92SAndroid Build Coastguard Worker {} 883*89c4ff92SAndroid Build Coastguard Worker }; 884*89c4ff92SAndroid Build Coastguard Worker 885*89c4ff92SAndroid Build Coastguard Worker // Test for depthwise_multiplier different to one (M > 1) 886*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_5Fixture, 887*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_5") 888*89c4ff92SAndroid Build Coastguard Worker { 889*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 890*89c4ff92SAndroid Build Coastguard Worker 0, 891*89c4ff92SAndroid Build Coastguard Worker { 1,1,1,2,2,2,1,2,1,2,2,1,2,2,1,1,1,1,1,1,1,2,2,2, 892*89c4ff92SAndroid Build Coastguard Worker 1,2,2,2,1,1,1,2,1,1,1,1,2,1,2,1,2,1,1,2,1,2,1,1, 893*89c4ff92SAndroid Build Coastguard Worker 1,2,2,1,2,2,1,1,2,1,2,1,1,2,1,2}, 894*89c4ff92SAndroid Build Coastguard Worker { 1, 2, 3, 5, 9,11,14,16,17,19,21,24,32,36,39,43, 895*89c4ff92SAndroid Build Coastguard Worker 1, 2, 3, 4,11,14,17,20,22,26,29,33,34,38,42,46, 896*89c4ff92SAndroid Build Coastguard Worker 1, 2, 3, 5, 8,11,13,16,16,18,21,24,33,36,39,43, 897*89c4ff92SAndroid Build Coastguard Worker 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6,13,14,16,17, 898*89c4ff92SAndroid Build Coastguard Worker 1, 3, 4, 6, 6, 8,10,12,19,22,24,27,23,25,28,30, 899*89c4ff92SAndroid Build Coastguard Worker 1, 3, 5, 8, 7, 8,10,12,18,21,24,27,32,36,39,43, 900*89c4ff92SAndroid Build Coastguard Worker 1, 2, 4, 5, 8,10,13,15,12,14,16,18,30,33,37,40, 901*89c4ff92SAndroid Build Coastguard Worker 0, 0, 1, 1, 3, 4, 5, 7, 4, 5, 5, 6, 9,10,11,12, 902*89c4ff92SAndroid Build Coastguard Worker 1, 3, 5, 7,10,12,15,17,17,20,23,25,19,21,23,25, 903*89c4ff92SAndroid Build Coastguard Worker 2, 4, 6, 8, 7, 9,11,13,17,20,23,25,23,25,28,30, 904*89c4ff92SAndroid Build Coastguard Worker 1, 2, 4, 6, 9,11,14,16,15,17,20,22,28,31,35,38, 905*89c4ff92SAndroid Build Coastguard Worker 0, 0, 1, 1, 4, 5, 6, 7, 4, 5, 5, 6,13,14,16,17, 906*89c4ff92SAndroid Build Coastguard Worker 0, 0, 1, 1, 2, 3, 4, 5, 3, 4, 5, 6, 5, 6, 6, 7, 907*89c4ff92SAndroid Build Coastguard Worker 0, 0, 1, 1, 1, 2, 2, 3, 5, 6, 7, 8, 5, 6, 6, 7, 908*89c4ff92SAndroid Build Coastguard Worker 0, 0, 0, 1, 2, 3, 3, 4, 3, 4, 5, 6, 9,10,11,12, 909*89c4ff92SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 3, 3, 4, 5}); 910*89c4ff92SAndroid Build Coastguard Worker } 911*89c4ff92SAndroid Build Coastguard Worker 912*89c4ff92SAndroid Build Coastguard Worker 913*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_3_1Fixture : DepthwiseConvolution2dFixture2 914*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant4_3_1FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_3_1Fixture915*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant4_3_1Fixture() 916*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 4, 4, 4 ]", // inputShape 917*89c4ff92SAndroid Build Coastguard Worker "[ 1, 4, 4, 16 ]", // outputShape 918*89c4ff92SAndroid Build Coastguard Worker "[ 1, 2, 2, 16 ]", // filterShape 919*89c4ff92SAndroid Build Coastguard Worker // filter data is [ 3,4,1,1,1,3,3,2,1,4,3,4,1,2,2,4, 920*89c4ff92SAndroid Build Coastguard Worker // 2,0,3,1,0,2,4,3,4,3,0,1,3,4,4,1, 921*89c4ff92SAndroid Build Coastguard Worker // 3,3,2,0,0,0,1,3,3,2,4,4,3,1,1,3, 922*89c4ff92SAndroid Build Coastguard Worker // 1,0,0,2,3,0,1,1,4,2,2,1,2,3,2,0 ] 923*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 924*89c4ff92SAndroid Build Coastguard Worker "[12,20,10, 3, 2,24, 9,10, 5,16,30,12, 3,10, 4,32," 925*89c4ff92SAndroid Build Coastguard Worker " 8, 0,30, 3, 0,16,12,15,20,12, 0, 3, 9,20, 8, 8," 926*89c4ff92SAndroid Build Coastguard Worker " 12,15,20, 0, 0, 0, 3,15,15, 8,40,12, 9, 5, 2,24," 927*89c4ff92SAndroid Build Coastguard Worker " 4, 0, 0, 6, 6, 0, 3, 5,20, 8,20, 3, 6,15, 4, 0]", 928*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 929*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 930*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 931*89c4ff92SAndroid Build Coastguard Worker "", // bias data 932*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 933*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 934*89c4ff92SAndroid Build Coastguard Worker "[0.25, 0.2, 0.1, 0.3333333333, " 935*89c4ff92SAndroid Build Coastguard Worker "0.5, 0.125, 0.33333333, 0.2, " 936*89c4ff92SAndroid Build Coastguard Worker "0.2, 0.25, 0.1, 0.333333333, " 937*89c4ff92SAndroid Build Coastguard Worker "0.3333333333, 0.2, 0.5, 0.125]", // filter quantization scales 938*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0, 0]", // filter quantization zero-points 939*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 940*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 941*89c4ff92SAndroid Build Coastguard Worker ) 942*89c4ff92SAndroid Build Coastguard Worker {} 943*89c4ff92SAndroid Build Coastguard Worker }; 944*89c4ff92SAndroid Build Coastguard Worker 945*89c4ff92SAndroid Build Coastguard Worker // Test for depthwise_multiplier different to one (M > 1) 946*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_3_1Fixture, 947*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_3_1") 948*89c4ff92SAndroid Build Coastguard Worker { 949*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 950*89c4ff92SAndroid Build Coastguard Worker 0, 951*89c4ff92SAndroid Build Coastguard Worker { 3,3,3,4, 4,4,0,0, 0,3,4,3, 0,2,2,3, 952*89c4ff92SAndroid Build Coastguard Worker 3,0,3,0, 0,3,2,1, 4,1,2,2, 0,0,0,4, 953*89c4ff92SAndroid Build Coastguard Worker 3,2,2,2, 2,1,0,4, 4,3,2,4, 3,2,0,0, 954*89c4ff92SAndroid Build Coastguard Worker 4,1,4,4, 1,0,4,3, 3,2,0,3, 1,1,0,2}, 955*89c4ff92SAndroid Build Coastguard Worker { 26,21,21, 7,12,17,28,21,20,22,25,26, 6,11,10,16, 956*89c4ff92SAndroid Build Coastguard Worker 16,16, 4,12, 7,18,28,27,30,20,12,14,16,19,17, 6, 957*89c4ff92SAndroid Build Coastguard Worker 12,12, 8, 0, 3,13,18,15,18,26,20,26,26,32,28,21, 958*89c4ff92SAndroid Build Coastguard Worker 0, 0, 0, 0, 2, 6, 6, 4, 2, 8, 6, 8,15,10,10,24, 959*89c4ff92SAndroid Build Coastguard Worker 20,21, 9, 7, 3, 6,15,16,17,22,17,22,17,18,14, 7, 960*89c4ff92SAndroid Build Coastguard Worker 18, 6,16,12,12,11,17,15,18,18,10,12,27,26,22,18, 961*89c4ff92SAndroid Build Coastguard Worker 27,28,12,10, 7, 3, 8,13, 8,12,14,16,26,24,24,24, 962*89c4ff92SAndroid Build Coastguard Worker 9, 9, 6, 0, 0, 0, 2, 6, 0, 0, 0, 0, 4, 8, 8,16, 963*89c4ff92SAndroid Build Coastguard Worker 26,24,17, 7, 2, 8,11,10,30,24,30,28,32,33,30,24, 964*89c4ff92SAndroid Build Coastguard Worker 20,11,16,12, 7, 9,17,13,20,14,16,18,31,36,33,29, 965*89c4ff92SAndroid Build Coastguard Worker 28,25,19, 9, 6,13,20,19, 2, 8, 6, 8,17,17,15,25, 966*89c4ff92SAndroid Build Coastguard Worker 12,15, 5, 3, 2, 6, 7, 7, 0, 0, 0, 0, 6, 2, 2, 6, 967*89c4ff92SAndroid Build Coastguard Worker 14,16, 7, 5, 1, 3, 3, 2,20,28,12,20,13,20,20,19, 968*89c4ff92SAndroid Build Coastguard Worker 9, 4,10, 4, 0, 4, 8, 6, 4,16,12,16,12,18,18,15, 969*89c4ff92SAndroid Build Coastguard Worker 11,12, 6, 4, 2, 8,10, 7, 0, 0, 0, 0, 9,14,14,14, 970*89c4ff92SAndroid Build Coastguard Worker 3, 4, 1, 1, 1, 3, 3, 2, 0, 0, 0, 0, 2, 4, 4, 8}); 971*89c4ff92SAndroid Build Coastguard Worker } 972*89c4ff92SAndroid Build Coastguard Worker 973*89c4ff92SAndroid Build Coastguard Worker struct DepthwiseConvolution2dWeightsPerChannelQuant4_3_2Fixture : DepthwiseConvolution2dFixture2 974*89c4ff92SAndroid Build Coastguard Worker { DepthwiseConvolution2dWeightsPerChannelQuant4_3_2FixtureDepthwiseConvolution2dWeightsPerChannelQuant4_3_2Fixture975*89c4ff92SAndroid Build Coastguard Worker DepthwiseConvolution2dWeightsPerChannelQuant4_3_2Fixture() 976*89c4ff92SAndroid Build Coastguard Worker : DepthwiseConvolution2dFixture2("[ 1, 2, 2, 2 ]", // inputShape 977*89c4ff92SAndroid Build Coastguard Worker "[ 1, 2, 2, 4 ]", // outputShape 978*89c4ff92SAndroid Build Coastguard Worker "[ 1, 3, 3, 4 ]", // filterShape 979*89c4ff92SAndroid Build Coastguard Worker // filter data is [ 0,1,2,3,4,5,6,7,8, 980*89c4ff92SAndroid Build Coastguard Worker // 0,1,2,3,4,5,6,7,8, 981*89c4ff92SAndroid Build Coastguard Worker // 0,1,2,3,4,5,6,7,8, 982*89c4ff92SAndroid Build Coastguard Worker // 0,1,2,3,4,5,6,7,8 ] 983*89c4ff92SAndroid Build Coastguard Worker // quantized per channel with q_dim=3 984*89c4ff92SAndroid Build Coastguard Worker "[0, 5,20, 9,16,25,60,21,32," 985*89c4ff92SAndroid Build Coastguard Worker " 0,10, 6,12,20,50,18,28,40," 986*89c4ff92SAndroid Build Coastguard Worker " 0, 3, 8,15,40,15,24,35,80," 987*89c4ff92SAndroid Build Coastguard Worker " 0, 4,10,30,12,20,30,70,24]", 988*89c4ff92SAndroid Build Coastguard Worker "1", // stride w and h 989*89c4ff92SAndroid Build Coastguard Worker "SAME", // padding type 990*89c4ff92SAndroid Build Coastguard Worker "", // bias shape 991*89c4ff92SAndroid Build Coastguard Worker "", // bias data 992*89c4ff92SAndroid Build Coastguard Worker "[ 0.0 ]", // filter quantization min values 993*89c4ff92SAndroid Build Coastguard Worker "[ 255.0 ]", // filter quantization max values 994*89c4ff92SAndroid Build Coastguard Worker "[0.25, 0.2, 0.1, 0.3333333333]", // filter quantization scales 995*89c4ff92SAndroid Build Coastguard Worker "[ 0, 0, 0, 0]", // filter quantization zero-points 996*89c4ff92SAndroid Build Coastguard Worker "3" // filter quantized axis 997*89c4ff92SAndroid Build Coastguard Worker // (in case of per channel quantization) 998*89c4ff92SAndroid Build Coastguard Worker ) 999*89c4ff92SAndroid Build Coastguard Worker {} 1000*89c4ff92SAndroid Build Coastguard Worker }; 1001*89c4ff92SAndroid Build Coastguard Worker 1002*89c4ff92SAndroid Build Coastguard Worker // An easy test with M > 1 for debugging 1003*89c4ff92SAndroid Build Coastguard Worker TEST_CASE_FIXTURE(DepthwiseConvolution2dWeightsPerChannelQuant4_3_2Fixture, 1004*89c4ff92SAndroid Build Coastguard Worker "ParseDepthwiseConv2DFilterWeightsPerChannelQuant4_3_2") 1005*89c4ff92SAndroid Build Coastguard Worker { 1006*89c4ff92SAndroid Build Coastguard Worker RunTest<4, armnn::DataType::QAsymmS8>( 1007*89c4ff92SAndroid Build Coastguard Worker 0, 1008*89c4ff92SAndroid Build Coastguard Worker { 0,1,2,3,4,5,6,7}, 1009*89c4ff92SAndroid Build Coastguard Worker { 38,50,76,92,44,56,66,37,56,50,37,53,62,74,45,61}); 1010*89c4ff92SAndroid Build Coastguard Worker } 1011*89c4ff92SAndroid Build Coastguard Worker 1012*89c4ff92SAndroid Build Coastguard Worker } // end of TEST_SUITE("TensorflowLiteParser_DepthwiseConvolution2D") 1013