Создание и тестирование простой модели с нуля с помощью Python Code, Tensorflow и Google Colab.

3 минуты машинного обучения

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

Другие эпизоды:

Зачем читать эту статью?

В этой статье будет показано, как использовать Google Colab для практической и функциональной реализации наших собственных моделей Deep Learning. Затем мы увидим, как импортировать уже существующий набор данных в нашу рабочую область. Мы реализуем 2D-модель сверточной нейронной сети для бинарной классификации наших изображений. Как только модель будет построена и обучена, мы проверим нашу модель с новыми изображениями.

Google Colab: почему?

Colaboratory, или сокращенно Colab, — это продукт Google Research. Colab позволяет любому писать и выполнять произвольный код Python через браузер и особенно хорошо подходит для машинного обучения, анализа данных и обучения. С технической точки зрения, Colab — это размещенная на хостинге служба Jupyter для ноутбуков, для использования которой не требуется настройка, но при этом предоставляется бесплатный доступ к вычислительным ресурсам, включая графические процессоры. Узнайте больше по этой ссылке.

Выбор среды выполнения в Google Colab

При разработке собственного кода или использовании общего кода не забудьте выбрать нужный аппаратный ускоритель на панели инструментов в разделе «Среда выполнения». В этом примере, поскольку это модель, основанная на сверточных сетях, лучше использовать мощность графических процессоров, свободно доступных на платформе. Подводя итог, наша модель нейронной сети имеет большое количество параметров, которые необходимо определить с помощью алгоритма оптимизации, чтобы минимизировать желаемую функцию потерь. Этот процесс включает в себя прямое распространение и обратное распространение, повторяющиеся для каждого пакета данных для каждой эпохи обучения. Таким образом, этот процесс включает в себя большое количество простых математических операций. GPU с:

  • Большое количество ядер
  • Тысячи одновременных аппаратных потоков

позволяют нам выполнять обучение и вывод нашей модели намного быстрее.

Сверточный классификатор

Анализ изображений может выполняться с помощью различных моделей глубокого обучения и нейронных сетей, однако Cонволюционные сети становятся почти обязательным инструментом для этого типа анализа из-за их эффективности. Подводя итог, можно сказать, что применение серии фильтров переменного размера позволяет извлекать информацию и функции из самих изображений. Первые слои будут извлекать наиболее общие функции, чем глубже слои, тем больше конкретных. Этот подход позволяет одновременно работать с несколькими обучаемыми параметрами модели, значительно меньшими, чем это необходимо для анализа изображений с помощью нейронной сети, основанной исключительно на Dense Layers. Для получения дополнительной информации, пожалуйста, обратитесь к этой статье.

Код

Начнем с импорта нашего набора данных:

Давайте импортируем наш набор данных. Он содержит изображения собак и кошки, что позволит нам обучить наш классификатор. Мы загружаем набор данных прямо из Google API, а затем разархивируем его по нужному пути. Мы определяем структуру наших каталогов, определяя их пути. Мы определяем два отдельных каталога для данных обучения и проверки, каждый из которых, в свою очередь, делится на две папки: собаки и кошки. Эта структура может показаться сложной, но она становится особенно сложной, потому что она легко взаимодействует с синтаксисом Tensorflow. Итак, давайте посмотрим, сколько данных у нас есть.

Давайте возьмем модель нейронной сети, аналогичную той, что описана на предыдущем изображении. В данном случае, учитывая простоту модели, мы работаем с Sequential API Keras. Это позволяет нам создать нейронную сеть, просто последовательно определяя список различных слоев, как мы можем догадаться из самого названия. Используемые слои являются частью стандартных, реализованных в Tensorflow/Keras.

  • Conv2D: 2D сверточный слой
  • MaxPooling2D: максимальное объединение двухмерных пространственных данных.
  • Flatten: сглаживает ввод
  • Плотный: регулярный плотносвязный слой NN.

model.summary()отображает сводку нашей модели, показывая имя, тип, форму вывода и обучаемые параметры количество каждого слоя.

Перед обучением модель должна быть скомпилирована. Для этого урока я выбрал Адама в качестве оптимизатора с фиксированной скоростью обучения. Однако эту модель можно значительно улучшить, оптимизировав структуру и настроив все основные и дополнительные гиперпараметры. Мы собираемся оценить только точность в качестве основного показателя для оценки производительности модели. Однако точность можно сочетать с другими показателями, такими как показатель f-бета, для более надежной оценки качества модели.

Используемая структура каталогов позволяет использовать метод ImageDataGenerator и flow_from_directory. Первый позволяет применить масштабирование и дополнение данных к исходным изображениям. Для этого анализа мы применяем масштабирование, вращение, сдвиг, сдвиг, масштабирование и отражение к тренировочным изображениям. Вы можете заметить, что к тестовым данным не применяется увеличение данных. Метод flow_from_directory автоматически загружает все изображения в подкаталогах, содержащихся в указанном пути, помечая изображения после имени папки. Нам просто нужно указать основной путь, размер пакета, модель классификации и целевой размер изображений.

Наконец, мы можем обучить модель, сохранив обучающие данные в объекте истории. Обратите внимание, что у нас есть 2000 обучающих изображений и 1000 тестовых изображений с размером пакета 20: у нас будет 100 шагов на эпоху для тренировочного набора и 50 шагов для эпоха для проверочного набора. Давайте обучим сеть на небольшое количество эпох (50) и посмотрим на результаты.

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

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

Выводы

Надеюсь, вам понравится содержание этой статьи. Напоминаю, что вы можете найти исходный код здесь и полный репозиторий на GitHub и YouTube.
До следующего раза,
Марко