Пример #1
0
def matscale(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="float32")
    if len(params.in_dims) == 3:
        return qrec.get_outputs(
            params, [in_tensors[0] * in_tensors[1] * in_tensors[2]],
            ktype="float32")
    return qrec.get_outputs(params, [in_tensors[0] * in_tensors[1]],
                            ktype="float32")
Пример #2
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        if qrec is None:
            qrec = Float32QuantizationRecord()
        in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="float32")
        if len(params.in_dims) == 3:
            return qrec.get_outputs(
                params, [in_tensors[0] * in_tensors[1] * in_tensors[2]],
                ktype="float32")
        return qrec.get_outputs(params, [in_tensors[0] * in_tensors[1]],
                                ktype="float32")
Пример #3
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")
Пример #4
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        if qrec is None:
            qrec = Float32QuantizationRecord()
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
        if params.upper_bound is None:
            return qrec.get_outputs(
                params, [np.maximum(in_tensor, params.lower_bound)],
                ktype="float32")
        return qrec.get_outputs(params, [
            np.minimum(np.maximum(in_tensor, params.lower_bound),
                       params.upper_bound)
        ],
                                ktype="float32")
Пример #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")
Пример #6
0
def resize_nearest_neighbor(params,
                            in_tensors,
                            qrec: QuantizationRecordBase,
                            details=None):
    del details
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]
    in_tensor = in_tensor.transpose(params.in_dims[0].transpose_to_order(
        ("h", "w", "c")))
    w_out = params.out_dims[0].w
    h_out = params.out_dims[0].h
    c_out = params.out_dims[0].c
    w_in = params.in_dims[0].w
    h_in = params.in_dims[0].h
    wstep = ((w_in - 1) << 16) // (w_out - 1)
    hstep = ((h_in - 1) << 16) // (h_out - 1)
    out_tensor = np.empty((h_out, w_out, c_out))
    for i in range(h_out):
        h_rounded = ((hstep * i) + (1 << (16 - 1))) >> 16
        for j in range(w_out):
            w_rounded = ((wstep * j) + (1 << (16 - 1))) >> 16
            out_tensor[i, j, :] = in_tensor[h_rounded, w_rounded, :]

    out_tensor = out_tensor.transpose(params.out_dims[0].transpose_from_order(
        ("h", "w", "c")))
    return qrec.get_outputs(params, [out_tensor], ktype="symmetric")
Пример #7
0
def av_global_pool(params,
                   in_tensors,
                   qrec: QuantizationRecordBase,
                   details=None):

    if isinstance(qrec, MultQuantizationRecord):
        return av_global_pool_mult(params, in_tensors, qrec, details=details)

    # Prepare the quantization levels
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]
    in_dims = params.in_dims[0]
    out_dims = params.out_dims[0]

    sum_by_chan = np.sum(in_tensor,
                         dtype=np.int32,
                         axis=(in_dims.get_order_idx('w'),
                               in_dims.get_order_idx('h')))

    norm = (np.array([31], dtype=np.int32) - gap_clb(sum_by_chan)).astype(
        np.int32)
    inv_wh = (1 << norm) // (in_dims.h * in_dims.w)
    out_tensor = at_norm((inv_wh * sum_by_chan), norm)
    return qrec.get_outputs(
        params, [qrec.out_qs[0].clip(out_tensor).reshape(out_dims.shape)],
        ktype="symmetric")
Пример #8
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        if qrec is None:
            qrec = Float32QuantizationRecord()
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
        in_tensor = in_tensor.transpose(params.in_dims[0].transpose_to_order(
            ("h", "w", "c")))
        w_out = params.out_dims[0].w
        h_out = params.out_dims[0].h
        c_out = params.out_dims[0].c
        w_in = params.in_dims[0].w
        h_in = params.in_dims[0].h
        wstep = (w_in - 1) / (w_out - 1)
        hstep = (h_in - 1) / (h_out - 1)
        out_tensor = np.empty((h_out, w_out, c_out))
        for i in range(h_out):
            h_rounded = int(round(hstep * i))
            for j in range(w_out):
                w_rounded = int(round(wstep * j))
                out_tensor[i, j, :] = in_tensor[h_rounded, w_rounded, :]

        out_tensor = out_tensor.transpose(
            params.out_dims[0].transpose_from_order(("h", "w", "c")))
        return qrec.get_outputs(params, [out_tensor], ktype="float32")
Пример #9
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        if qrec is None:
            qrec = Float32QuantizationRecord()
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
        in_tensor = in_tensor.transpose(params.in_dims[0].transpose_to_order(
            ("h", "w", "c")))
        w_out = params.out_dims[0].w
        h_out = params.out_dims[0].h
        c_out = params.out_dims[0].c
        w_in = params.in_dims[0].w
        h_in = params.in_dims[0].h
        wstep = (w_in - 1) / w_out
        hstep = (h_in - 1) / h_out
        out_tensor = np.empty((h_out, w_out, c_out))
        for i in range(h_out):
            y_l, y_h = math.floor(hstep * i), math.ceil(hstep * i)
            hc = (hstep * i) - y_l
            for j in range(w_out):
                x_l, x_h = math.floor(wstep * j), math.ceil(wstep * j)
                wc = (wstep * j) - x_l
                P1 = in_tensor[y_l, x_l, :]
                P2 = in_tensor[y_l, x_h, :]
                P3 = in_tensor[y_h, x_l, :]
                P4 = in_tensor[y_h, x_h, :]
                out_tensor[i, j, :] = P1 * (1 - wc) * (1 - hc) \
                    + P2 * wc * (1 - hc) \
                    + P3 * (1 - wc) * hc \
                    + P4 * wc * hc

        out_tensor = out_tensor.transpose(
            params.out_dims[0].transpose_from_order(("h", "w", "c")))
        return qrec.get_outputs(params, [out_tensor], ktype="float32")
