Объяснение вывода TensorflowLite официальный учебник

#python #tensorflow-lite #inference #quantization

#питон #тензорный поток-облегченный #вывод #квантование

Вопрос:

Я использую приведенный ниже код github для вывода на моем Raspberry Pi.Мне удалось успешно запустить свои модели на моем Pi , даже несмотря на то , что одна из них предсказывает действительно плохие результаты по сравнению с неквантованной версией . Я изучил код и библиотеки, но мне трудно понять 2 небольшие части, которые, по моему мнению, влияют на производительность моей модели.

Официальный код Tensorflow для выполнения вывода на моделях tflite. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/examples/python/label_image.py

Эти две части таковы :

 parser.add_argument(
      '--input_mean',
      default=127.5, type=float,
      help='input_mean')
  parser.add_argument(
      '--input_std',
      default=127.5, type=float,
      help='input standard deviation')
 

Я не могу понять, как эти 2 аргумента влияют на вывод и почему они используются в этой команде. Каким образом значения аргументов должны изменять входные данные?

 if floating_model:
    input_data = (np.float32(input_data) - args.input_mean) / args.input_std
 

Во — вторых , когда модель имеет тип np.float32 ? Разве квантованные модели не являются int-типом?

 floating_model = input_details[0]['dtype'] == np.float32
 

Ответ №1:

как эти 2 аргумента влияют на вывод

Применение среднего и стандартного отклонения называется «Нормализацией». Эта операция необходима для изменения диапазона входных данных. В вашем случае входные данные имеют диапазон 0 … 255, в то время как модель с плавающей запятой требует диапазона -1 … 1. Это зависит только от модели архитектуры модели и данных, используемых для обучения. Смотрите подробности с примером о параметрах нормализации

Разве квантованные модели не являются int-типом?

На самом деле существуют различные виды квантования (например, Float16), но наиболее часто ассоциируемыми типами с квантованием являются int8 / uint8. Модель, представленная в вашем примере, — FP. Проверьте входы-выходы вашей модели с помощью приложения, подобного https://netron.app /

В конце концов: похоже, что изменения input_mean / input_std довольно старые, и для меня они не соответствуют модели, которую они предлагают использовать. В соответствии с моделью вам не нужна нормализация, модель принимает в качестве входных данных значения с плавающей запятой в диапазоне 0 …255.

Комментарии:

1. Спасибо за ответ . Итак, в случае, если моя модель принимает значения в диапазоне 0-255, не могу ли я добиться нормализации, просто разделив входные данные на 255 в диапазоне [0,1]? Как я могу узнать, должен ли мой ввод находиться в диапазоне [-1,1] или [0,1]. Методом проб и ошибок они оба, кажется, работают, разве это не странно

2. Если для входной модели требуется диапазон 0 … 255, вам действительно нужно быть уверенным, что ваши входные данные находятся в этом диапазоне: если у вас есть FP с диапазоном 0 ..1, вы должны нормализовать его в диапазон (умножить на 255); если у вас есть целые числа 0 … 255, все в порядке, просто приведите к типу; если вы уже в FP в диапазоне 0 ..255 нормализация не требуется. Входную информацию можно найти в метаданных модели (как в нашем случае) или в дополнительных документах к модели, нормализация обычно является частью предварительной обработки.

3. Что касается [-1, 1] и [0, 1]: все зависит от того, какая модель требуется и как она работает с более чем диапазонными значениями. Пример: ввод модели [-1, 1], изображение подачи [0, 1] — см. Как Уменьшение динамического диапазона, ваши изображения будут «ярче» в сети. Он может быть нечувствительным к нему. Если значения model [0, 1] и feed [-1, 1] могут быть ограничены, но все равно доступно 50% информации. Это может работать, но с резким снижением точности.