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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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)
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")
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")
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")
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)
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")
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")
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)
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")
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")
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")
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)
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")
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")
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)
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")
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")
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")
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")