Добро пожаловать в NeeshAi!

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

Проблема идентификации изображения:

"Что это за изображение?" Вы задаете этот вопрос другу, и он тут же отвечает, но в прошлом казалось, что это недоступно компьютерам. До тех пор, пока несколько лет назад глубокое обучение и использование графических процессоров (GPU) не изменили наш взгляд на эту проблему.

Функция тегов «Google Photos» больше никому не известна. Я не скажу, что это всегда получается правильно, но в большинстве случаев я думаю, что это довольно хорошо. И что особенно увлекательно, так это то, что когда он ошибается, ошибки, которые он совершает, в основном кажутся людям удивительными.

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

Подробный блокнот с необходимым кодом находится по следующей ссылке: Репозиторий Github

Случай 1. Предварительно обученная модель VGG

После обучения любую сеть можно использовать для вывода или прогнозирования данных, на которых она обучена. Вывод оказывается гораздо менее ресурсоемким процессом. Для VGG-16 (предварительно обученная модель, которую мы собираемся использовать) и других архитектур любой может загрузить и использовать предварительно обученные модели без необходимости овладевать навыками, необходимыми для настройки и обучения этого набора моделей. Загрузка предварительно обученных моделей и использование модели для прогнозирования относительно просты. Итак, первая модель, которую мы собираемся использовать, — это предварительно обученная модель.

VGG16 — это модель сверточной нейронной сети, предложенная К. Симоняном и А. Зиссерманом в статье Очень глубокие сверточные сети для крупномасштабного распознавания изображений (см. здесь). VGG обычно относится к глубокой сверточной сети для распознавания объектов, разработанной и обученной известной Группой визуальной геометрии Оксфорда (VGG), которая добилась очень хороших результатов в наборе данных ImageNet. Точность модели достигает 92,7 % в тестах Top-5 в ImageNet, который представляет собой набор данных из более чем 14 миллионов изображений, принадлежащих к 1000 классам. ВГГ-19 — еще одна такая структура с 19 слоями (ВГГ-16 с 16 слоями).

Вот как выглядит структура VGG-16. Вы можете наблюдать все 16 слоев.

В этой части мы будем использовать предварительно обученный вес VGG-16 для построения модели идентификации изображения. Итак, приступим.

Шаг 1:

Как обычно, импортируйте все необходимые модули.

Шаг 2:

Поскольку мы используем предварительно обученные веса, все, что нам нужно сделать, это импортировать вес и определить архитектуру (т.е. сверточный слой, слой Maxpool и полносвязный слой).

Что можно делать с моделью:

Иногда вы хотите заморозить вес первых нескольких слоев, чтобы они оставались неизменными на протяжении всего процесса тонкой настройки. Скажем, вы хотите заморозить веса для первых 10 слоев. Это можно сделать, установив layer.trainable=False для первых 10 слоев.

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

Шаг 3.

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

Шаг 4:

Теперь мы скомпилируем модель, используя Stochastic Gradient Descent Optimizer и Categorical_Cross-Entropy в качестве функции потерь. Вы можете поиграть со скоростью обучения, если хотите.

Шаг 5.

Мы отформатируем вывод, чтобы его можно было четко прочитать; мы ограничимся 10 лучшими предположениями.

Теперь, наконец, мы визуализируем результат.

Это ввод, который мы дали для предсказания.

И вот как выглядит наш прогноз:

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

Что ж, результат кажется довольно захватывающим, но я знаю, что вы недовольны. Использование чужой модели для предсказания чего-либо не представляет большого труда, верно? И, вероятно, это не та причина, по которой вы пришли читать этот блог. Реализация сверточной нейронной сети означает реализацию, и ничего больше!

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

Случай 2. Модель обучения на MNIST

