def test_conf2d_depth(): # TF Lite depthwise convolution weights = np.arange(9).reshape([3, 3]) weights = np.repeat(weights, 2).reshape([1, 3, 3, 2]) filt = Conv2DFilterDim(3, 3, 2, 1).impose_order(["in_c", "h", "w", "out_c"]) stride = StrideDim(1) pad = PadDim(0) dilation = DilationDim(1) params = Conv2DParameters("test", filt=filt, stride=stride, padding=pad, dilation=dilation, groups=1, multiplier=2, tf_depthwise=True, in_dims_hint=[['c', 'h', 'w']], out_dims_hint=[['c', 'h', 'w']]) input_ = np.arange(16).reshape([1, 4, 4]) in_dims = Dim.named(c=1, h=4, w=4).impose_order(['c', 'h', 'w']) out_dims = params.get_output_size([in_dims]) output1 = conv2d(params, in_dims, out_dims[0], input_, weights, None) assert np.array_equal(output1, [[[258, 294], [402, 438]], [[258, 294], [402, 438]]]) output2 = conv2d(params, in_dims, out_dims[0], input_, weights, None, allow_faster=False) assert np.array_equal(output1, output2)
def test_conf2d_q2(caplog): caplog.set_level(logging.INFO) weights_q = QType(16, 1, True) weights = weights_q.quantize(np.full([1, 1, 2, 2], 1.0)) filt = Conv2DFilterDim(2, 2, 1, 1) stride = StrideDim(1) pad = PadDim.valid() dilation = DilationDim(1) params = Conv2DParameters("test", filt=filt, stride=stride, padding=pad, dilation=dilation, in_dims_hint=[['c', 'h', 'w']], out_dims_hint=[['c', 'h', 'w']]) in_q = QType(16, 0, True) calc_q = QType(weights_q.bits + in_q.bits, weights_q.q + in_q.q, True) qrec = FilterQuantizationRecord(in_qs=[in_q], out_qs=[in_q], weights_q=weights_q, acc_q=calc_q, calc_q=calc_q) input_ = in_q.quantize(np.full([1, 2, 2], 1.0)) in_dims = Dim.named(c=1, h=2, w=2).impose_order(['c', 'h', 'w']) out_dims = params.get_output_size([in_dims]) output_ = conv2d(params, in_dims, out_dims[0], input_, weights, None, qrec=qrec) output_ = in_q.dequantize(output_) assert np.array_equal(output_, [[[4.]]])
def test_conf2d_normal(): weights = np.arange(9).reshape([1, 1, 3, 3]) filt = Conv2DFilterDim(3, 3, 1, 1) stride = StrideDim(1) pad = PadDim(0) dilation = DilationDim(1) params = Conv2DParameters("test", filt=filt, stride=stride, padding=pad, dilation=dilation, in_dims_hint=[['c', 'h', 'w']], out_dims_hint=[['c', 'h', 'w']]) input_ = np.arange(16).reshape([1, 4, 4]) in_dims = Dim.named(c=1, h=4, w=4).impose_order(['c', 'h', 'w']) out_dims = params.get_output_size([in_dims]) details = {} output_ = conv2d(params, in_dims, out_dims[0], input_, weights, None, details=details) # assert details['max_acc'] == 438.0 and details['min_acc'] == 258.0 assert np.array_equal(output_, [[[258, 294], [402, 438]]])
def test_conf2d_depth_q(): calc_q = QType(32, 9, True) biases_q = acc_q = out_q = QType(16, 4, True) weights_q = QType(16, 4, True) in_q = QType(16, 5, True) # TF Lite depthwise convolution biases = np.full([2], 0.5) qbiases = biases_q.quantize(biases) weights = np.full([3, 3], 0.5) weights = np.repeat(weights, 2).reshape([1, 3, 3, 2]) qweights = weights_q.quantize(weights) filt = Conv2DFilterDim(3, 3, 2, 1).impose_order(["in_c", "h", "w", "out_c"]) stride = StrideDim(1) pad = PadDim(0) dilation = DilationDim(1) params = Conv2DParameters("test", filt=filt, stride=stride, padding=pad, dilation=dilation, groups=1, multiplier=2, tf_depthwise=True, in_dims_hint=[['c', 'h', 'w']], out_dims_hint=[['c', 'h', 'w']]) qrec = FilterQuantizationRecord(in_qs=[in_q], out_qs=[out_q], weights_q=weights_q, biases_q=biases_q, acc_q=acc_q, calc_q=calc_q) input_ = np.full([1, 4, 4], 2) qinput_ = in_q.quantize(input_) in_dims = Dim.named(c=1, h=4, w=4).impose_order(['c', 'h', 'w']) out_dims = params.get_output_size([in_dims]) output_ = conv2d(params, in_dims, out_dims[0], input_, weights, biases) qoutput_ = conv2d(params, in_dims, out_dims[0], qinput_, qweights, qbiases, qrec=qrec) dqoutput_ = out_q.dequantize(qoutput_) assert np.array_equal(output_, dqoutput_)
def test_conf2d_pad_dilate(): weights = np.arange(9).reshape([1, 1, 3, 3]) filt = Conv2DFilterDim(3, 3, 1, 1) stride = StrideDim(1) pad = PadDim.same() dilation = DilationDim(2) params = Conv2DParameters("test", filt=filt, stride=stride, padding=pad, dilation=dilation, in_dims_hint=[['c', 'h', 'w']], out_dims_hint=[['c', 'h', 'w']]) input_ = np.arange(16).reshape([1, 4, 4]) in_dims = Dim.named(c=1, h=4, w=4).impose_order(['c', 'h', 'w']) out_dims = params.get_output_size([in_dims]) output_ = conv2d(params, in_dims, out_dims[0], input_, weights, None, None) assert np.array_equal(output_, [[[266., 206.], [98., 66.]]])
def test_conf2d_pad(): weights = np.arange(9).reshape([1, 1, 3, 3]) filt = Conv2DFilterDim(3, 3, 1, 1) stride = StrideDim(1) pad = PadDim.same() dilation = DilationDim(1) params = Conv2DParameters("test", filt=filt, stride=stride, padding=pad, dilation=dilation, in_dims_hint=[['c', 'h', 'w']], out_dims_hint=[['c', 'h', 'w']]) input_ = np.arange(16).reshape([1, 4, 4]) in_dims = Dim.named(c=1, h=4, w=4).impose_order(['c', 'h', 'w']) out_dims = params.get_output_size([in_dims]) output_ = conv2d(params, in_dims, out_dims[0], input_, weights, None) assert np.array_equal(output_, [[[73, 121, 154, 103], [171, 258, 294, 186],\ [279, 402, 438, 270], [139, 187, 202, 113]]])
def test_conf2d_2_in_2_out_c(): weights = np.arange(4).reshape([1, 2, 2]) weights = np.append(weights, weights, axis=0) weights = np.append(weights, weights, axis=0) weights = weights.reshape([2, 2, 2, 2]) filt = Conv2DFilterDim(2, 2, 2, 2) stride = StrideDim(1) pad = PadDim.valid() dilation = DilationDim(1) params = Conv2DParameters("test", filt=filt, stride=stride, padding=pad, dilation=dilation, in_dims_hint=[['c', 'h', 'w']], out_dims_hint=[['c', 'h', 'w']]) input_ = np.arange(9).reshape([1, 3, 3]) input_ = np.append(input_, input_, axis=0) in_dims = Dim.named(c=2, h=3, w=3).impose_order(['c', 'h', 'w']) out_dims = params.get_output_size([in_dims]) output_ = conv2d(params, in_dims, out_dims[0], input_, weights, None, None) assert np.array_equal(output_, [[[38., 50.], [74., 86.]],\ [[38., 50.], [74., 86.]]])