Классификация изображений с использованием CNN

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

В этой статье мы реализуем модель глубокого обучения с использованием набора данных CIFAR-10. Набор данных обычно используется в Deep Learning для тестирования моделей классификации изображений. В нем 60 000 цветных изображений, состоящих из 10 различных классов. Размер изображения 32x32, набор данных содержит 50 000 обучающих изображений и 10 000 тестовых изображений. Здесь можно найти набор данных CIFAR-10.

Импорт данных

Для моделей глубокого обучения требуется машина с высокой вычислительной мощностью. Обычно для этого рекомендуется использовать онлайн-графические процессоры, такие как Kaggle или Google Collaboratory. Реализовал проект в Google Collaboratory. Для проекта мы будем использовать библиотеку TensorFlow и matplotlib. Поскольку набор данных используется глобально, его можно напрямую импортировать из модуля keras библиотеки TensorFlow.

import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import cifar10 

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

Первым шагом любого проекта машинного обучения, глубокого обучения или науки о данных является предварительная обработка данных. Мы будем определять имена классов, по которым распределяется набор данных. Существует 10 различных классов цветных изображений размером 32x32. После того, как мы установили имя класса. Нам нужно нормализовать изображение, чтобы наша модель могла тренироваться быстрее. Диапазон пикселей цветного изображения 0–255. Мы разделим каждый пиксель изображения на 255, чтобы диапазон пикселей находился в пределах от 0 до 1. Фактически, мы разделим его на 255.0, так как это операция с плавающей запятой. Для модели мы будем использовать сверточные нейронные сети (CNN).

# setting class names
class_names=[‘airplane’,’automobile’,’bird’,’cat’,’deer’,’dog’,’frog’,’horse’,’ship’,’truck’]
x_train=x_train/255.0
x_train.shape
x_test=x_test/255.0
x_test.shape

На выходе shape мы видим 4 значения, например. (50000,32,32,3). Эти 4 значения следующие: первое значение, то есть (50 000/10 000), показывает количество изображений. Второе и третье значения показывают размер изображения, то есть высоту и ширину изображения. Здесь размер изображения 32х32. Четвертое значение показывает «3», что означает формат RGB, поскольку используемые нами изображения являются цветными.

Построение модели CNN

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

При создании модели нейронной сети обычно используются два API: Sequential API и Functional API. Последовательный API позволяет нам создавать уровень модели и добавлять его в последовательный класс. Недостатком последовательного API является то, что мы не можем использовать его для создания модели, в которой мы хотим использовать несколько источников ввода и получать выходные данные в другом месте. Чтобы преодолеть этот недостаток, мы используем функциональный API. Используя Функциональный API, мы можем создать модель с несколькими входами и выходами. Хотя в большинстве случаев используется Sequential API. Мы будем использовать Sequential API для нашей модели CNN.

cifar10_model=tf.keras.models.Sequential()
# First Layer
cifar10_model.add(tf.keras.layers.Conv2D(filters=32,kernel_size=3, padding=”same”, activation=”relu”, input_shape=[32,32,3]))

Мы используем сверточную нейронную сеть, поэтому мы будем использовать сверточный слой. Чаще всего используется слой Conv2D. Conv2D означает, что свертка выполняется по 2 осям. Он расширяет свертку до трех слоев: красного, зеленого и синего. Другой тип сверточного слоя - Conv1D. Conv1D обычно используется для текстов, Conv2D обычно используется для изображений. Я думаю, что большинство читателей будет знать, что такое свертка и как это сделать, тем не менее, это видео поможет понять, как свертка работает в CNN.

Параметры слоев Conv2D

Первый параметр - «фильтры». Номер. Значение фильтров показывает количество фильтров, из которых будет учиться модель CNN и сверточный слой. Из каждого такого фильтра сверточный слой узнает что-то об изображении, например оттенок, границу, форму / функцию. Значение параметров должно быть в степени 2.

Второй параметр - «размер ядра». Ядро означает фильтр, который будет перемещаться по изображению и извлекать элементы детали с помощью скалярного произведения. Размер ядра означает размер (высота x ширина) этого фильтра. Значение размера ядра, если обычно нечетное число, например 3,5,7 .. и т. Д. Здесь мы использовали размер ядра 3, что означает, что размер фильтра составляет 3 x 3.

Следующий параметр - «отступы». Есть два типа заполнения: SAME и VALID. В VALID padding на границе изображения нет заполнения нулями. Таким образом, когда происходит свертка, происходит потеря данных, так как некоторые функции не могут быть свернуты. В ОДНОМ заполнении есть слой нулей, заполненный по всей границе изображения, поэтому нет потери данных. Более того, размер вывода изображения после свертки такой же, как и на входе изображения. Вышеупомянутое является причиной номенклатуры этого заполнения как ЖЕ. Так как на начальных слоях мы не можем потерять данные, мы использовали ТО ЖЕ заполнение.

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

Есть 4 известные функции активации:

  1. ) Сигмовидная функция: диапазон значений от 0 до 1. График представляет собой крутой график, поэтому даже небольшое изменение может принести большую разницу. Он в основном используется для двоичной классификации, так как разграничение может быть легко выполнено как значение выше или ниже 0,5.

2.) Функция TanH: это сокращение от Tangent Hyperbolic function. Это производная функция сигмовидной функции. Математика, лежащая в основе этих функций активации, выходит за рамки этой статьи, поэтому я бы не стал вдаваться в подробности. Диапазон значений от -1 до 1.

