quantize
- calibrate_method(‘EXTREME’,‘MEAN’,‘KLD’)
- 若calibrate method为mean
- calculate_op_statistic_info
- self._cal_quantize_statistic_tensor()
代码架构
- 用户喂进经过预处理的.npy文件,data_set.py处理,calibrate 求极值,save _max,_min.npy文件
- calibration 后得到outputs_min_max, ngamma_min_max, normalized_min_max, 校准weights和bias
- 校准后的min_max_values和quantization method调入cal_scale_zp函数
- (以下为方法一input函数)
- q_precision: int8(-128~127), uint8(0 ~255), int16(-2** 8,2**8)
- scale=(rmax-rmin)/(qmax-qmin)
- initial_zero_pint=qmin-rmin/scale
- out_scale,out_zp =1/scale,nudged_zero_point (float32,float32)
- update self.out_scale_zp, self.out_scale
- conv函数method分为symmetric与非symetric,其他计算方法大致相同
- 若为pooing层,method为max时scale和zp不做优化,若method为avg,do scale, do shift and using lut
- 若为concat层,原本将所有input_scale取最小值后变换操作得到output_scale
- (以下为方法一input函数)
- 在for循环外部,通过不断更新input_scale_zp来传参 (input_scale_zp.update(self.top_[0] : {‘scale’:out_scale,‘zp’:out_zp})),下一个op调用时,传入input_scale_zp[self.bottom_[0]:。。。]