1 # 2 # Copyright (C) 2018 The Android Open Source Project 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 # 16 17 layout = BoolScalar("layout", False) # NHWC 18 19 # TEST 1: TRANSPOSE_CONV2D, pad = valid, stride = 2 20 i1 = Input("op1", "TENSOR_FLOAT32", "{1, 2, 2, 1}") # input 0 21 w1 = Parameter("op2", "TENSOR_FLOAT32", "{2, 3, 3, 1}", [1, 3, 5, 7, 9, 11, 13, 15, 17, 2, 4, 6, 8, 10, 12, 14, 16, 18]) # weight 22 b1 = Parameter("op3", "TENSOR_FLOAT32", "{2}", [-1.5, -2]) # bias 23 s1 = Int32Vector("shape", [1, 5, 5, 2]) # output shape 24 act = Int32Scalar("act", 0) # act = none 25 o1 = Output("op4", "TENSOR_FLOAT32", "{1, 5, 5, 2}") # output 26 Model().Operation("TRANSPOSE_CONV_2D", i1, w1, b1, s1, 2, 2, 2, act, layout).To(o1) 27 28 # Additional data type 29 quant8 = DataTypeConverter().Identify({ 30 i1: ("TENSOR_QUANT8_ASYMM", 0.5, 0), 31 w1: ("TENSOR_QUANT8_ASYMM", 0.5, 0), 32 b1: ("TENSOR_INT32", 0.25, 0), 33 o1: ("TENSOR_QUANT8_ASYMM", 0.5, 0) 34 }) 35 36 quant8_mult_gt_1 = DataTypeConverter().Identify({ 37 i1: ("TENSOR_QUANT8_ASYMM", 0.5, 100), 38 w1: ("TENSOR_QUANT8_ASYMM", 0.5, 128), 39 b1: ("TENSOR_INT32", 0.25, 0), 40 o1: ("TENSOR_QUANT8_ASYMM", 0.1, 80) 41 }) 42 43 # Per-channel quantization 44 channelQuant8 = DataTypeConverter().Identify({ 45 i1: ("TENSOR_QUANT8_ASYMM", 0.25, 100), 46 w1: ("TENSOR_QUANT8_SYMM_PER_CHANNEL", 0, 0, SymmPerChannelQuantParams(channelDim=0, scales=[0.25, 0.5])), 47 b1: ("TENSOR_INT32", 0.0, 0, SymmPerChannelQuantParams(channelDim=0, scales=[0.0625, 0.125], hide=True)), 48 o1: ("TENSOR_QUANT8_ASYMM", 0.5, 80) 49 }) 50 51 channelQuant8_mult_gt_1 = DataTypeConverter().Identify({ 52 i1: ("TENSOR_QUANT8_ASYMM", 0.25, 100), 53 w1: ("TENSOR_QUANT8_SYMM_PER_CHANNEL", 0, 0, SymmPerChannelQuantParams(channelDim=0, scales=[0.25, 0.5])), 54 b1: ("TENSOR_INT32", 0.0, 0, SymmPerChannelQuantParams(channelDim=0, scales=[0.0625, 0.125], hide=True)), 55 o1: ("TENSOR_QUANT8_ASYMM", 0.1, 80) 56 }) 57 58 Example({ 59 i1: [1, 2, 3, 4], 60 o1: [-0.5, 0, 1.5, 2, 5.5, 8, 4.5, 6, 8.5, 10, 61 5.5, 6, 7.5, 8, 23.5, 26, 16.5, 18, 20.5, 22, 62 14.5, 18, 22.5, 26, 60.5, 70, 40.5, 46, 52.5, 58, 63 19.5, 22, 25.5, 28, 59.5, 66, 34.5, 38, 42.5, 46, 64 37.5, 40, 43.5, 46, 101.5, 108, 58.5, 62, 66.5, 70] 65 }).AddNchw(i1, o1, s1, layout).AddAllActivations(o1, act).AddVariations("relaxed", quant8, quant8_mult_gt_1, channelQuant8, channelQuant8_mult_gt_1, "float16").AddInput(w1, b1) 66 67 68 # TEST 2: TRANSPOSE_CONV2D_LARGE, pad = same, stride = 3, act = relu 69 i2 = Input("op1", "TENSOR_FLOAT32", "{1, 1, 2, 1}") # input 0 70 w2 = Parameter("op2", "TENSOR_FLOAT32", "{1, 3, 3, 1}", [9, 5, 6, 9, 8, 5, 3, 1, 4]) # weight 71 b2 = Parameter("op3", "TENSOR_FLOAT32", "{1}", [-1000]) # bias 72 s2 = Int32Vector("shape", [1, 3, 4, 1]) # output shape 73 o2 = Output("op4", "TENSOR_FLOAT32", "{1, 3, 4, 1}") # output 74 Model().Operation("TRANSPOSE_CONV_2D", i2, w2, b2, s2, 1, 3, 3, 1, layout).To(o2) 75 76 # Additional data type 77 quant8 = DataTypeConverter().Identify({ 78 i2: ("TENSOR_QUANT8_ASYMM", 2.0, 0), 79 w2: ("TENSOR_QUANT8_ASYMM", 0.25, 128), 80 b2: ("TENSOR_INT32", 0.5, 0), 81 o2: ("TENSOR_QUANT8_ASYMM", 20.0, 50) 82 }) 83 84 # Per-channel quantization 85 channelQuant8 = DataTypeConverter().Identify({ 86 i2: ("TENSOR_QUANT8_ASYMM", 2.0, 0), 87 w2: ("TENSOR_QUANT8_SYMM_PER_CHANNEL", 0, 0, SymmPerChannelQuantParams(channelDim=0, scales=[0.25])), 88 b2: ("TENSOR_INT32", 0.0, 0, SymmPerChannelQuantParams(channelDim=0, scales=[0.5], hide=True)), 89 o2: ("TENSOR_QUANT8_ASYMM", 20.0, 50) 90 }) 91 92 Example({ 93 i2: [300, 500], 94 o2: [500., 800., 3500., 1500., 95 1400., 500., 3500., 3000., 96 0., 200., 500., 0.] 97 }).AddNchw(i2, o2, s2, layout).AddVariations("relaxed", quant8, channelQuant8, "float16").AddInput(w2, b2) 98 99 100 # TEST 3: TRANSPOSE_CONV2D_SAME, outputShape = [1, 4, 4, 1], pad = same, stride = 1, act = none 101 i3 = Input("op1", "TENSOR_FLOAT32", "{1, 4, 4, 2}") # input 0 102 w3 = Parameter("op2", "TENSOR_FLOAT32", "{1, 3, 3, 2}", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]) # weight 103 b3 = Parameter("op3", "TENSOR_FLOAT32", "{1}", [0]) # bias 104 s3 = Int32Vector("shape", [1, 4, 4, 1]) # output shape 105 o3 = Output("op4", "TENSOR_FLOAT32", "{1, 4, 4, 1}") # output 106 Model().Operation("TRANSPOSE_CONV_2D", i3, w3, b3, s3, 1, 1, 1, 0, layout).To(o3) 107 108 # Additional data type 109 quant8 = DataTypeConverter().Identify({ 110 i3: ("TENSOR_QUANT8_ASYMM", 0.5, 100), 111 w3: ("TENSOR_QUANT8_ASYMM", 0.5, 128), 112 b3: ("TENSOR_INT32", 0.25, 0), 113 o3: ("TENSOR_QUANT8_ASYMM", 16.0, 0) 114 }) 115 116 Example({ 117 i3: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 118 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], 119 o3: [184, 412, 568, 528, 120 678, 1347, 1689, 1434, 121 1494, 2715, 3057, 2442, 122 1968, 3352, 3652, 2760] 123 }).AddNchw(i3, o3, s3, layout).AddVariations("relaxed", quant8, "float16").AddInput(w3, b3) 124 125 126 # TEST 4: TRANSPOSE_CONV2D_VALID, outputShape = [1, 6, 6, 1], pad = valid, stride = 1, act = none 127 i4 = Input("op1", "TENSOR_FLOAT32", "{1, 4, 4, 2}") # input 0 128 w4 = Parameter("op2", "TENSOR_FLOAT32", "{1, 3, 3, 2}", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]) # weight 129 b4 = Parameter("op3", "TENSOR_FLOAT32", "{1}", [0]) # bias 130 s4 = Int32Vector("shape", [1, 6, 6, 1]) # output shape 131 o4 = Output("op4", "TENSOR_FLOAT32", "{1, 6, 6, 1}") # output 132 Model().Operation("TRANSPOSE_CONV_2D", i4, w4, b4, s4, 2, 1, 1, 0, layout).To(o4) 133 134 # Additional data type 135 quant8 = DataTypeConverter().Identify({ 136 i4: ("TENSOR_QUANT8_ASYMM", 0.25, 10), 137 w4: ("TENSOR_QUANT8_ASYMM", 0.5, 128), 138 b4: ("TENSOR_INT32", 0.125, 0), 139 o4: ("TENSOR_QUANT8_ASYMM", 32.0, 80) 140 }) 141 142 Example({ 143 i4: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 144 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], 145 o4: [5, 22, 59, 101, 114, 83, 146 52, 184, 412, 568, 528, 344, 147 237, 678, 1347, 1689, 1434, 879, 148 597, 1494, 2715, 3057, 2442, 1431, 149 856, 1968, 3352, 3652, 2760, 1548, 150 689, 1534, 2543, 2729, 2010, 1103] 151 }).AddNchw(i4, o4, s4, layout).AddVariations("relaxed", quant8, "float16").AddInput(w4, b4) 152 153 154 # TEST 5: TRANSPOSE_CONV2D_EXPLICIT, pad = [1, 2, 2, 1], stride = 1, act = none 155 i5 = Input("op1", "TENSOR_FLOAT32", "{1, 4, 4, 2}") # input 0 156 w5 = Parameter("op2", "TENSOR_FLOAT32", "{1, 3, 3, 2}", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]) # weight 157 b5 = Parameter("op3", "TENSOR_FLOAT32", "{1}", [0]) # bias 158 o5 = Output("op4", "TENSOR_FLOAT32", "{1, 3, 3, 1}") # output 159 Model().Operation("TRANSPOSE_CONV_2D", i5, w5, b5, 1, 2, 2, 1, 1, 1, 0, layout).To(o5) 160 161 # Additional data type 162 quant8 = DataTypeConverter().Identify({ 163 i5: ("TENSOR_QUANT8_ASYMM", 0.5, 100), 164 w5: ("TENSOR_QUANT8_ASYMM", 0.25, 128), 165 b5: ("TENSOR_INT32", 0.125, 0), 166 o5: ("TENSOR_QUANT8_ASYMM", 20.0, 50) 167 }) 168 169 Example({ 170 i5: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 171 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], 172 o5: [678, 1347, 1689, 173 1494, 2715, 3057, 174 1968, 3352, 3652] 175 }).AddNchw(i5, o5, layout).AddVariations("relaxed", quant8, "float16").AddInput(w5, b5) 176 177 178 # TEST 6: zero-sized input, implicit padding 179 180 # Use BOX_WITH_NMS_LIMIT op to generate a zero-sized internal tensor for box cooridnates. 181 p1 = Parameter("scores", "TENSOR_FLOAT32", "{1, 2}", [0.90, 0.10]) # scores 182 p2 = Parameter("roi", "TENSOR_FLOAT32", "{1, 8}", [1, 1, 10, 10, 0, 0, 10, 10]) # roi 183 o1 = Output("scoresOut", "TENSOR_FLOAT32", "{0}") # scores out 184 o2 = Output("classesOut", "TENSOR_INT32", "{0}") # classes out 185 tmp1 = Internal("roiOut", "TENSOR_FLOAT32", "{0, 4}") # roi out 186 tmp2 = Internal("batchSplitOut", "TENSOR_INT32", "{0}") # batch split out 187 model = Model("zero_sized").Operation("BOX_WITH_NMS_LIMIT", p1, p2, [0], 0.3, -1, 0, 0.4, 1.0, 0.3).To(o1, tmp1, o2, tmp2) 188 189 # Use ROI_ALIGN op to convert into zero-sized feature map. 190 i1 = Input("in", "TENSOR_FLOAT32", "{1, 1, 1, 1}") 191 zero_sized = Internal("featureMap", "TENSOR_FLOAT32", "{0, 2, 2, 1}") 192 model = model.Operation("ROI_ALIGN", i1, tmp1, tmp2, 2, 2, 2.0, 2.0, 4, 4, layout).To(zero_sized) 193 194 # TRANSPOSE_CONV_2D op with numBatches = 0. 195 w = Parameter("weights", "TENSOR_FLOAT32", "{2, 3, 3, 1}", [1, 3, 5, 7, 9, 11, 9, 7, 5, 2, 4, 6, 8, 10, 12, 10, 8, 6]) # weight 196 b = Parameter("bias", "TENSOR_FLOAT32", "{2}", [-1.5, -2]) # bias 197 s = Int32Vector("shape", [0, 5, 5, 2]) # output shape 198 o3 = Output("out", "TENSOR_FLOAT32", "{0, 5, 5, 2}") # out 199 model = model.Operation("TRANSPOSE_CONV_2D", zero_sized, w, b, s, 2, 2, 2, 0, layout).To(o3) 200 201 quant8 = DataTypeConverter().Identify({ 202 p1: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 203 p2: ("TENSOR_QUANT16_ASYMM", 0.125, 0), 204 o1: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 205 tmp1: ("TENSOR_QUANT16_ASYMM", 0.125, 0), 206 i1: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 207 zero_sized: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 208 w: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 209 b: ("TENSOR_INT32", 0.01, 0), 210 o3: ("TENSOR_QUANT8_ASYMM", 0.1, 128) 211 }) 212 213 # Create test case with dummy values. 214 Example({ 215 i1: [1], 216 o1: [0], 217 o2: [0], 218 o3: [0], 219 }).AddNchw(i1, zero_sized, o3, s, layout).AddVariations("relaxed", quant8, "float16") 220 221 222 # TEST 7: zero-sized input, explicit padding 223 224 # Use BOX_WITH_NMS_LIMIT op to generate a zero-sized internal tensor for box cooridnates. 225 p1 = Parameter("scores", "TENSOR_FLOAT32", "{1, 2}", [0.90, 0.10]) # scores 226 p2 = Parameter("roi", "TENSOR_FLOAT32", "{1, 8}", [1, 1, 10, 10, 0, 0, 10, 10]) # roi 227 o1 = Output("scoresOut", "TENSOR_FLOAT32", "{0}") # scores out 228 o2 = Output("classesOut", "TENSOR_INT32", "{0}") # classes out 229 tmp1 = Internal("roiOut", "TENSOR_FLOAT32", "{0, 4}") # roi out 230 tmp2 = Internal("batchSplitOut", "TENSOR_INT32", "{0}") # batch split out 231 model = Model("zero_sized").Operation("BOX_WITH_NMS_LIMIT", p1, p2, [0], 0.3, -1, 0, 0.4, 1.0, 0.3).To(o1, tmp1, o2, tmp2) 232 233 # Use ROI_ALIGN op to convert into zero-sized feature map. 234 i1 = Input("in", "TENSOR_FLOAT32", "{1, 1, 1, 1}") 235 zero_sized = Internal("featureMap", "TENSOR_FLOAT32", "{0, 4, 4, 1}") 236 model = model.Operation("ROI_ALIGN", i1, tmp1, tmp2, 4, 4, 2.0, 2.0, 4, 4, layout).To(zero_sized) 237 238 # TRANSPOSE_CONV_2D op with numBatches = 0. 239 w = Parameter("weights", "TENSOR_FLOAT32", "{1, 3, 3, 1}", [1, 3, 5, 7, 9, 11, 9, 7, 5]) # weight 240 b = Parameter("bias", "TENSOR_FLOAT32", "{1}", [-1.5]) # bias 241 o3 = Output("out", "TENSOR_FLOAT32", "{0, 3, 3, 1}") # out 242 model = model.Operation("TRANSPOSE_CONV_2D", zero_sized, w, b, 1, 2, 2, 1, 1, 1, 0, layout).To(o3) 243 244 quant8 = DataTypeConverter().Identify({ 245 p1: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 246 p2: ("TENSOR_QUANT16_ASYMM", 0.125, 0), 247 o1: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 248 tmp1: ("TENSOR_QUANT16_ASYMM", 0.125, 0), 249 i1: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 250 zero_sized: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 251 w: ("TENSOR_QUANT8_ASYMM", 0.1, 128), 252 b: ("TENSOR_INT32", 0.01, 0), 253 o3: ("TENSOR_QUANT8_ASYMM", 0.1, 128) 254 }) 255 256 # Create test case with dummy values. 257 Example({ 258 i1: [1], 259 o1: [0], 260 o2: [0], 261 o3: [0], 262 }).AddNchw(i1, zero_sized, o3, layout).AddVariations("relaxed", quant8, "float16") 263 264 265 # TEST 8: TRANSPOSE_CONV2D_SAME, outputShape = [1, 4, 4, 1], pad = same, stride = 2, act = none 266 i8 = Input("op1", "TENSOR_FLOAT32", "{1, 2, 2, 1}") # input 0 267 w8 = Parameter("op2", "TENSOR_FLOAT32", "{1, 1, 1, 1}", [2]) # weight 268 b8 = Parameter("op3", "TENSOR_FLOAT32", "{1}", [0]) # bias 269 s8 = Int32Vector("shape", [1, 4, 4, 1]) # output shape 270 o8 = Output("op4", "TENSOR_FLOAT32", "{1, 4, 4, 1}") # output 271 Model().Operation("TRANSPOSE_CONV_2D", i8, w8, b8, s8, 1, 2, 2, 0, layout).To(o8) 272 273 # Additional data type 274 quant8 = DataTypeConverter().Identify({ 275 i8: ("TENSOR_QUANT8_ASYMM", 0.5, 100), 276 w8: ("TENSOR_QUANT8_ASYMM", 0.5, 128), 277 b8: ("TENSOR_INT32", 0.25, 0), 278 o8: ("TENSOR_QUANT8_ASYMM", 16.0, 0) 279 }) 280 281 Example({ 282 i8: [1, 2, 3, 4], 283 o8: [2, 0, 4, 0, 0, 0, 0, 0, 6, 0, 8, 0, 0, 0, 0, 0] 284 }).AddNchw(i8, o8, s8, layout).AddVariations("relaxed", quant8, "float16").AddInput(w8, b8) 285