Резюме:В этой статье кратко представлены основные принципы CNN, а также представлен процесс ее реализации, сочетание теории и практики на примере классификации арабского алфавита.
Многие читатели знакомы со сверточными нейронными сетями (CNN), которые в последние годы хорошо зарекомендовали себя в большинстве областей, особенно в области компьютерного зрения. Однако многие работники могут напрямую вызывать соответствующий набор инструментов глубокого обучения для построения модели сверточной нейронной сети, и им непонятен конкретный принцип. В этой статье будет кратко представлена сверточная нейронная сеть (CNN), чтобы читатели могли в целом понять ее основные принципы и процесс реализации, а также облегчить практическое применение в последующей работе. Эта статья будет разворачиваться в следующем порядке:
- Узнать об операциях свертки
- Понимание нейронных сетей
- предварительная обработка данных
- Понимание CNN
- Узнать об оптимизаторе
- Понимание ImageDataGenerator
- Делайте прогнозы и рассчитывайте точность
- demo
Что такое свертка?
В математике (особенно в функциональном анализе) свертка - это математическая операция двух функций (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)
набор данных
Используемый здесь набор данныхНабор данных почерка.
trainIamges.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)
предварительная обработка данных
Кодирование категориальных переменных
Что такое категориальные переменные?
В статистике категориальная переменная — это переменная, которая может принимать одну из ограничивающих переменных, относя каждого индивидуума или другую единицу наблюдения к определенной группе или номинальной категории на основе некоторого качественного свойства.(Источник: Википедия)
Проще говоря, значение категориальной переменной представляет категорию или класс.
Зачем вам нужно кодировать категориальные переменные?
Не имеет смысла выполнять операции непосредственно над числами, представляющими категории. Поэтому его необходимо классифицировать и кодировать.
пожалуйста, проверьтеэта ссылкадля примеров категориальных переменных.
В арабском алфавите 28 букв. Таким образом, набор данных имеет 28 категорий.
train_label = du.to_categorical(train_label,28)
стандартизация
Что такое стандартизация?
Нормализация выполняется, чтобы привести все данные в четко определенный диапазон, обычно от 0 до 1.
В нейронных сетях данные не только нормализованы, но и скалярны, так что цель этого процесса — иметь возможность быстрее приблизиться к глобальному минимуму поверхности ошибок.(Источник: переполнение стека)
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])
Преобразуйте его так, чтобы каждый фрагмент данных представлял собой плоское изображение.
train_data, mean1 = du.featurewise_zero_center(train_data)
test_data, mean2 = du.featurewise_zero_center(test_data)
Center of zero by function обнуляет центр каждой выборки и указывает среднее значение. Если не указано, среднее значение оценивается для всех образцов.
Создайте 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 — это метод регуляризации, который уменьшает переобучение в нейронных сетях, предотвращая сложную совместную адаптацию к обучающим данным, что является одним из наиболее эффективных методов в моделях нейронных сетей. «Выпадение» относится к случайному отбрасыванию некоторых нейронных единиц в нейронной сети с определенной вероятностью.(Источник: Википедия)
Что такое Флаттен?
Выровняйте карту объектов, чтобы преобразовать многомерные данные в векторы одномерных объектов для использования в следующем слое (плотный слой).
Что такое плотный слой?
Плотный слой — это просто слой искусственной нейронной сети, также известный как полносвязный слой.
Метод оптимизации CNN
Что такое оптимизация?
Алгоритмы оптимизации помогают нам минимизировать (или максимизировать) целевую функцию, которая является просто математической функцией, зависящей от обучаемых параметров внутри модели. Модель использует набор предикторов (X) для вычисления целевого значения (Y). Например, мы называем значения веса (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)
Создать матрицу путаницы
Что такое матрица путаницы?
Матрица путаницы — это метод, используемый для подведения итогов производительности алгоритмов классификации. Одна только точность классификации может ввести в заблуждение, если количество наблюдений в каждом классе неодинаково или если в наборе данных более двух классов. Вычисление матрицы путаницы может дать нам лучшее представление о том, насколько верна модель классификации и какие ошибки она допускает.Источник: machinelearningonline.blog
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 и карту объектов, выводимую каждым слоем. Наконец, сеть CNN обучена распознавать рукописные цифры.
Выше приведены переводы, которые были переведены общественной организацией Alibaba Cloud Yunqi.
Ссылка на перевод
Оригинальное название статьи «Сверточная нейронная сеть — вид с высоты птичьего полета с реализацией», переводчик: Haitang, рецензент: Uncle_LLD.
В статье упрощенный перевод, более подробное содержание,Пожалуйста, просмотрите исходный текст.
Для получения более технических галантерейных товаров, пожалуйста, обратите внимание на номер организации Yunqi Community Zhihu:Сообщество Alibaba Cloud Yunqi
Эта статья является оригинальным контентом сообщества Yunqi и не может быть воспроизведена без разрешения.