О проблеме:

Постановка задачи проста: мы должны подсчитать количество голов, присутствующих на изображении, это часть продолжающегося хакатона по Analytics Vidhya. Он уникален тем, что помимо обычной классификации изображений, это скорее регрессия изображения. Данные могут быть легко получены оттуда же. Самое приятное то, что вы можете проводить все исследования и обучение на Colab или Kaggle (создав свой собственный частный набор данных).

Исследование данных:

Давайте посмотрим на несколько изображений, чтобы лучше понять проблему, в основном каждое изображение показывает количество людей или «голов» на рисунке. Итак, вы получили основное представление о реализации задачи регрессии, но как?

Всего в наборе данных около 4 разных файлов, давайте рассмотрим их один за другим:

Итак, всего 8196 изображений, некоторые из которых относятся к обучению, а остальные - к тестированию. Интересно, можем ли мы использовать окончательный набор данных для подхода к обнаружению объектов, поскольку размеры указаны в приведенном ниже наборе box_train_dataset?

Ранний подход:

Я использовал ранний подход и построил архитектуру нейронной сети, объединив блоки lego CNN, которые помогли мне получить ранг 37, а затем 24, вы можете увидеть подход здесь, но сеть была очень переоборудованной, как показано ниже.

Но тут я вспомнил блог Андрея Карпаты и попробовал Transfer Learning, давайте туда нырнем. Теперь в большинстве задач CV набор данных часто находится между (5-40 тысяч) изображений, и очень сложно добиться приличной точности, чтобы спасти Transfer Learning.

«Чтобы добиться хороших результатов при обучении, вам нужно выбрать подходящую архитектуру для данных. Когда дело доходит до выбора, мой совет №1: Не будь героем. Я видел много людей, которые стремятся сойти с ума и проявить творческий подход, складывая блоки lego из набора инструментов нейронной сети в различные экзотические архитектуры, которые имеют для них смысл. Сильно сопротивляйтесь этому искушению на ранних этапах своего проекта. Я всегда советую людям просто найти наиболее подходящие статьи и скопировать их простейшую архитектуру, которая обеспечивает хорошую производительность. Например. если вы классифицируете изображения, не будьте героем и просто скопируйте и вставьте ResNet-50 для первого запуска. Позже вы можете сделать что-то более индивидуальное и превзойти это ». - Андрей Карпатий

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

Сеть, используемая для передачи обучения в начальной версии V3:

Прочтите Deep Dream

Давайте сначала узнаем немного о InceptionV3, прежде чем мы погрузимся в его использование в переносном обучении, не запутайтесь, если вы не получите эту часть, это просто для информации, у Inception было четыре версии, каждая из которых отличается от разное.

Глубокая сверточная архитектура Inception была представлена ​​как GoogLeNet в (Szegedy et al. 2015a), здесь она называется Inception-v1. Позже архитектура Inception была усовершенствована различными способами, в первую очередь введением пакетной нормализации (Иоффе и Сегеди, 2015 г.) (Inception-v2). Позже с помощью дополнительных идей факторизации в третьей итерации (Szegedy et al. 2015b), которая называется Inception-v3. Теперь давайте подробно рассмотрим архитектуру Inception-v3.

При глубине 42 уровня стоимость вычислений лишь примерно в 2,5 раза выше, чем у GoogLeNet [4], и намного эффективнее, чем у VGGNet [3]. Следующая ссылка предназначена для более глубокого понимания.

Предварительная обработка данных:

Я использовал Imagedatagenerator от keras для предварительной обработки данных, вы можете выполнять всевозможные преобразования данных на лету с помощью этого замечательного модуля. flow_from_directory - популярный выбор для большинства разработчиков, но я использовал flow_from_dataframe, это просто, и вот код, чтобы проиллюстрировать это:

Обратите внимание, что я использовал здесь «class_mode»: «other», поскольку проблема относится к регрессии, [«категориальный» используется, когда у нас есть данные мультикласса, и «двоичный», когда у нас есть данные двоичного класса]. Вы также можете использовать просто «поток», если у вас большой массив данных.

Обучение и проверка:

Мы начинаем с вызова Inceptionv3 в качестве экземпляра и загрузки модели inceptionv3 без верхнего слоя и сохранения слоев в модели как необучаемых.

Затем мы добавляем дополнительные слои и выравниваем выходной слой до одного измерения, активация устанавливается как «линейная», поскольку мы выполняем задачу регрессии:

Нейронная сеть без функции активации по сути является просто линейной регрессионной моделью.

Я не печатаю здесь всю модель, но распечатываю, чтобы посмотреть. Наконец, мы подбираем модель

Давайте посмотрим на потери, чтобы увидеть, насколько мы улучшились по сравнению с предыдущей моделью:

Анализ всего 10 эпох показывает хорошее улучшение по сравнению с предыдущей моделью, что указывает на то, что она не переоснащается. Надеюсь, когда мы будем запускать ее на других эпохах, мы не получим хоккейную клюшку, похожую на потерю. Полный код выполняется на Colab, поэтому вы также получите представление о том, как выполнять простые задачи DL на Colab.

Хлопайте, если статья вам все равно помогла :)