Exemple #1
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):
        in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")
        if params.transpose_in:
            in_tensors = [(np.transpose(in_tensor, params.transpose_in[idx])
                           if params.transpose_in[idx] else in_tensor)
                          for idx, in_tensor in enumerate(in_tensors)]
        if isinstance(params, Broadcastable) and params.is_broadcasted:
            in_tensors = params.broadcast_inputs(in_tensors)
        func = PIECEWISE_OPS[params.__class__]
        op = func['op']
        if func['is_mult']:
            qrec.set_scale(in_idx=(0, 1), out_idx=0)
            i1 = in_tensors[0].astype(np.int32)
            i2 = in_tensors[1].astype(np.int32)
            out_tensor = qrec.scale_mul_biases_q.apply_scales(
                op(i1, i2, np.int32))
        else:
            # larger scale should be scaled
            qrec.set_add_scale()
            if qrec.scaled_idx:
                i1 = in_tensors[0].astype(np.int32)
                i2 = qrec.scale_in_mul_biases_q.apply_scales(in_tensors[1])
            else:
                i1 = qrec.scale_in_mul_biases_q.apply_scales(in_tensors[0])
                i2 = in_tensors[1].astype(np.int32)

            out_tensor = qrec.scale_mul_biases_q.apply_scales(op(i1, i2, None))
        if params.transpose_out:
            out_tensor = np.transpose(out_tensor, params.transpose_out[0])
        return qrec.get_outputs(params, [qrec.out_qs[0].clip(out_tensor)],
                                ktype="symmetric")
Exemple #2
0
    def execute(cls, params,
                in_tensors,
                qrec: QuantizationRecordBase,
                **kwargs):
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]
        qrec.set_scale()
        neg_in = at_norm(in_tensor * leak_mult_gen_factor_q7(params), 7)
        in_tensor = in_tensor * (in_tensor > 0) + neg_in * (in_tensor < 0)

        in_tensor = qrec.scale_mul_biases_q.apply_scales(in_tensor)
        if qrec.out_qs[0] != qrec.in_qs[0]:
            return qrec.get_outputs(params, [qrec.out_qs[0].reduce_from(in_tensor, qrec.in_qs[0])], ktype="symmetric")
        return qrec.get_outputs(params, [in_tensor], ktype="symmetric")
Exemple #3
0
    def sum_execute(cls, params, in_tensors, qrec: QuantizationRecordBase):
        in_tensor = qrec.prepare_inputs(params, in_tensors,
                                        ktype="symmetric")[0]
        if isinstance(qrec, MultQuantizationRecord):
            qrec.set_scale(in_idx=0, out_idx=0)
        res = np.sum(in_tensor,
                     axis=tuple(params.axis),
                     keepdims=params.keep_dims,
                     dtype=np.int32)

        if isinstance(qrec, MultQuantizationRecord):
            res = qrec.scale_mul_biases_q.apply_scales(res)
        return qrec.get_outputs(params, [res], ktype="symmetric")
Exemple #4
0
    def max_execute(cls, params,
                    in_tensors,
                    qrec: QuantizationRecordBase,
                    details=None):

        del details

        # Prepare the quantization levels
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]
        if isinstance(qrec, MultQuantizationRecord):
            qrec.set_scale(in_idx=0, out_idx=0)
        return qrec.get_outputs(params, [np.max(in_tensor,
                                                axis=tuple(params.axis),
                                                keepdims=params.keep_dims)], ktype="symmetric")
Exemple #5
0
 def execute(cls, params,
             in_tensors,
             qrec: QuantizationRecordBase,
             **kwargs):
     in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]
     qrec.set_scale()
     relu_lb = qrec.in_qs[0].quantize(params.lower_bound)
     in_tensor = np.maximum(in_tensor, relu_lb)
     if params.upper_bound is not None and not NNForceRelu.FORCE_RELU:
         relu_ub = qrec.in_qs[0].quantize(params.upper_bound)
         in_tensor = np.minimum(in_tensor, relu_ub)
     in_tensor = qrec.scale_mul_biases_q.apply_scales(in_tensor)
     if qrec.out_qs[0] != qrec.in_qs[0]:
         return qrec.get_outputs(params, [qrec.out_qs[0].reduce_from(in_tensor, qrec.in_qs[0])], ktype="symmetric")
     return qrec.get_outputs(params, [in_tensor], ktype="symmetric")
Exemple #6
0
def max_global_pool(params,
                    in_tensors,
                    qrec: QuantizationRecordBase,
                    details=None):

    del details

    # Prepare the quantization levels
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]
    if isinstance(qrec, MultQuantizationRecord):
        qrec.set_scale(in_idx=0, out_idx=0)
    in_dims = params.in_dims[0]
    return qrec.get_outputs(params, [
        np.max(in_tensor,
               axis=(in_dims.get_order_idx('w'), in_dims.get_order_idx('h')),
               keepdims=True)
    ],
                            ktype="symmetric")
Exemple #7
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):
        in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")
        func = PIECEWISE_OPS[params.__class__]
        op = func['op']
        if func['is_mult']:
            qrec.set_scale(in_idx=(0, 1), out_idx=0)
            i1 = in_tensors[0].astype(np.int32)
            i2 = in_tensors[1].astype(np.int32)
            res = qrec.scale_mul_biases_q.apply_scales(op(i1, i2, np.int32))
        else:
            # larger scale should be scaled
            qrec.set_add_scale()
            if qrec.scaled_idx:
                i1 = in_tensors[0].astype(np.int32)
                i2 = qrec.scale_in_mul_biases_q.apply_scales(in_tensors[1])
            else:
                i1 = qrec.scale_in_mul_biases_q.apply_scales(in_tensors[0])
                i2 = in_tensors[1].astype(np.int32)

            res = qrec.scale_mul_biases_q.apply_scales(op(i1, i2, None))
        return qrec.get_outputs(params, [qrec.out_qs[0].clip(res)],
                                ktype="symmetric")