Это ядро нацелено на простое понимание сверточной нейронной сети (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, которая обучена распознавать рукописные цифры.