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