Значительно отличающаяся производительность квантования при преобразовании тензорного потока в обученные керасом модели DenseNet - PullRequest
0 голосов
/ 29 октября 2018

У меня есть две модели, которые я обучил, используя Keras. Обе модели используют одну и ту же архитектуру (реализация DenseNet169 из пакета keras_applications.densenet), однако каждая из них имеет разное количество целевых классов (80 в одном случае, 200 в другом случае).

  • Преобразование обеих моделей в формат .pb работает просто отлично (идентичная производительность в выводе). Я использую утилиту keras_to_tensorflow, найденную на https://github.com/amir-abdi/keras_to_tensorflow

  • Преобразование обеих моделей в формат .tflite с использованием TOCO работает очень хорошо (опять же, одинаковая производительность в выводе).

  • Преобразование модели класса 80 в .tflite с использованием квантования в TOCO работает достаточно хорошо (снижение точности 3% до 1%).

  • Преобразование модели класса 200 в .tflite с использованием квантования в TOCO сходит с рельсов (~ 30% падения в топ-3 точности).

Я использую командную строку, идентичную TOCO для обеих моделей:

toco --graph_def_file frozen_graph.pb \ --output_file quantized_graph.tflite \ --inference_type FLOAT \ --inference_input_type FLOAT \ --output_format TFLITE \ --input_arrays input_1 \ --output_arrays output_node0 \ --quantize True

Моя версия tenorflow - 1.11.0 (установлена ​​через pip на MacOS Mojave, хотя я также пробовал ту же команду / среду на машине Ubuntu, которую я использую для обучения с идентичными результатами).

Я в полной растерянности относительно того, почему точность вывода так сильно влияет на одну модель, а не на другую. Это относится ко многим различным тренингам одних и тех же двух комбинаций архитектуры / целевого класса. Мне кажется, что я что-то упускаю, но я сбит с толку.

1 Ответ

0 голосов
/ 30 октября 2018

Предполагалось, что это всего лишь небольшой подлый комментарий, так как я не уверен, может ли это помочь, но потом стало так долго, что я решил сделать ответ ...


Мое дикое предположение состоит в том, что снижение точности может быть вызвано дисперсией выходных данных вашей сети. После квантования (кстати, тензорный поток использует квантование с фиксированной точкой ), вы играете только с 256 точками (8 бит) вместо полного плотного диапазона float32.

В большинстве блогов по всему Интернету утверждается, что основное предположение Квантование состоит в том, что веса и активации имеют тенденцию находиться в небольшом диапазоне значений. Тем не менее, существует неявное предположение, о котором меньше говорится в блогах и литературе: активации сети в одной выборке должны быть прилично распределены по квантованному диапазону .

Рассмотрим следующий сценарий, где предположение имеет место (гистограмма активаций на одной выборке на конкретном слое, а вертикальные линии - это точки квантования): enter image description here

Теперь рассмотрим сценарий, в котором второе предположение не соответствует действительности , но первое допущение может все еще удерживать место (синий цвет - это общее распределение значений, серый цвет - для данного образца, вертикальный полоски - это точки квантования):

enter image description here

В первом сценарии распределение для данной выборки хорошо покрыто (с большим количеством количественных точек). Во втором только 2 кванта. Подобное может случиться и с вашей сетью: возможно, для 80 классов у него все еще достаточно точек квантования, чтобы различать, но с 200 классами нам может не хватить ...

Эй, но это не влияет на MobileNet с 1000 классами и даже MobileNetV2, что является остаточным?

Вот почему я назвал это "дикой догадкой". Возможно, MobileNet и MobileNetV2 не имеют такой большой дисперсии выходного сигнала, как DenseNet. Первые имеют только один вход на каждом слое (который уже нормализован BN), в то время как DenseNet имеет соединения повсюду, поэтому он может иметь большую дисперсию, а также чувствительность к небольшим изменениям, и BN может не сильно помочь.


Теперь попробуйте этот контрольный список:

  • Вручную собирайте статистику активации для моделей 80 и 200 на TensorFlow , не только для выходов, но и для внутренних слоев. Сфокусированы ли значения в одной области или они широко распространены?
  • Посмотрите, хорошо ли распространяются активации одним входом модели TensorFlow , или у нас могут быть некоторые проблемы с концентрацией в одном месте?
  • Самое главное : посмотрите, какие выходы у модели Quantized TF-Lite ? Если есть проблемы с дисперсией, как описано выше, то здесь она проявит себя больше всего.

PS: Пожалуйста, поделитесь своими результатами, я думаю, что многие будут заинтересованы в устранении проблем квантования:)

...