Я немного исследовал квантование в тензорном потоке и применил его для преобразования операций с плавающей запятой в квантовые операции.
В моем случае у меня все еще есть вход с плавающей точкой в сеть.Входные данные квантуется прямо перед вводом количественных операций.Tensorflow предпочитает сохранять значения с плавающей точкой как можно дольше, чтобы быть совместимым с операциями с плавающей точкой.Это также причина того, почему тензор потока сохраняет минимальный и максимальный диапазоны с плавающей запятой после того, как входные данные с плавающей запятой квантованы в 8-битный целочисленный формат.Минимальное и максимальное значения с плавающей запятой в результате квантования также являются входными данными для квантовых операций.
В вашем случае операция Quant_conv2d свертывается с входными данными:
- 8-битные данные без знакаквантизация формы
- 8-битные значения ядра без знака
Выходные данные:
- результат в виде 32 бит
- новые мин и максдиапазон в виде значений с плавающей запятой
Новые диапазоны с плавающей запятой вычисляются из диапазонов значений ядра и диапазонов входных данных с использованием функции QuantificationRangeForMultiplication, указанной в:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/quantization_utils.h
Как уже говорилось, выходные данные являются 32-битными с минимальными и максимальными значениями с плавающей запятой для преобразования в абсолютные значения и возможного преобразования 8-битного квантованного формата обратно в плавающее.
Надеюсь, это поможет понять алгоритмы квантования Tensorflow.