Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

РЕФЕРАТ / РЕФЕРАТ Машинное обучениеи

.pdf
Скачиваний:
63
Добавлен:
25.06.2023
Размер:
730.91 Кб
Скачать

каждый из которых мы подаем на отдельный вход), тогда у нас получатся 784

входа для пикселей и 1 вход для параметра смещения (bias). Затем скрытый слой нейронной сети из 128 нейронов, и выходной слой из 10 нейронов,

каждый из которых соответствует одному значению цифры от 0 до 9 в

соответствии с рисунком 8.

Рисунок 8 – Схема нейронной сети Функцией активации для скрытого слоя выберем линейный

выпрямитель – ReLU (Rectified Linear Unit), который даст нам весовые коэффициенты для нашей нейронной сети, ее график и уравнение в соответствии с рисунком 9. Для выходного слоя применим функцию активации нормализованная экспоненциальная функция – Softmax, которая позволит нам интерпретировать выходные значения в терминах вероятности,

что позволит нам определить принадлежность к определенному классу цифр,

ее уравнение в соответствии с рисунком 10.

Рисунок 9 – Функция ReLU

Рисунок 10 – Функция Softmax

11

Характеристики созданной нейронной сети в соответствии с рисунком 11.

Рисунок 11 – Характеристики нейронной сети Также необходимо выбрать способ оптимизации градиентного

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

энтропия мала, то распределения похожи друг на друга.

В качестве метрики для нашей нейронной сети будем использовать

Accuracy – доля правильных ответов алгоритма.

Код программы в соответствии с Приложением А.

Обучение нейронной сети

Подготовительные этапы пройдены теперь можно отправить на вход

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

12

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

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

Результат обучения в соответствии с рисунком 12.

Рисунок 12 – Результаты обучения модели По результатам обучения точность на обучающей выборке составила

0.9958 с критерием качества 0.0152, на выборке валидации результат немного хуже точность составила 0.9743 с критерием качества 0.1009.

Проверка модели на тестовой выборке

Результат проверки обученной модели на тестовой выборке в

соответствии с рисунком 13.

Рисунок 13 – Результат проверки модели на тестовой выборке По результатам тестирования точность составила 0.9779 с критерием

качества 0.0759, что приближенно соответствует результату на выборки валидации.

13

Выводы

Познакомились с Machine Learning. Изучили этапы разработки и обучения нейронной сети. Узнали какие подходы имеются для построения схемы нейронной сети и их особенности. Какие слои должна включать в себя нейронная сети и за что каждый из них отвечает и как оны должны быть связаны

Применили полученные знания для создания собственной нейронной сети. Обучили ее и протестировали на разных наборах данных, получив хорошие результаты с высоким процентом точности распознавания рукописных цифр на изображениях (порядка ~98%).

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

14

Список использованной литературы и электронных источников

1 Николенко С. И. Глубокое обучение [Текст]: книга / Кадурин А.,

Архангельская Е. В. – СПб.: Питер, 2018. 480 с.: ил. – (Серия «Библиотека программиста»)

2 egor_labintcev Метрики в задачах машинного обучения: статья /

Habr 2017. URL: https://habr.com/ru/company/ods/blog/328372/

3 Siarshai Методы оптимизации нейронных сетей: статья / Habr 2017. URL: https://habr.com/ru/post/318970/

15

Приложение А

import numpy as np

import matplotlib.pyplot as plt

from tensorflow.keras.datasets import mnist # библиотека базы выборок

Mnist

from tensorflow import keras

from tensorflow.keras.layers import Dense, Flatten

"""Загрузка обучающей и тестовой выборок"""

(x_train, y_train), (x_test, y_test) = mnist.load_data()

"""Нормализация входных данных"""

x_train = x_train / 255 x_test = x_test / 255

"""Преобразование выходных значений в векторы по категориям"""

y_train_cat = keras.utils.to_categorical(y_train, 10) y_test_cat = keras.utils.to_categorical(y_test, 10)

"""Отображение первых 25 изображений из обучающей выборки"""

plt.figure(figsize=(10,5)) for i in range(25):

plt.subplot(5,5,i+1)

plt.xticks([])

plt.yticks([])

plt.imshow(x_train[i], cmap=plt.cm.binary)

plt.show()

"""Формироване модели НС и вывод ее структуры в консоль"""

model = keras.Sequential([ Flatten(input_shape=(28, 28, 1)), Dense(128, activation='relu'), Dense(10, activation='softmax')

])

print(model.summary()) # вывод структуры НС в консоль

"""Компиляция НС с оптимизацией по Adam и критериям - категориальная кросс-энтропия"""

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

16

"""Запуск процесса обучения: 80% - обучающая выборка, 20% - выборка валидации"""

model.fit(x_train, y_train_cat, batch_size=32, epochs=5, validation_split=0.2)

model.evaluate(x_test, y_test_cat)

"""Проверка распознавания цифр"""

n = 1

x = np.expand_dims(x_test[n], axis=0) res = model.predict(x)

print(res)

print(np.argmax(res))

plt.imshow(x_test[n], cmap=plt.cm.binary) plt.show()

"""Распознавание всей тестовой выборки"""

pred = model.predict(x_test) pred = np.argmax(pred, axis=1)

print(pred.shape)

print(pred[:20]) print(y_test[:20])

"""Выделение неверных вариантов"""

mask = pred == y_test print(mask[:10])

x_false = x_test[~mask] y_false = pred[~mask] y_true = y_test[~mask]

print(y_true[:10]) print(y_false[:10])

print(x_false.shape)

"""Вывод первых 5 неверных результатов"""

for i in range(2):

print('Реальное значение: ' + str(y_true[i]) + '\nРаспознана как: '+ str(y_false[i]))

plt.imshow(x_false[i], cmap=plt.cm.binary)

17

plt.show()

"""Вывод 25 изображений распознаных неверно"""

plt.figure(figsize=(10,5)) for i in range(25):

plt.subplot(5, 5, i+1) plt.xticks([]) plt.yticks([])

plt.imshow(x_false[i], cmap=plt.cm.binary)

plt.show()

18