Введение

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

Что такое глубокое обучение?

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

Классификация изображений

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

Благодарности

  1. Документация Кераса
  2. Нежное введение в ИНС — Нареш Бхат
  3. Всеобъемлющее руководство по ИНС с Керасом — Прашант Банерджи

Постановка задачи

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

Цели проекта

Цель проекта включает в себя-

  1. Исследовательский анализ данных MNIST
  2. Предварительная обработка данных
  3. Построение модели глубокого обучения (ANN)
  4. Оценка модели

Примечание. Это мой первый проект глубокого обучения, и я рассмотрел набор данных Fashion MNIST и Digit MNIST для практики.

Импорт библиотек

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

Давайте поприветствуем наши наборы данных MNIST

Как выглядит набор данных изображения?

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

fashion_train.head()

В наборе данных fashion mnist номер этикетки означает не сам номер, а идентификатор аксессуара одежды. Мы можем получить это изображение из значений пикселей, указанных в записи. Значения каждого пикселя варьируются от 0 до 255. Более высокое значение интенсивности (255) напоминает цвет, а более низкое значение интенсивности (0) — белый. Между ними много оттенков.

Поезд тестовый сплит-Fashion MNIST

Нам нужно разделить наш набор данных MNIST о моде на входные данные и данные этикетки. Наш MNIST уже был извлечен в виде тестовых данных поезда X-Y, поэтому нет необходимости разделять его.

X_train_fashion = fashion_train.drop('label',axis = 1)
y_train_fashion = fashion_train['label']
X_test_fashion = fashion_test.drop('label',axis = 1)
y_test_fashion = fashion_test['label']

Исследовательский анализ данных

Визуализация чисел

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

Здесь мы можем увидеть различные типы аксессуаров для одежды как для мужчин, так и для женщин в моде.

#Names of numbers in the dataset in order
col_names = ['Zero','One','Two','Three','Four','Five','Six','Seven','Eight','Nine']

#Visualizing the digits
plt.figure(figsize=(10,10))
for i in range(15):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(X_train_digit[i], cmap='gray')
    plt.xlabel(col_names[y_train_digit[i]])
plt.show()

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

Пиксельная интенсивность изображений

Мы знаем, что RGB будет иметь значения от 0 до 255, где 0 — самая низкая интенсивность (черный), а 255 — самая высокая (белый). Давайте проверим яркость каждого пикселя с помощью замечательной функции, взятой из Записной книжки Нареша Бхата.

#Visualizing for digit MNIST
fig = plt.figure(figsize = (12,12)) 
ax = fig.add_subplot(111)
visualize_input(X_train_digit[1], ax)
plt.show()

Мы взяли изображение «0», и вы можете обнаружить, что все пиксели с самой высокой интенсивностью в диапазоне от 220 до 255 имеют яркие цвета, а остальные (зеленые) имеют интенсивность 0.

#Visualizing for Fashion MNIST
fig = plt.figure(figsize = (12,12)) 
ax = fig.add_subplot(111)
visualize_input(x_train_reshape[1], ax)
plt.show()

Мы взяли изображение обуви, и вы можете обнаружить, что все пиксели с самой высокой интенсивностью в диапазоне от 220 до 255 имеют яркие цвета, а остальные (зеленые) имеют нулевую интенсивность. Здесь также есть тусклые пиксели внутри объекта, и он также был захвачен.

Количество меток в MNIST

#Setting plot size
sns.set(rc={'figure.figsize':(11.7,8.27)})

#Getting dataframe data
mnist=pd.read_csv("../input/digit-recognizer/train.csv")

#Countplot
ax = sns.countplot(x="label", data=mnist,
                   facecolor=(0, 0, 0, 0),
                   linewidth=5,
                   edgecolor=sns.color_palette("dark", 3),
                   order = mnist['label'].value_counts().index)

Статистика:

  • Метка набора данных MNIST хорошо сбалансирована.
  • Наибольший номер метки — «1», за которым следуют «7» и «3».

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

Обработка данных

Изменение формы цифры MNIST

Форма цифры MNIST извлекается из 2D-данных, которые нельзя передать в нейронную сеть, поскольку она допускает только 1D-данные, поэтому мы преобразуем их с помощью функции изменения формы. Давайте подтвердим, проверив размеры обучающих данных.