Пример #10
0
 def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
             **kwargs):
     if qrec is None:
         qrec = Float32QuantizationRecord()
     details = kwargs.get('details')
     if details is not None:
         current_control = SymbolStats()
         Symbol.set_default_control(current_control)
         results = {}
     else:
         results = None
         current_control = None
     in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="float32")
     in_vars = {
         params.input_symbols[i]: in_tensor
         for i, in_tensor in enumerate(in_tensors)
     }
     out_vars = params.func_col(**in_vars,
                                calculate_ranges=current_control
                                is not None,
                                track_results=results)
     out_tensors = [
         out_vars[out_sym_name] for out_sym_name in params.output_symbols
     ]
     if current_control:
         details.update(current_control.stats)
         details['results'] = results
     return qrec.get_outputs(params, out_tensors, ktype="float32")
Пример #11
0
def expression(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    if qrec is None:
        qrec = Float32QuantizationRecord()
    in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="float32")
    return qrec.get_outputs(params,
                            params.execute(in_tensors, details=details),
                            ktype="float32")
Пример #12
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        qname = kwargs['qname']
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype=qname)[0]
        out_tensors = [in_tensor]
        return qrec.get_outputs(params, out_tensors, ktype=qname)
Пример #13
0
    def execute(cls, params,
                in_tensors,
                qrec: QuantizationRecordBase,
                **kwargs):

        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]

        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:
            relu_ub = qrec.in_qs[0].quantize(params.upper_bound)
            in_tensor = np.minimum(in_tensor, relu_ub)

        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")
Пример #14
0
def cast(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
    out_tensors = [in_tensor]
    return qrec.get_outputs(params, out_tensors, ktype="float32")
Пример #15
0
def softmax(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    np.seterr(over='raise')
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
    return qrec.get_outputs(params, [softmax_func(in_tensor)], ktype="float32")
Пример #16
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        qname = kwargs['qname']
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype=qname)[0]
        return qrec.get_outputs(params, [np.flip(in_tensor, axis=params.axis)],
                                ktype=qname)
Пример #17
0
def sigmoid(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
    return qrec.get_outputs(params, [1 / (1 + np.exp(-in_tensor))],
                            ktype="float32")
Пример #18
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")
Пример #19
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        qname = kwargs['qname']
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype=qname)[0]
        out_tensor = np.take(in_tensor, params.indices, axis=params.axis)
        return qrec.get_outputs(params, [out_tensor], ktype=qname)
Пример #20
0
def transpose(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
    if params.transpose_in:
        in_tensor = np.transpose(in_tensor, params.transpose_in[0])
    return qrec.get_outputs(params, [in_tensor], ktype="float32")
Пример #21
0
def strided_slice(params,
                  in_tensors,
                  qrec: QuantizationRecordBase,
                  details=None):
    del details
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]
    out_tensors = [params.numpy_slice(in_tensor)]
    return qrec.get_outputs(params, out_tensors, ktype="symmetric")
Пример #22
0
def leaky(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
    output = in_tensor * (in_tensor >
                          0) + in_tensor * params.leak_factor * (in_tensor < 0)
    return qrec.get_outputs(params, [output], ktype="float32")
Пример #23
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        qname = kwargs['qname']
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype=qname)[0]
        if params.transpose_in:
            in_tensor = np.transpose(in_tensor, params.transpose_in[0])
        return qrec.get_outputs(params, [in_tensor], ktype=qname)
Пример #24
0
def hsigmoid(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
    return qrec.get_outputs(
        params, [np.minimum(np.maximum(in_tensor + params.offset, 0), 6) / 6],
        ktype="float32")
Пример #25
0
 def execute_piecewise(cls, params, in_tensors,
                       qrec: QuantizationRecordBase, op, **kwargs):
     del kwargs
     if qrec is None:
         qrec = Float32QuantizationRecord()
     in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="float32")
     return qrec.get_outputs(params, [op(in_tensors[0], in_tensors[1])],
                             ktype="float32")
Пример #26
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        qname = kwargs['qname']
        params = typing_cast(StridedSliceParameters, params)
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype=qname)[0]
        out_tensors = [params.numpy_slice(in_tensor)]
        return qrec.get_outputs(params, out_tensors, ktype=qname)
Пример #27
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):

        if qrec is None:
            qrec = Float32QuantizationRecord()
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
        return qrec.get_outputs(params, [1 / (1 + np.exp(-in_tensor))],
                                ktype="float32")
Пример #28
0
def relu(params: ReluActivationParameters,
         in_tensors,
         qrec: QuantizationRecordBase,
         details=None):
    del details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
    if params.upper_bound is None:
        return qrec.get_outputs(params,
                                [np.maximum(in_tensor, params.lower_bound)],
                                ktype="float32")
    return qrec.get_outputs(params, [
        np.minimum(np.maximum(in_tensor, params.lower_bound),
                   params.upper_bound)
    ],
                            ktype="float32")
Пример #29
0
 def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
             **kwargs):
     if qrec is None:
         qrec = Float32QuantizationRecord()
     in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="float32")
     return qrec.get_outputs(params,
                             params.execute(in_tensors),
                             ktype="float32")
Пример #30
0
def constant_input(params,
                   in_tensors,
                   qrec: QuantizationRecordBase,
                   details=None):
    del in_tensors, details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    return qrec.get_outputs(params, [params.value], ktype="float32")