Значительно отличающаяся производительность квантования при преобразовании тензорного потока в обученные керасом модели DenseNet
У меня есть две модели, которые я тренировал, используя 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 ответ
Предполагалось, что это всего лишь небольшой подлый комментарий, так как я не уверен, может ли это помочь, но потом стало так долго, что я решил сделать ответ...
Мое предположение состоит в том, что снижение точности может быть вызвано дисперсией выходных данных вашей сети. После квантования (кстати, тензорный поток использует квантование с фиксированной точкой), вы играете только с 256
точки (8 бит) вместо полного плотного диапазона float32
,
В большинстве блогов по всему Интернету утверждается, что основное предположение о квантовании заключается в том, что веса и активизации имеют тенденцию лежать в небольшом диапазоне значений. Тем не менее, существует неявное предположение, о котором меньше говорят в блогах и литературе: активации сети в одной выборке должны быть прилично распределены по квантованному диапазону.
Рассмотрим следующий сценарий, где предположение имеет место (гистограмма активаций на одной выборке на конкретном слое, а вертикальные линии являются точками квантования):
Теперь рассмотрим сценарий, в котором второе предположение не соответствует действительности, но первое допущение все еще можетиметь место(синий цвет - это общее распределение значений, серый - для данной выборки, вертикальные полосы - это точки квантования):
В первом сценарии распределение для данного образца хорошо покрыто (с большим количеством количественных точек). Во втором только 2 кванта.Аналогичная вещь может произойти и с вашей сетью: возможно, для 80 классов у нее все еще достаточно точек квантования, чтобы различать, но с 200 классами нам может не хватить...
Эй, но это не влияет на MobileNet с 1000 классами и даже MobileNetV2, что является остаточным?
Вот почему я назвал это "дикой догадкой". Возможно, MobileNet и MobileNetV2 не имеют такой большой дисперсии выходного сигнала, как DenseNet. Первые имеют только один вход на каждом слое (который уже нормализован BN), в то время как DenseNet имеет соединения повсюду, так что он может иметь большую дисперсию, а также чувствительность к небольшим изменениям, и BN может не сильно помочь.
Теперь попробуйте этот контрольный список:
- Вручную собирайте статистику активации 80 и 200 моделей наTensorFlow, не только выходные данные, но и внутренние слои. Ориентированы ли ценности в одной области или они широко распространены?
- Посмотрите, хорошо ли распространяются активации одним входом модели TensorFlow, или у нас могут быть некоторые проблемы с концентрацией в одном месте?
- Самое главное: посмотрите, какие выходы у модели Quantized TF-Lite? Если есть проблемы с дисперсией, как описано выше, то здесь она проявит себя больше всего.
PS: пожалуйста, поделитесь своими результатами, я думаю, что многие будут заинтересованы в устранении проблем квантования:)