Здесь размеры отображаются как 3, где первое принадлежит записям, за которыми следуют 2D-данные. Проверим форму.

Из формы поезда видно, что у нас есть (6000,28,28). Здесь 6000 — это количество записей, которые у нас есть, а 28X28 — размерность 2D-данных. Теперь его можно представить как 784 (28X28), что является одномерными данными. Преобразовав в 1D, мы можем передать данные в нейронную сеть для обучения. Теперь, используя функцию изменения формы,

X_train_digit = X_train_digit.reshape(60000, 784)
X_test_digit = X_test_digit.reshape(10000, 784)

Кодирование этикеток

Наши наборы данных MNIST содержат по 10 классов в обоих наборах данных. Теперь давайте закодируем классы меток в наборе данных с помощью функции to_categorical() из библиотеки утилит Keras. Если метка «5», она будет кодироваться как единица в пятой позиции вектора и так далее для всех меток класса. Посмотрим визуально

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

Построение модели глубокого обучения — искусственная нейронная сеть

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

Сначала давайте построим и скомпилируем модель ИНС без какой-либо настройки гиперпараметров, а затем применим настройку гиперпараметров, чтобы понять, как улучшается точность модели.

На этом этапе мы делаем 3 шага

  1. Определение модели
  2. Скомпилируйте модель с функцией потерь
  3. Подгонка модели под наши данные

Определение модели

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

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

Компиляция модели

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

  • Оптимизатор: Адам — это алгоритм оптимизации, который можно использовать вместо классической процедуры стохастического градиентного спуска для итеративного обновления весов сети на основе обучающих данных. Он не требует постоянной скорости обучения, такой как SGD, он адаптируется к изменению скорости обучения в каждом цикле.
  • Функция потерь. Категориальная кроссэнтропия — это функция потерь, которая используется в задачах классификации нескольких классов. Это задачи, в которых пример может принадлежать только к одной из многих возможных категорий, и модель должна решить, к какой именно. Формально она предназначена для количественной оценки разницы между двумя распределениями вероятностей.
  • Метрики. Точность — это отношение количества правильных прогнозов к общему количеству входных выборок.
#Compiling the model
model.compile(loss="categorical_crossentropy",
              optimizer="adam",
              metrics = ['accuracy'])

Подгонка модели

Теперь пришло время обучить нашу нейронную сеть. Поскольку здесь мы не использовали обучение гиперпараметрам. Я просто даю значение размеру партии и эпохам, которые в этом случае работали лучше.

model.fit(X_train_digit, y_train_digit, batch_size=100, epochs=30)

Из результатов обучения мы видим, что всего через 30 эпох точность увеличилась примерно до 95%, а значение потерь составляет 0,19, что очень хорошо. Мы можем ожидать гораздо большей точности при настройке гиперпараметров.

Для набора данных моды MNIST мы получили точность 83%, а потери составляют около 0,5, что хорошо, но его можно улучшить с помощью настройки гиперпараметров или сети CNN. Давайте оценим обе модели с тестовыми данными

Оценка модели

Точность теста

Теперь пришло время проверить, как работает наша модель, когда она получает невидимые данные. У нас есть функция Assessment () от keras для оценки нашей обученной модели, давайте используем ее, чтобы получить точность теста обоих наборов данных.

Из результатов видно, что цифровые данные MNIST показали лучшие результаты (97%) на тестовых данных по сравнению с модными данными MNIST (87%). Но ситуация может измениться после использования настройки гиперпараметров. Давайте отобразим матрицу путаницы

Матрица путаницы

Давайте посмотрим, сколько ярлыков были классифицированы правильно, а сколько неправильно классифицировано.

#Confusion matrix for Fashion MNIST
con_mat=confusion_matrix(y_test_fash_eval,y_predict_fash)
plt.style.use('seaborn-deep')
plt.figure(figsize=(10,10))
sns.heatmap(con_mat,annot=True,annot_kws={'size': 15},linewidths=0.5,fmt="d",cmap="gray")
plt.title('True or False predicted Fashion MNIST\n',fontweight='bold',fontsize=15)
plt.show()

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

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

Давайте теперь попробуем настроить гиперпараметр и посмотрим, улучшится ли он.

Настройка гиперпараметров в ANN

