Вступление:

Сверточные нейронные сети - это глубокие нейронные сети, которые обычно разрабатывались для обработки наборов данных изображений. Когда мы имеем дело с пикселями, обобщение становится чрезвычайно трудным, если мы передаем все пиксели напрямую в полностью подключенную сеть после выравнивания. Представьте, что если у нас есть набор данных с изображениями, каждое размером (360 * 360) в R.G.B, то у нас будет 388800 пикселей (входной вектор) одного изображения для подачи на многослойный персептрон. Следовательно, необходимо выделить особенности, избавиться от зашумленных пикселей и выполнить уменьшение размерности.

Работа с изображениями напрямую с помощью обычных нейронных сетей

Для лучшего понимания давайте начнем обучение нашей модели без сверток. Здесь мы будем использовать набор данных fashion-mnist, который состоит из 70 000 изображений статей Zalando. Каждое изображение размером 28 * 28 в серой шкале связано с 10 различными классами.

Обратитесь: https://github.com/zalandoresearch/fashion-mnist

Загрузим данные с помощью следующих команд:

Теперь давайте последовательно определим слои нашей модели. Первый слой - это входной слой, где мы сглаживаем матрицу (28 * 28) в вектор. Далее идет первый скрытый слой, который состоит из 521 нейрона. И в выходном слое мы указали 10 нейронов, так как у нас есть 10 разных классов. Используемая активация - «Softmax» для выполнения мультиклассовой классификации. Более того, мы можем использовать model.summary (), чтобы получить подробную архитектуру в целом.

Далее мы компилируем модель, задавая разные параметры. Здесь мы использовали «Адам» в качестве оптимизатора, «sparse_categorical_crossentropy» в качестве функции потерь и «точность» в качестве метрики проверки. Наконец, мы выполняем «model.fit», чтобы начать тренировку с 10 эпох.

Здесь набор данных состоял из изображений размером 28 * 28 в оттенках серого. Следовательно, обучение было довольно быстрым и привело к приличной точности обучения, однако точность проверки была намного ниже, чем при обучении на 0,87.

Недостатки

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

Что такое сверточная нейронная сеть?

ConvNets похожи на типичные нейронные сети, они также выполняют несколько скалярных произведений (w1 * x1, w2 * x2…), имеют те же функции активации (ReLu, Sigmoid и т. Д.) Для добавления нелинейности и аналогичных функций потерь. ввод - это изображение, а не вектор пикселей. Более того, в CNN мы видим все изображение через окно, которое скользит по изображению, а не сразу. Следовательно, ConvNets улавливает сложные зависимости в пикселях изображения и лучше подходит для них из-за меньшего количества и наличия только важных функций. Фильтры также содержат дополнительное измерение «глубина», которое придает им блочную структуру.

Различные слои в ConvNets

  1. Сверточный слой
  2. Уровень объединения
  3. Полностью связанный слой

1. Сверточный слой:

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

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

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

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

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

  1. Максимальное объединение
    В максимальном объединении выбирается наибольшее значение в области карты объектов, на которую распространяется фильтр. Таким образом, на выходе получаются наиболее заметные особенности. Максимальное объединение является наиболее широко используемым, поскольку оно также удаляет зашумленные данные из изображения.

2. Объединение среднего значения
В объединении среднего значения берется среднее значение всех значений, присутствующих в диапазоне карты функций, охваченном фильтром. Максимальный пул отбрасывает данные, тогда как при среднем пуле все сохраняется, следовательно, сохраняется локализация.

3. Полностью связанный слой

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

Реализация в TensorFlow

Здесь мы определили последовательную модель, в которой есть 3 уровня свертки, за которыми следует объединение, наконец, соединение с полностью подключенной сетью с одним скрытым слоем. «Keras.layers.Conv2D» используется для определения уровня свертки, в котором первый параметр (16) определяет количество фильтров, второй параметр определяет размер фильтра (3,3), третий параметр является функцией активации, а последний параметр input_shape определяет размер входного изображения. «Keras.layer.Maxpooling2D» используется для определения слоя Maxpooling с размером фильтра.

Наконец, мы компилируем модель и выполняем model.fit, указывая эпохи. Подпоследовательно мы можем использовать обратный вызов модели, чтобы остановить ее обучение, если метрика проверки пересекает определенный желаемый порог, который можно использовать для регуляризации модели и предотвращения чрезмерной подгонки.