当前工作集中在移动端推理引擎的建设,目前主要在hexagon DSP上;使用自定义模型格式,目前仅支持tflite的转换,为了兼容其余平台,因此在自定义模型格式中使用的是tflite的min、max值,由于在实际计算过程中,需要的是scale和zero,因此需要使用min、max计算得到对应的scale、zero,在其中遇到一些困难,记录下来以便后续使用。
由min、max计算得到scale、zero,最重要的一点是调整min或max以使得zero能够被一个整数精确表达,主要是为了在zero padding中不引入量化误差,tflite的Nudge代码如下:
// Gymnastics with nudged zero point is to ensure that real zero maps to
// an integer, which is required for e.g. zero-padding in convolutional layers.
// Outputs nudged_min, nudged_max, nudged_scale.
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void Nudge(
const float min, const float max, const int quant_min, const int quant_max,
float* nudged_min, float* nudged_max, float* scale) {
const float quant_min_float = static_cast<float>(quant_min);
const float quant_max_float = static_cast<float>(quant_max);
*s