LeNet — одна из старейших моделей CNN, которая проложила путь к основанию сверточных нейронных сетей. С помощью этого руководства мы будем реализовывать специально реализованную архитектуру нейронной сети LeNet-5, которая будет классифицировать изображения из набора данных MNIST.

Что можно найти в этой статье

  • Введение в ключевые понятия, используемые в глубоком и машинном обучении.
  • Понимание компонентов, используемых для построения сверточной нейронной сети.
  • Подробное объяснение и реализация LeNet-5 с использованием Keras.

Модель CNN была представлена ​​в статье «Градиентное обучение, применяемое к распознаванию документов» в 1998 году Яном Лекуном, Леоном Ботту, Йошуа Бенжио и Патриком Хаффнером. Эти авторы были пионерами современного глубокого обучения и сыграли ключевую роль в области ИИ.

Краткий факт: модель изначально была разработана для чтения почтовых индексов, сортировки почты и других задач автоматической обработки почты.

Сверточные нейронные сети

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

  • ИНС (искусственные нейронные сети) помогают решать сложные задачи.
  • CNN (Сверточные нейронные сети) лучше всего подходят для решения проблем, связанных с компьютерным зрением.
  • RNN (рекуррентные нейронные сети) владеют обработкой естественного языка. Сверточные нейронные сети (CNN) — это

Сверточные нейронные сети (CNN) специально разработаны для задач обработки изображений, таких как компьютерное зрение, и широко используются благодаря их способности эффективно фиксировать пространственную информацию в изображениях. Напротив, традиционные искусственные нейронные сети (ИНС) плохо подходят для задач обработки изображений, поскольку они рассматривают каждый пиксель изображения как отдельный элемент и не учитывают пространственные отношения между соседними пикселями. Еще одна причина использования CNN — небольшое количество требуемых обучаемых параметров.

Ленет-5

Сеть leNet-5 состоит из семи слоев: трех сверточных слоев, двух слоев объединения и двух полносвязных слоев.

На изображении выше показана архитектура модели, представленная в исследовательской статье. Первый уровень — это входной уровень, который обычно не считается сетевым уровнем, поскольку на этом уровне информация не изучается. Входной слой предназначен для приема изображений 32x32, которые затем передаются на следующий уровень. Те, у кого есть опыт работы с набором данных MNIST, знают, что изображения имеют размеры 28 на 28 пикселей. Фотографии 28x28 дополнены, чтобы соответствовать спецификациям входного слоя для изображений MNIST.

Значения пикселей изображений в градациях серого, используемых в исследовательском отчете, были преобразованы от 0 до 255 до -0,1 до 1,175. Цель нормализации — гарантировать, что каждая партия изображений имеет среднее значение 0 и стандартное отклонение 1, что сокращает время обучения. В следующем примере классификации изображений с помощью LeNet-5 значения пикселей изображений будут нормализованы, чтобы принимать значения от 0 до 1.

Поскольку это модель CNN, в конструкции LeNet-5 широко используются сверточные слои и слои субдискретизации.

В исследовательской работе сверточные слои обозначаются как «Cx», а слои субдискретизации обозначаются как «Sx», где «x» представляет положение слоя в архитектуре. Fx используется для идентификации полносвязных слоев.

Первый слой представляет собой сверточный слой под названием «C1», который создает шесть карт объектов с размером ядра 5x5. Ядро/фильтр — это имя окна, которое содержит значения веса, которые используются, когда значения веса и входные значения объединяются вместе. Размер локального рецептивного поля каждого нейрона или единицы в сверточном слое также показан числом 5x5. Каждая из шести карт объектов, которые создает первый сверточный слой, состоит из 28x28 пикселей.

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

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

Реализация LeNet-5 TensorFlow

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

  • Keras: библиотека Keras с открытым исходным кодом, предоставляющая высокоуровневый интерфейс для построения и обучения нейронных сетей.
import keras
from keras.datasets import mnist
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dense, Flatten
from keras.models import Sequential

Затем набор данных MNIST импортируется с помощью пакета Keras. Библиотека Keras предоставляет набор легкодоступных наборов данных для машинного обучения. Чтобы продолжить глубокое обучение, мы должны разделить набор данных на тестовые, проверочные и обучающие наборы. Их краткие описания приведены ниже:

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

Проверочный набор данных. Во время обучения эта часть набора данных используется для оценки производительности сети на различных итерациях.

Тестовый набор данных. Эта часть набора данных используется для проверки производительности нашей сети после завершения этапа обучения.

Для реализации нашей модели интенсивность пикселей изображений должна быть стандартизирована от диапазона 0–255 до диапазона 0–1.

# Loading the dataset and perform splitting
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# Peforming reshaping operation
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)

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

Участок кода, указанный ниже, реализует реальную нейронную сеть LeNet-5. Чтобы построить модель, мы сначала должны назначить модель экземпляру tf.keras.Sequential. Sequrntial позволяет нам создавать линейный стек слоев. Это удобный способ создать модель нейронной сети, просто последовательно добавляя слои один за другим.

model = Sequential()
model.add(Conv2D(6, kernel_size=(5, 5), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16, kernel_size=(5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(120, activation='relu'))
model.add(Dense(84, activation='relu'))
model.add(Dense(10, activation='softmax'))

В следующей строке кода мы переходим к определению слоев модели.

Слой C1 определяется строкой «Conv2D(6, kernel_size=(5, 5), активация=’relu’, input_shape=(28, 28, 1))». Слой Conv2D выполняет операцию свертки входного тензора, используя набор обучаемых фильтров. Фильтры применяются к локальным областям входного тензора, а выход свертки представляет собой набор карт признаков, которые представляют наличие определенных признаков во входных данных. Остальные сверточные слои придерживаются того же определения слоя, что и C1, но с другими значениями аргументов.

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

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

  • Среднее объединение: это операция объединения, которая вычисляет среднее значение для исправлений карты объектов и использует его для создания карты объектов с уменьшенной выборкой (объединенной). Обычно он используется после сверточного слоя.

После этих слоев мы добавим сглаживающий слой. Сведение — это процесс в Keras, который преобразует многомерный тензор в одномерный тензор.

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

После операции сглаживания мы добавим скрытые слои (плотный слой). Плотный слой, также известный как полностью связанный слой, представляет собой тип слоя нейронной сети в Keras, где каждый нейрон в слое связан с каждым нейроном в предыдущем слое.

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

Количество классов в наборе данных MNIST равно количеству единиц в последнем плотном слое. Функция активации выходного слоя — это функция активации softmax.

  • Softmax: функция активации, используемая для получения распределения вероятностей набора целых чисел, содержащихся во входном векторе. Результатом функции активации softmax является вектор, значения которого представляют вероятность возникновения класса/события.
    Теперь мы можем скомпилировать и построить модель.

Теперь мы можем скомпилировать и построить модель.

model.compile(loss=keras.metrics.categorical_crossentropy,
 optimizer=keras.optimizers.Adam(), metrics=['accuracy'])

Через объект модели, который мы создали ранее, Keras предоставляет нам метод «компиляции». Функция компиляции позволяет нам построить модель, которую мы уже настроили в фоновом режиме, а также некоторые дополнительные функции, такие как функция потерь, оптимизатор и метрики.

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

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

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

model.fit(x_train, y_train, batch_size=128, 
epochs=20, verbose=1, validation_data=(x_test, y_test))

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

score = model.evaluate(x_test, y_test)
>> [0.04592850968674757, 0.9745]

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