Это ядро ​​нацелено на простое понимание сверточной нейронной сети (CNN). Это будет происходить в следующем порядке:

  • Понимание операции свертки
  • Понимание нейронных сетей
  • Предварительная обработка данных
  • Понимание используемой CNN
  • Понимание оптимизаторов
  • Понимание ImageDataGenerator
  • Прогнозы и расчет точности
  • Наблюдение за нейронной сетью в действии

Что такое свертка?

В математике (и, в частности, в функциональном анализе) свертка - это математическая операция над двумя функциями (f и g) для создания третьей функции, которая выражает, как форма одной изменяется другой.

(Источник: Википедия)

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

Математически эта операция представлена ​​как

(Источник изображения: Википедия)

Ознакомьтесь с этой ссылкой для визуального понимания операции свертки.

Что такое искусственные нейронные сети?

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

(Источник: Википедия)

ИНС - это набор более мелких процессоров, называемых искусственными нейронами, которые примерно напоминают биологический нейрон.

Биологический нейронный контур

(Источник изображения: Википедия)

Набор взаимосвязанных цепей составляет сеть

Искусственная нейронная сеть

(Источник изображения: Википедия)

Теперь мы начнем с реализации

Импорт необходимых библиотек

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

import tflearn.data_utils as du
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D
from keras.optimizers import RMSprop
from keras.preprocessing.image import ImageDataGenerator
from sklearn.metrics import confusion_matrix

Загрузка набора данных

train_data = pd.read_csv('../input/csvTrainImages 13440x1024.csv', header = None)
train_label = pd.read_csv('../input/csvTrainLabel 13440x1.csv', header = None)
test_data = pd.read_csv('../input/csvTestImages 3360x1024.csv', header = None)
test_label = pd.read_csv('../input/csvTestLabel 3360x1.csv', header = None)

Набор данных

Используемый здесь набор данных - Набор данных рукописных арабских символов.

В trainImages.csv 1024 столбца и 13440 строк. Каждый столбец представляет пиксель изображения, а каждая строка представляет отдельное изображение в градациях серого. Значение каждого пикселя варьируется от 0 до 255.

train_data = train_data.iloc[:,:].values.astype('float32')
train_label = train_label.iloc[:,:].values.astype('int32')-1
test_data = test_data.iloc[:,:].values.astype('float32')
test_label = test_label.iloc[:,:].values.astype('int32')-1

Визуализация набора данных

def row_calculator(number_of_images, number_of_columns):
    if number_of_images % number_of_columns != 0:
        return (number_of_images / number_of_columns)+1
    else:
        return (number_of_images / number_of_columns)
def display_image(x, img_size, number_of_images):
    plt.figure(figsize = (8, 7))
    if x.shape[0] > 0:
        n_samples = x.shape[0]
        x = x.reshape(n_samples, img_size, img_size)
        number_of_rows = row_calculator(number_of_images, 4)
        for i in range(number_of_images):
            plt.subplot(number_of_rows, 4, i+1)
            plt.imshow(x[i])

Обучающий набор

display_image(train_data, 32, 16)

Тестовый набор

display_image(test_data, 32, 16)

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

Кодирование категориальных переменных

Что такое категориальные переменные?

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

(Источник: Википедия)

Проще говоря, значение категориальной переменной представляет категорию или класс.

Зачем нам нужно кодировать категориальные переменные?

Нет смысла выполнять операции с числом, представляющим категорию. Итак, необходимо выполнить категориальное кодирование.

Просмотрите ссылку this в stackoverflow, чтобы понять это на примере.

В арабском алфавите 28 букв. Таким образом, существует 28 классов.

train_label = du.to_categorical(train_label,28)

Нормализация

Что такое нормализация?

Нормализация выполняется для приведения всех данных в четко определенный диапазон, предпочтительно от 0 до 1.

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

(Источник: Stack Overflow)

train_data = train_data/255
test_data = test_data/255
train_data = train_data.reshape([-1, 32, 32, 1])
test_data = test_data.reshape([-1, 32, 32, 1])

