Извините за то, что я не знаком с tenorflow, поэтому я не могу дать вам код, но, возможно, мой опыт с квантованием модели кафе может иметь смысл.
Если я вас правильно понимаю, выиметь модель тензорного потока (float32), которую вы хотите квантовать в int8 и сохранить в numpy.array
.
Во-первых, вы должны прочитать все веса для каждого слоя, который может быть списком питонов или numpy.array
или что-то еще, это не имеет значения.
Тогда алгоритм квантования существенно повлияет на точность, вы должны выбрать лучший для вашей модели.Однако эти алгоритмы имеют одно и то же ядро - масштаб.Все, что вам нужно сделать, это масштабировать все веса до -127 до 127 (int8), как слой scale
без bias
, и записать коэффициент масштабирования.
Meanwile, если вы хотите реализовать его наПЛИС, данные тоже должны быть цианированы.Здесь у нас есть новая проблема - результатом int8 * int8 является int16, что является очевидным переполнением.
Чтобы решить эту проблему, мы создаем новый параметр - shift - для сдвига результата int16 обратно в int8,Обратите внимание, что параметр shift
не будет постоянным 8, предположим, что у нас 0 * 0 = 0, нам вообще не нужно сдвигать результат.
Последний вопрос, над которым мы должны подумать, заключается в том, чтоесли сеть слишком глубокая, результат слоя может быть переполнен из-за некоторых необоснованных scale
параметров, поэтому мы не можем напрямую квантовать каждый отдельный слой, не думая о других слоях.если вы хотите деквантовать int8 до float32, просто используйте последний параметр масштабирования (конечного результата), чтобы сделать несколько mul / div (зависит от того, как вы определяете scale
).
Это основной алгоритм квантования, другие, такие как tf.quantization
, могут иметь более высокую точность.Теперь у нас есть квантованная модель, вы можете сохранить ее во все, что захотите, это не тяжелая работа.
PS Почему NumPy?bin-файл лучше всего подходит для FPGA, не так ли?
И есть ли у вас какие-то идеи по поводу реализации softmax на FPGA?Я запутался в этом ...