Набор данных, который мы собираемся использовать для построения модели, — это набор данных MNIST. База данных MNIST является одним из широко используемых наборов данных для игрушечной реализации CNN и среди людей, которые хотят попробовать изучить методы идентификации и методы распознавания образов. Он состоит из рукописных цифр, имеет обучающий набор из 60 000 примеров и тестовый набор из 10 000 примеров. Это подмножество более крупного набора, доступного в NIST. Цифры были нормализованы по размеру и центрированы на изображении фиксированного размера.

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

Шаг 1:

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

Вы правильно догадались — это импорт необходимых модулей. ☺

Шаг 2:

Следующим шагом является чтение загруженного набора данных и разделение его на обучающий и тестовый наборы. Если вы загрузили данные вручную, вы можете использовать приведенный ниже код, иначе вы можете напрямую импортировать данные, используя модуль mnist, доступный в tensorflow или keras, предоставленный (1).

Шаг 3.

Сейчас; что у нас есть набор данных. Мы собираемся изменить его форму, чтобы он воспринимался как действительный ввод в заполнителе тензорного потока. В то же время мы нормализуем X_train и X_test (если бы мы не масштабировали наши входные векторы обучения, диапазоны наших распределений значений признаков, вероятно, были бы разными для каждого признака, и, таким образом, скорость обучения вызвала бы исправления в каждом измерении, которые будут отличаться друг от друга, что в конечном итоге затруднит поиск оптимальных параметров и, таким образом, в конечном итоге повлияет на производительность). Также мы преобразуем Y_train и Y_test в манекены в одну горячую кодировку категориальной переменной в двоичную форму (вместо 1 столбца теперь будет 10 столбцов со строками, заполненными 1, соответствующими правильной категории, и остальными нулями).

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

Шаг 4:

У нас есть 60000 изображений для обучения. Это довольно большой набор данных. Не рекомендуется вводить входные данные один за другим из-за времени, которое это займет. Чтобы решить эту проблему, мы создаем пакеты изображений. Допустим, мы определили размер пакета как 50 — это означает, что за один раз мы загрузим в модель 50 изображений, и это обеспечит более быстрое вычисление массива и, следовательно, более быстрое время обучения. Когда вы будете импортировать набор данных с помощью библиотеки MNIST, вам не нужно явно определять следующую пакетную функцию, т.е. вы можете использовать:

партия = mnist.train.next_batch(50)

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

Шаг 5.

Далее мы определим переменные веса и смещения, а также слои свертки и максимального пула.

Шаг 6:

Мы создадим заполнитель для ввода и метки, а также преобразуем изображение в 4D-тензор.

Шаг 7.

Используя функции, определенные на шаге 5, мы создадим переменные веса и смещения для всех слоев, т. е. сверточный слой, слой максимального пула и полносвязный слой.

Шаг 8:

Теперь наступает самая важная часть создания сети. Мы должны определить функцию потерь и функцию оптимизатора. Путем оптимизации функции потерь модель начинает обучение (обучение). Для этого мы будем использовать cross_entropy в качестве функции потерь и AdamOptimizer в качестве оптимизатора.

Шаг 9:

Теперь мы все готовы идти. Мы будем обучать модель в течение 1000 эпох и печатать результат (точность обучения) через каждые 100 шагов.

Шаг 10:

Сейчас; что модель обучена. Мы протестируем модель на наборе данных 10000 и посмотрим результат как для обучения, так и для тестирования.

Точность 96% на тренировочном наборе можно считать хорошей. Если вы хотите, вы можете поиграть с другими параметрами, чтобы увидеть, улучшится ли этот результат.

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

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

Подпишитесь на NeeshAi, чтобы узнать больше о науке о данных, управлении продуктами и многом другом в области технологий!

Ссылки:

  1. https://machinelearningmastery.com/handwriting-digit-recognition-using-convolutional-neural-networks-python-keras/
  2. https://www.cs.toronto.edu/~frossard/post/vgg16/
  3. http://blog.stephenwolfram.com/2015/05/wolfram-language-artificial-intelligence-the-image-identification-project/