Изменение формы выполняется так, чтобы данные представляли 2D-изображение.

train_data, mean1 = du.featurewise_zero_center(train_data)
test_data, mean2 = du.featurewise_zero_center(test_data)

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

Создание CNN

recognizer = Sequential()
recognizer.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', activation ='relu', input_shape = (32,32,1)))
recognizer.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same', activation ='relu'))
recognizer.add(MaxPool2D(pool_size=(2,2)))
recognizer.add(Dropout(0.25))

recognizer.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', activation ='relu'))
recognizer.add(Conv2D(filters = 64, kernel_size = (3,3),padding = 'Same', activation ='relu'))
recognizer.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
recognizer.add(Dropout(0.25))

recognizer.add(Flatten())
recognizer.add(Dense(units = 256, input_dim = 1024, activation = 'relu'))
recognizer.add(Dense(units = 256, activation = "relu"))
recognizer.add(Dropout(0.5))
recognizer.add(Dense(28, activation = "softmax"))

Что такое максимальный пул?

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

По определению, максимальный пул принимает максимальное значение заданной сетки.

(Источник: machinelearningonline.blog)

Максимальное объединение используется для уменьшения размеров. Это также поможет избежать чрезмерной подгонки. Загляните в этот блог, чтобы лучше понять Max Pooling.

Что такое отсев?

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

(Источник: Википедия))

Что такое Flatten?

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

Что такое плотный слой?

Плотный слой - это просто слой искусственной нейронной сети.

Оптимизатор для CNN

Что такое оптимизатор?

Алгоритмы оптимизации помогают нам минимизировать (или максимизировать) целевую функцию (другое название функции ошибок) E (x), которая является просто математической функцией, зависящей от внутренних обучаемых параметров модели, которые используются при вычислении целевых значений (Y ) из набора предикторов (X), используемых в модели. Например - мы называем значения Весов (W) и Смещения (b) нейронной сети как ее внутренние обучаемые параметры, которые используются при вычислении выходных значений, изучаются и обновляются в направлении оптимального решения, то есть минимизации потерь путем сети, а также играют важную роль в процессе обучения модели нейронной сети.

(Источник: На пути к науке о данных)

optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)

Используемый здесь оптимизатор - RMSprop. Нажмите здесь, чтобы узнать больше о RMSprop

recognizer.compile(optimizer = optimizer , loss = "categorical_crossentropy", metrics=["accuracy"])

Что такое ImageDataGenerator?

Генератор данных изображения используется для генерации пакетов данных тензорного изображения с увеличением в реальном времени. Эти данные зацикливаются партиями.

Он используется для загрузки изображений партиями.

datagen = ImageDataGenerator(
        featurewise_center=False, 
        samplewise_center=False,  
        featurewise_std_normalization=False,
        samplewise_std_normalization=False,
        zca_whitening=False,
        rotation_range=10,
        zoom_range = 0.1,  
        width_shift_range=0.1, 
        height_shift_range=0.1,
        horizontal_flip=False,
        vertical_flip=False)
datagen.fit(train_data)

Подгонка CNN к обучающим данным

recognizer.fit_generator(datagen.flow(train_data,train_label, batch_size=100), epochs = 30, verbose = 2, steps_per_epoch=train_data.shape[0] // 100)

Делаем прогнозы

predictions = recognizer.predict(test_data)
predictions = np.argmax(predictions,axis = 1)

Создание матрицы путаницы

Что такое матрица путаницы?

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

"Источник"

cm = confusion_matrix(test_label, predictions)

Расчет точности

accuracy = sum(cm[i][i] for i in range(28)) / test_label.shape[0]
print("accuracy = " + str(accuracy))

Получена точность 97%.

Увидеть CNN в действии

Чтобы увидеть, как работает CNN в реальном времени, перейдите по ссылке эта. Он показывает работу CNN, которая обучена распознавать рукописные цифры.