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