РЕФЕРАТ / РЕФЕРАТ Машинное обучениеи
.pdfкаждый из которых мы подаем на отдельный вход), тогда у нас получатся 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