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

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

Введение

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

Вот несколько классических нейронных сетей:

  1. LeNet - 5

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

2. AlexNet

AlexNet - это большая глубокая сверточная нейронная сеть, используемая для классификации 1,2 миллиона изображений с высоким разрешением в конкурсе ImageNet LSVRC-2010 на 1000 различных классов. Он использует функцию нелинейности ReLU. Сеть, имеющая 60 миллионов параметров и 650 000 нейронов, состояла из пяти сверточных слоев, за некоторыми из которых следовали уровни максимального объединения, и трех полностью связанных слоев с последним 1000-канальным softmax. Слои были разделены и обучены на нескольких графических процессорах. Для предотвращения переобучения использовался метод под названием выпадение.

3. VGG - 16

VGG-16 - это большая сверточная нейронная сеть с примерно 138 миллионами параметров. Цифра 16 в VGG16 относится к 16 слоям, имеющим веса. VGG16 имеет большое количество гиперпараметров, которые сосредоточены на наличии сверточных слоев фильтра 3x3 с шагом 1 и всегда используют те же отступы и слой maxpool фильтра 2x2 шага 2. Такое расположение сверточного слоя и слоя максимального пула соблюдается повсюду. вся архитектура. В итоге у него есть 2 полностью связанных слоя, за которыми следует softmax (функция нелинейности) для вывода.

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

Слой свертки (CONV)

Этот уровень является фундаментальным строительным блоком архитектуры CNN. Он берет входное изображение и использует фильтр, который приводит к активации. Скалярное произведение выполняется между фильтром и входом.

Скалярное произведение между входом и фильтром выполняется следующим образом:

Для определения границ по горизонтали и вертикали используются следующие фильтры:

В свертке есть 2 недостатка

  1. Размер изображения уменьшается.
  2. Пиксели в углу используются меньше пикселей в центре. Отсюда и потеря информации.

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

Типы заполнения:

  1. Допустимое заполнение: не подразумевает никакого заполнения вообще. Входное изображение остается без изменений.
  2. То же заполнение: в этом случае мы добавляем слои заполнения «p», чтобы выходное изображение имело те же размеры, что и входное изображение.

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

Мы используем слои объединения, чтобы уменьшить размеры изображения, что поможет ускорить вычисления. Объединение независимо изменяет размер каждого канала входного вектора признаков, применяя определенную функцию к окрестностям размером F X F с шагом S. Здесь F - размер фильтра, а S - шаг.

Типы объединения:

Максимальное количество пулов

Выбирает максимальное значение из каждого района.

Средний пул

Вычисляет среднее значение для каждого района.

Полностью подключенный уровень (FC)

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

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

Распознаватель цифр MNIST

Итак, теперь, когда мы знаем основы сверточных нейронных сетей, приступим к проекту.

Набор данных: - https://www.kaggle.com/c/digit-recognizer/data

ПРИМЕЧАНИЕ. Используйте Google Colab, поскольку его графический процессор помогает ускорить вычисление нейронной сети.

Шаг 1. Импортируйте необходимые библиотеки.

import numpy as np
import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow import keras

Шаг 2. Импортируйте набор данных и сохраните его во фрейме данных.

Это можно сделать двумя способами:

  1. Импорт файлов из локального хранилища в Google Colab (более медленный способ).
from google.colab import files
uploaded = files.upload()
import io
train = pd.read_csv(io.BytesIO(uploaded['train.csv']))
test = pd.read_csv(io.BytesIO(uploaded['test.csv']))

2. Импорт файлов с Google Диска в Google Colab (более быстрый способ).

from google.colab import drive
drive.mount('/content/drive/', force_remount=True)
train = pd.read_csv('/content/drive/My Drive/Colab Notebooks/Colab Datasets/MNIST/train.csv')
test = pd.read_csv('/content/drive/My Drive/Colab Notebooks/Colab Datasets/MNIST/test.csv')

Вот как выглядит набор данных поезда:

Шаг 3: разделение данных и метки

train_data = train.loc[:,"pixel0":]
train_label= train.loc[:, "label"]

Шаг 3. Преобразуйте данные поездов и тестов в массив numpy.

train_data = np.array(train_data)
train_label = tf.keras.utils.to_categorical(train_label, num_classes=10, dtype='float32')
test_data = test.loc[:, "pixel0":]
test_data = np.array(test_data)

Шаг 4: изменение формы и нормализация данных.

Мы пишем здесь «1», чтобы keras знал, что это изображение в оттенках серого, это не изменит количество значений.

