Это отличные вопросы; позвольте мне попытаться дать хорошие ответы также для читателей, менее знакомых с TF-Slim.
1. Предварительная обработка не выполняется модулем, потому что это много о ваших данных, а не столько об архитектуре CNN в модуле. Модуль обрабатывает только преобразование входных значений из канонического диапазона [0,1] в то, что ожидает предварительно обученная CNN в модуле.
Длительное обоснование: предварительная обработка изображений для обучения CNN обычно состоит из декодирования входного JPEG (или чего-то еще), выбора из него (достаточно большого) случайного кадрирования, случайных фотометрических и геометрических преобразований (искажение цветов, поворот влево / вправо и т. Д.), и изменение размера до обычного размера изображения для пакета вводимых обучающих данных. Модули TensorFlow Hub, реализующие https://tensorflow.org/hub/common_signatures/images, оставляют все это в ваш код вокруг модуля.
Основная причина заключается в том, что подходящие случайные преобразования во многом зависят от вашей обучающей задачи, но не от архитектуры или обученных весов состояний модуля. Например, искажения цвета помогут, если вы классифицируете автомобили против собак, но, вероятно, не для спелых и незрелых бананов и т. Д.
Кроме того, пакет изображений, которые были декодированы, но еще не обрезаны / изменены, трудно представить в виде одного тензора (если вы не сделаете его одномерным тензором закодированных строк, но это создает другие проблемы, такие как разрыв обратного распространения в модуль входы для расширенного использования).
Итог: код Python, использующий модуль, должен выполнять предварительную обработку изображения (кроме значений масштабирования), например, как в https://github.com/tensorflow/hub/blob/master/examples/image_retraining/retrain.py
Тонкие методы предварительной обработки объединяют случайные преобразования, специфичные для набора данных (настроенные для Imagenet!), С масштабированием до диапазона значений архитектуры (что модуль Hub делает за вас). Это означает, что они здесь не применимы напрямую.
2. Действительно, вспомогательные головки отсутствуют в первоначальном наборе модулей, опубликованном в tfhub.dev/google / ..., но я ожидаю, что они все равно будут нормально работать при повторном обучении.
Дополнительные сведения: не все архитектуры имеют вспомогательные головки, и даже в исходной статье говорится, что их влияние было «относительно незначительным» [Szegedy & al. 2015; §5]. Использование модуля вектора функций изображения для задачи настраиваемой классификации обременило бы код потребителя модуля проверкой вспомогательных функций и, если они были обнаружены, помещением вспомогательных логитов и терма потерь на первое место.
Это осложнение, казалось, не помогло, но дальнейшие эксперименты могут опровергнуть эту оценку. (Пожалуйста, поделитесь в проблеме на GitHub, если вы о ней знаете.)
На данный момент это единственный способ добавить голову в https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1 - это скопировать и вставить несколько строк из https://github.com/tensorflow/models/blob/master/research/slim/nets/inception_v3.py (найдите «Вспомогательные логиты головы») и примените это к " Inception_V3 / Mixed_6e ", который вы видели.
3. Вы не спрашивали, но: Для обучения документация модуля рекомендует передавать hub.Module (..., tags = {"train"}), иначе пакетная норма работает в режиме вывода (и выпадения, если в модуле были).
Надеюсь, это объясняет, как и почему.
Арно (от разработчиков TensorFlow Hub)
person
arnoegw
schedule
25.04.2018