Гиперпараметры — это переменные, которые определяют структуру сети (например, количество скрытых единиц) и переменные, которые определяют, как сеть обучается (например, скорость обучения). Гиперпараметры устанавливаются перед обучением (до оптимизации весов и смещения). У нас есть много параметров, когда дело доходит до

  1. Количество слоев
  2. Количество нейронов в каждом слое
  3. Размер партии
  4. Эпохи
  5. Оптимизатор
  6. Функция потерь
  7. Активация

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

Цифра MNIST- Настройка гиперпараметра

Теперь давайте установим гиперпараметр для модели Digit MNIST и повторим то же самое для модели Fashion MNIST.

#Fitting the params with the training data to figure out the best params and accuracy score
grid_result = grid.fit(X_train_digit, y_train_digit)

print(grid_result.best_score_,grid_result.best_params_)

Мы получили лучший результат 91% и параметры, где мы выбираем сигмоид в качестве функции активации с размером пакета 256 и скрытыми слоями 40,20.

Оценка модели после настройки гиперпараметров

Мы получили довольно хороший результат. давайте оценим настроенную модель с нашими тестовыми данными

#Predicting from the params we got from grid search cv
pred_y = grid.predict(X_test_digit)

y_test_digit=np.argmax(y_test_digit, axis=1)

#Confusion matrix
con_mat=confusion_matrix(y_test_digit,pred_y)
plt.style.use('seaborn-deep')
plt.figure(figsize=(10,10))
sns.heatmap(con_mat,annot=True,annot_kws={'size': 15},linewidths=0.5,fmt="d",cmap="gray")
plt.title('True or False predicted digit MNIST\n',fontweight='bold',fontsize=15)
plt.show()

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

Мод MNIST - настройка гиперпараметров

Пришло время настроить нашу модную модель MNIST

def create_model_fash(layers, activation):
    model = Sequential()
    for i, nodes in enumerate(layers):
        if i==0:
            model.add(Dense(nodes,input_dim=X_train_fashion.shape[1]))
            model.add(Activation(activation))
            model.add(Dropout(0.3))
        else:
            model.add(Dense(nodes))
            model.add(Activation(activation))
            model.add(Dropout(0.3))
            
    model.add(Dense(units = 10, kernel_initializer= 'glorot_uniform', activation = 'softmax')) 
    
    model.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['accuracy'])
    return model
#Using Keras classifier to apply the function
model4 = KerasClassifier(build_fn=create_model_fash, verbose=0)

#Tuning the layers, activation function and batch sizes
layers = [(20,), (40, 20), (45, 30, 15)]
activations = ['sigmoid', 'relu','softmax']
param_grid = dict(layers=layers, activation=activations, batch_size = [128, 256], epochs=[30])

#Using GridSearchCV to fit the param dictionary
grid = GridSearchCV(estimator=model4, param_grid=param_grid,cv=5)

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

#Predicting from the params we got from grid search cv
pred_y = grid.predict(X_test_fashion)

y_test_fashion=np.argmax(y_test_fashion, axis=1)

#Confusion matrix
con_mat=confusion_matrix(y_test_fashion,pred_y)
plt.style.use('seaborn-deep')
plt.figure(figsize=(10,10))
sns.heatmap(con_mat,annot=True,annot_kws={'size': 15},linewidths=0.5,fmt="d",cmap="gray")
plt.title('True or False predicted fashion MNIST\n',fontweight='bold',fontsize=15)
plt.show()

Мы получили точность теста 78% от модели Fashion MNIST после настройки. Вы можете заметить, что продукты с метками 6 и 4 были неправильно классифицированы. Вы можете попробовать настроить больше, добавив больше в словарь параметров, и получить лучшие результаты, чем это.

Вывод

Мы пришли к выводу, что я хотел бы резюмировать то, что мы сделали в нашем проекте. Мы взяли два популярных набора данных MNIST и предварительно обработали их. Позже мы добавили искусственную нейронную сеть, создав ее. Также мы выполнили настройку гиперпараметров в ИНС и получили наилучшую точность. Прежде чем закончить, я хотел бы указать на то, что можно сделать дальше.

  1. Можно настроить больше параметров
  2. Настройка гиперпараметров также может быть выполнена при выборе количества нейронов.
  3. Может выполнять такие методы, как ранняя остановка и нормализация партии.

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

Найдите мои другие статьи здесь