train_data = train_data.reshape(train_data.shape[0],28,28,1)
test_data  = test_data.reshape(test_data.shape[0],28,28,1)
#Normalize the values between 0 to 1
train_data = train_data/255.0
test_data  = test_data/255.0

Шаг 5. ОПРЕДЕЛИТЕ СЛОИ CNN

model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (5,5), activation='relu',input_shape=(28,28,1), padding= 'same'),
tf.keras.layers.Conv2D(32, (5,5), activation = 'relu', padding='same'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Conv2D(64,(3,3),activation = 'relu',padding = 'same'),
tf.keras.layers.Conv2D(64,(3,3),activation = 'relu',padding = 'same'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Dropout(0.25),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1024,activation = 'relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(10,activation = 'softmax')
])

model.compile(optimizer = "adam", loss='categorical_crossentropy',
metrics=['accuracy'])

Шаг 6. Подберите модель.

history = model.fit(train_data,train_label,epochs = 25)

Выход:

Epoch 1/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.1634 - accuracy: 0.9488 Epoch 2/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0609 - accuracy: 0.9809 Epoch 3/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0469 - accuracy: 0.9856 Epoch 4/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0392 - accuracy: 0.9880 Epoch 5/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0358 - accuracy: 0.9889 Epoch 6/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0300 - accuracy: 0.9909 Epoch 7/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0311 - accuracy: 0.9905 Epoch 8/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0288 - accuracy: 0.9912 Epoch 9/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0246 - accuracy: 0.9924 Epoch 10/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0233 - accuracy: 0.9930 Epoch 11/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0214 - accuracy: 0.9937 Epoch 12/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0206 - accuracy: 0.9933 Epoch 13/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0206 - accuracy: 0.9938 Epoch 14/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0218 - accuracy: 0.9936 Epoch 15/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0201 - accuracy: 0.9941 Epoch 16/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0189 - accuracy: 0.9945 Epoch 17/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0188 - accuracy: 0.9944 Epoch 18/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0161 - accuracy: 0.9948 Epoch 19/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0172 - accuracy: 0.9950 Epoch 20/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0175 - accuracy: 0.9953 Epoch 21/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0165 - accuracy: 0.9950 Epoch 22/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0166 - accuracy: 0.9955 Epoch 23/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0180 - accuracy: 0.9950 Epoch 24/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0149 - accuracy: 0.9959 Epoch 25/25 1313/1313 [==============================] - 6s 5ms/step - loss: 0.0195 - accuracy: 0.9949

Шаг 7. Чтобы проверить использование сводки модели:

model.summary()

Выход:

Model: "sequential" _________________________________________________________________ Layer (type)                 Output Shape              Param #    ================================================================= conv2d (Conv2D)              (None, 28, 28, 32)        832        _________________________________________________________________ conv2d_1 (Conv2D)            (None, 28, 28, 32)        25632      _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 14, 14, 32)        0          _________________________________________________________________ dropout (Dropout)            (None, 14, 14, 32)        0          _________________________________________________________________ conv2d_2 (Conv2D)            (None, 14, 14, 64)        18496      _________________________________________________________________ conv2d_3 (Conv2D)            (None, 14, 14, 64)        36928      _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 7, 7, 64)          0          _________________________________________________________________ dropout_1 (Dropout)          (None, 7, 7, 64)          0          _________________________________________________________________ flatten (Flatten)            (None, 3136)              0          _________________________________________________________________ dense (Dense)                (None, 1024)              3212288    _________________________________________________________________ dropout_2 (Dropout)          (None, 1024)              0          _________________________________________________________________ dense_1 (Dense)              (None, 10)                10250      ================================================================= Total params: 3,304,426 Trainable params: 3,304,426 Non-trainable params: 0 _________________________________________________________________

Шаг 8. Сделайте прогнозы и сохраните их.

predictions = model.predict(test_data)
prediction = []
for i in predictions:
      prediction.append(np.argmax(i))
#making a dataframe to save predictions and data values
submission =  pd.DataFrame({
"ImageId": test.index+1,
"Label": prediction
})
submission.to_csv('submission.csv', index=False)

Вот как будет выглядеть наша заявка:

Шаг 9. Используйте модель для прогнозирования результата для одного примера

import matplotlib.pyplot as plt
image = train_data[0].reshape(28,28)
plt.imshow(image)

Код для распознавания изображения:

result = model.predict(np.array([train_data[0]]))
predicted_value = np.argmax(result)
print(predicted_value)

Выход:

1

Ссылка на Github: https://github.com/Atharva1604/MNIST-Digit-Recognizer-CNN

Поделитесь со мной своими мыслями о CNN и Deep Learning.

Спасибо!!!