示例#1
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)
示例#2
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")
示例#3
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)
示例#4
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")
示例#5
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")
示例#6
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")
示例#7
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")
示例#8
0
文件: resize.py 项目: brupa9/gap_sdk
    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")
示例#9
0
文件: resize.py 项目: brupa9/gap_sdk
    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")
示例#10
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")
示例#11
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")
示例#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_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")
示例#14
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)
示例#15
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")
示例#16
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)
示例#17
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")
示例#18
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")
示例#19
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")
示例#20
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")
示例#21
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")
示例#22
0
 def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
             **kwargs):
     if qrec is None:
         qrec = Float32QuantizationRecord()
     old_err = np.seterr(over='raise')
     in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]
     in_tensor = softmax_func(in_tensor)
     np.seterr(**old_err)
     return qrec.get_outputs(params, [in_tensor], ktype="float32")
def transpose(params,
              in_tensors,
              qrec: QuantizationRecordBase,
              details=None):
    del details
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]
    if params.transpose_in:
        in_tensor = np.transpose(in_tensor, params.transpose_in)
    return qrec.get_outputs(params, [in_tensor], ktype="symmetric")
示例#24
0
def piecewise(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    if qrec is None:
        qrec = Float32QuantizationRecord()
    func = PIECEWISE_OPS[params.__class__]
    op = func['op']
    in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="float32")
    return qrec.get_outputs(params, [op(in_tensors[0], in_tensors[1])],
                            ktype="float32")
示例#25
0
def sigmoid(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    if isinstance(qrec, MultQuantizationRecord):
        raise NotImplementedError()
    in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")[0]
    dqinput = qrec.in_qs[0].dequantize(in_tensor)
    return qrec.get_outputs(
        params, [qrec.out_qs[0].quantize(1 / (1 + np.exp(-dqinput)))],
        ktype="symmetric")
示例#26
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]
        output = in_tensor * (
            in_tensor > 0) + in_tensor * params.leak_factor * (in_tensor < 0)
        return qrec.get_outputs(params, [output], ktype="float32")
示例#27
0
    def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
                **kwargs):
        details = kwargs.get('details')
        # qrec is set by default to Float32QuantizationRecord if None
        if qrec is None or isinstance(qrec, Float32QuantizationRecord):
            qrec = Float32ScalableFilterQuantizationRecord()

        in_dims = params.in_dims[0]
        out_dims = params.out_dims[0]
        weights = qrec.prepare_weights(params,
                                       params.get_uncompressed_weights(),
                                       ktype="float32")
        in_tensor = qrec.prepare_inputs(params, in_tensors, ktype="float32")[0]

        if details is not None:
            details['min_acc'] = float("Infinity")
            details['max_acc'] = float("-Infinity")

        if params.has_bias:
            biases = qrec.prepare_biases(params,
                                         params.get_uncompressed_biases(),
                                         params.get_uncompressed_weights(),
                                         ktype="float32")
            acc_tensor = np.ones(out_dims.shape, dtype=np.float32) * biases
        else:
            acc_tensor = np.zeros(out_dims.shape, dtype=np.float32)

        in_tensor = in_tensor.reshape((in_dims.size()))
        filt = params.filter.get_filter_dims()
        for out_c in range(out_dims.c):
            # Expand and normalize the accumulator

            w_slice = weights[filt.srange(out_c=out_c)].reshape(
                (in_dims.size()))

            res = np.dot(in_tensor, w_slice)

            if details is not None:
                details['min_acc'] = min(np.sum(res[res < 0]),
                                         details['min_acc'])
                details['max_acc'] = min(np.sum(res[res > 0]),
                                         details['max_acc'])

            acc_tensor[out_c] += res

            if details is not None:
                details['min_acc'] = min(np.min(acc_tensor[out_c]),
                                         details['min_acc'])
                details['max_acc'] = max(np.max(acc_tensor[out_c]),
                                         details['max_acc'])

        acc_tensor = qrec.apply_multiplicative_bias(params,
                                                    acc_tensor,
                                                    0,
                                                    ktype="float32")

        return qrec.get_outputs(params, [acc_tensor], ktype="float32")
示例#28
0
def matscale(params, in_tensors, qrec: QuantizationRecordBase, details=None):
    del details
    in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")
    LOG.debug("matscale input %s",
              ",".join([t.dtype.name for t in in_tensors]))
    if len(params.in_dims) == 3:
        output_tensor = matscale3(in_tensors, qrec)
    else:
        output_tensor = matscale2(in_tensors, qrec)
    return qrec.get_outputs(params, [output_tensor], ktype="symmetric")
示例#29
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,
            [np.minimum(np.maximum(in_tensor + params.offset, 0), 6) / 6],
            ktype="float32")
示例#30
0
 def execute(cls, params, in_tensors, qrec: QuantizationRecordBase,
             **kwargs):
     in_tensors = qrec.prepare_inputs(params, in_tensors, ktype="symmetric")
     LOG.debug("matscale input %s",
               ",".join([t.dtype.name for t in in_tensors]))
     if len(params.in_dims) == 3:
         output_tensor = cls.matscale3(in_tensors, qrec)
     else:
         output_tensor = cls.matscale2(in_tensors, qrec)
     return qrec.get_outputs(params, [output_tensor], ktype="symmetric")