Как создать свою простую нейронную сеть
Создание и тренировка вашей первой нейросети на Python: пошаговое руководство
Работа с нейронными сетями – это увлекательное занятие, позволяющее решать различные задачи в области машинного обучения. В этой статье мы рассмотрим создание и тренировку нейронной сети прямого распространения (Feedforward Neural Network) для классификации рукописных цифр из популярного набора данных MNIST.
Что такое MNIST?
MNIST – это база данных рукописных цифр, которая часто используется для тестирования алгоритмов машинного обучения. Она содержит 60 тыс. примеров для тренировки и 10 тыс. примеров для тестирования. Каждый пример представляет собой черно-белое изображение размером 28x28 пикселей.
Подготовка окружения
Перед началом работы убедитесь, что у вас установлен Python и следующие библиотеки:
- numpy
- matplotlib
- tensorflow (включая keras)
Устанавливаем нужные библиотеки командами:
pip install numpy matplotlib tensorflow
Загрузка и подготовка данных
Импортируем необходимые модули и загрузим данные MNIST при помощи Keras:
# Импорт необходимых библиотек
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
# Загрузка датасета MNIST
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# Нормализация данных от 0 до 1
x_train = x_train.reshape(60000, 784).astype('float32') / 255
x_test = x_test.reshape(10000, 784).astype('float32') / 255
# Преобразуем метки классов в категории
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
Создание модели нейросети
Теперь создадим модель Feedforward Neural Network с использованием Keras:
# Создание модели нейросети
model = Sequential()
model.add(Dense(units=512, activation='relu', input_shape=(784,)))
model.add(Dense(units=256, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
# Компиляция модели
model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
В данном случае мы используем два скрытых слоя по 512 и 256 нейронов соответственно. Функция активации ReLU помогает избежать проблемы затухания градиента. Выходной слой содержит десять нейронов (по количеству классов цифр) с softmax активацией для получения вероятности каждого класса.
Обучение модели
Теперь можно запустить процесс обучения нашей нейросетевой модели:
# Обучение модели
history = model.fit(x_train, y_train, epochs=10, batch_size=128, validation_data=(x_test, y_test), verbose=2)
Обратите внимание на параметры: epochs
– количество эпох обучения; batch_size
– размер партий данных при одном шаге обучения; validation_data
– данные для оценки качества обучения после каждой эпохи.
Оценка результативности модели
После завершения процесса тренировки оценим результативность работы нашего алгоритма на тестовом датасете:
# Оценка результативности модели
evaluation = model.evaluate(x_test, y_test)
print('Точность тестирования: {:.2f}%'.format(evaluation[1] * 100))
Визуализация результатов
Также полезно построить график точности и потерь в процессе обучения:
# Построение графика точности и потерь в процессе обучения
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Тренировка')
plt.plot(history.history['val_accuracy'], label='Тест')
plt.title('Точность модели')
plt.xlabel('Эпоха')
plt.ylabel('Точность')
plt.legend(loc='upper left')
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Тренировка')
plt.plot(history.history['val_loss'], label='Тест')
plt.title('Потери модели')
plt.xlabel('Эпоха')
plt.ylabel('Потери')
plt.legend(loc='upper left')
plt.show()
В зависимости от результативности можно корректировать параметры или архитектуру вашей сетевой модели.
Поздравляем! Вы только что создали свою первую нейросеть для распознавания рукописных цифр! Это основы работы с более сложными задачами компьютерного зрения.