Перенос обучения с помощью keras

Согласно Википедии, существует более 300 чистых пород собак. Кроме того, есть смешанные породы. Определение породы собак, если вы не являетесь экспертом, может быть проблемой.

Вот несколько фотографий пород собак. Угадайте, какой из них:

Целью этого проекта является создание приложения, позволяющего классифицировать породу собак путем загрузки изображения собаки.

Первой попыткой будет использование классификатора CNN. Вот модель keras, в которой мы складываем сверточный и максимальный слои:

Точность этой модели CNN по используемому набору данных составляет менее 5%. Чтобы получить более высокую точность набора данных, необходимо увеличить глубину модели, тем самым увеличив время обучения. Компромиссом было бы использование уже обученной модели в качестве входа в нашу модель — задача, известная как перенос обучения.

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

Здесь я использовал вычисленную версию InceptionV3, сохраненную в виде файла .npz. Поэтому его необходимо загрузить. Его вывод будет вводом нашей предыдущей модели. В результате модель будет выглядеть следующим образом:

Приведенную выше модель можно упростить, используя только слой GloabalAveraglePooling2D layer. Без использования модели CNN на выходе начальной модели v3 мы достигаем точности 80%.

Если эта модель развернута так, как она есть в среде сервера флажков, скорее всего, появится эта ошибка: Tensor("something) is not an element of this graph. Причина в том, что каждый запрос фляги будет генерировать новый сеанс tensorflow, который создаст свой собственный график, отличный от того, который загружен с моделью. Чтобы исправить эту ошибку, одним из вариантов может быть запуск flask без потоков.

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

Для интерфейса я использовал angular. Вот как это выглядит:

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

Если на загруженном изображении нет ни человека, ни изображения собаки, возвращается ошибка. Так что, если вы ищете породу собак для дома, вы можете попробовать проект :).

Это сквозное приложение позволяет классифицировать собак, что было первоначальной целью проекта. Полный код доступен здесь.

Если вам понравился этот пост, не забудьте поставить пару аплодисментов.

Жизнь — бесконечная дорога, кодирование — бесконечная петля на время!