3.) Функция ReLu: это сокращение от Rectified Linear Unit. Это самая известная активация глубокого обучения. Он известен тем, что его легче вычислить, поскольку математическая функция проще и проще, чем другие функции активации.

4.) Функция SoftMax: функция SoftMax является более понятной формой сигмовидной функции. Используется для мультиклассовой классификации. Функция вычисляет вероятности определенного класса в функции. Таким образом, диапазон выходных значений функции составляет от 0 до 1. Основное различие между сигмоидной функцией и функцией SoftMax состоит в том, что сигмовидная функция может использоваться для двоичной классификации, в то время как функция SoftMax также может использоваться для многоклассовой классификации.

Уровень объединения

#MaxPoolingLayer
cifar10_model.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2, padding=’valid’))

Слой объединения используется для уменьшения размера изображения вместе с сохранением важных параметров в роли. Таким образом, это помогает сократить объем вычислений в модели. При выполнении свертки сверточный слой сохраняет информацию о точном положении объекта. А значит, и не очень важные детали тоже расположены идеально. В результате возникает проблема, заключающаяся в том, что даже небольшое изменение пикселя или функции может привести к значительному изменению вывода модели. Используя Max Pooling, мы сужаем объем, и из всех функций принимаются во внимание только самые важные функции. Таким образом, вышеупомянутая проблема решена. Объединение осуществляется двумя способами: средний пул или максимальный пул. Обычно используется максимальный пул.

В режиме «Средний пул» берется среднее значение из размера пула. В Max Pooling берется максимальное значение из размера пула. Концепция будет очищена от изображений выше и ниже.

Размер пула означает размер фильтра, из которого будет взято максимальное значение. Размер пула здесь 2 означает, что будет использоваться пул 2x2, и в этом пуле 2x2 будет выводиться среднее / максимальное значение. Пул будет пересекать изображение. Он будет двигаться в соответствии со значением шагов.

Шаги означают, сколько прыжков сделает размер пула. Если шаг равен 1, пул 2x2 будет постепенно перемещаться в правильном направлении от одного столбца к другому. Я использовал шаг 2, что означает, что размер пула будет сдвигаться на две колонки за раз. Изображения, которые я использовал ранее, чтобы объяснить максимальный пул и средний пул, имеют размер пула 2 и шаг = 2.

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

Последние слои

# Flattening Layer
cifar10_model.add(tf.keras.layers.Flatten())

Слой выравнивания добавляется после стопки сверточных слоев и слоев объединения. Слой выравнивания преобразует вектор трехмерного изображения в 1d. Потому что после стопки слоев, упомянутой ранее, добавляется последний полностью связанный плотный слой. Теперь плотный слой требует, чтобы данные передавались в одномерном измерении, поэтому сглаживающий слой является квинтэссенцией.

После выравнивания слоя остается плотный слой. Плотный слой - это полностью связанный слой, который передает все выходные данные от предыдущего функционирования всем нейронам. Плотный слой имеет вес W, смещение B и активацию, которая передается каждому элементу. Говоря наглядно, он соединяет все точки. Этот слой использует все функции, извлеченные ранее, и выполняет работу по обучению модели. Указанные единицы показывают количество нейронов, которое будет использовать модель.

# Droput Layer
cifar10_model.add(Dropout(0.2))
# Adding the first fully connected layer
cifar10_model.add(tf.keras.layers.Dense(units= 128,activation='relu’))

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

Выходной слой

На выходе слой использует количество единиц в соответствии с количеством классов в наборе данных. Здесь мы используем 10, так как есть 10 единиц. В выводе мы используем активацию SOFTMAX, поскольку она дает вероятности каждого класса.

При составлении модели необходимо учитывать функцию потерь. Обычно используются две функции потерь: разреженная категориальная кросс-энтропия (scce) и категориальная кросс-энтропия (cce). Разреженная категориальная кросс-энтропия (scce) используется, когда классы являются взаимоисключающими, классы полностью различны, тогда это используется. Категориальная кросс-энтропия используется, когда этикетка или деталь могут иметь несколько классов. В нашем сценарии классы полностью различны, поэтому мы используем разреженную категориальную кросс-энтропию.

Мы будем использовать обычно используемый Adam Optimizer. Адам - ​​это сокращение от «Метод адаптивной скорости обучения». Этот оптимизатор использует начальную часть градиента для адаптации к скорости обучения. Адам теперь используется вместо стохастического градиентного спуска, который используется в ML, потому что он может обновлять веса после каждой итерации.

Окончательный результат после небольшой игры с эпохами был:

Используя модель, я смог получить точность 78%. Итак, в этой статье мы рассмотрим работу над проектом Deep Learning с помощью Google Collaboratory. Мы знаем о параметрах, используемых на сверточном уровне и уровне пула сверточной нейронной сети. После извлечения функций в CNN нам понадобится плотный слой и выпадение, чтобы реализовать эти функции при распознавании изображений. Наконец, мы немного поговорим о функциях потерь и оптимизаторе Адама.

Вы можете найти полный код в моем репозитории git: https://github.com/aaryaab/CIFAR-10-Image-Classification.

Не стесняйтесь связаться со мной по адресу: https://www.linkedin.com/in/aarya-brahmane-4b6986128/

Ссылки: найти и построить несколько интересных графиков можно по адресу: https://www.mathsisfun.com/data/function-grapher.php#functions

Графические изображения сделаны мной на Power Point.

Удачного глубокого обучения!

Мир!!