Классифицируем рукописные цифры с помощью Tensorflow и Keras

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Привет, Хабр! Сегодня мы окунемся в мир машинного обучения, создав свою первую нейронную сеть на Python с помощью TensorFlow и Keras для распознавания рукописных цифр из знаменитого датасета MNIST. Этот проект станет отличным стартом для тех, кто только начинает свой путь в машинном обучении, и показательным примером мощи и простоты использования современных инструментов разработки.

Перед тем как погрузиться в код, давайте разберемся, почему MNIST является таким популярным выбором для первых проектов в области машинного обучения. Датасет MNIST содержит 70 000 изображений рукописных цифр, каждое из которых представляет собой черно-белое изображение размером 28x28 пикселей. Он разделен на две части: 60 000 образцов для обучения и 10 000 для тестирования модели. Простота и одновременно вариативность данных делает MNIST идеальным полигоном для экспериментов.

Для начала работы убедитесь, что у вас установлены Python и библиотека TensorFlow. TensorFlow можно легко установить или обновить через pip, запустив команду в терминале:

$ pip install tensorflow

После установки необходимых инструментов перейдем к коду. Начнем с импорта необходимых модулей. TensorFlow и Keras предоставляют нам все необходимые инструменты для работы с датасетами, создания и обучения моделей.

import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.utils import to_categorical 

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

(train_images, train_labels), (test_images, test_labels) = mnist.load_data() train_images = train_images / 255.0 test_images = test_images / 255.0 train_labels = to_categorical(train_labels) test_labels = to_categorical(test_labels)

После загрузки и нормализации данных пришло время создать модель. Мы используем Sequential API из Keras для построения модели. Наша нейронная сеть будет состоять из входного слоя, который "выпрямляет" изображения из 2D в вектор, двух скрытых слоев с 128 и 64 нейронами соответственно и функцией активации ReLU, и выходного слоя с 10 нейронами (по количеству классов цифр) и функцией активации softmax для получения вероятностей классов.

model = Sequential([     Flatten(input_shape=(28, 28)),     Dense(128, activation='relu'),     Dense(64, activation='relu'),     Dense(10, activation='softmax') ])  model.compile(optimizer='adam',               loss='categorical_crossentropy',               metrics=['accuracy']) 

Давайте разберем этот код более подробно. Этот фрагмент кода создает модель нейронной сети с использованием Keras, высокоуровневого API для TensorFlow, предназначенного для быстрого и простого построения и обучения моделей глубокого обучения.

model = Sequential([
  • Sequential - это класс в Keras, который позволяет создать модель, добавляя слои последовательно. Здесь мы начинаем определять нашу модель как последовательность слоев.

    Flatten(input_shape=(28, 28)),
  • Flatten - это слой, который преобразует входные данные в одномерный массив. В нашем случае, каждое изображение из датасета MNIST имеет размер 28x28 пикселей. Flatten преобразует это 2D представление в 1D, получая на выходе вектор из 784 элементов (28*28). input_shape=(28, 28) указывает на форму входных данных, которые ожидает модель.

    Dense(128, activation='relu'),
  • Dense - это полносвязный слой нейронной сети, где каждый нейрон в слое соединен со всеми нейронами в предыдущем слое. Здесь создается слой из 128 нейронов. activation='relu' указывает на использование функции активации ReLU (Rectified Linear Unit). ReLU преобразует все отрицательные значения в ноль и пропускает положительные значения без изменений, что помогает решать проблему исчезающего градиента и ускоряет обучение.

    Dense(64, activation='relu'),
  • Здесь мы добавляем еще один полносвязный слой, на этот раз с 64 нейронами, также используя ReLU в качестве функции активации. Это уменьшение количества нейронов по сравнению с предыдущим слоем помогает постепенно сужать представление данных перед классификацией.

    Dense(10, activation='softmax')
  • Последний слой нашей модели также является полносвязным (Dense), но содержит 10 нейронов, поскольку нам нужно классифицировать изображения на 10 классов (цифры от 0 до 9). activation='softmax' используется в качестве функции активации для этого слоя, так как она преобразует выходные данные слоя в распределение вероятностей по 10 классам. Softmax гарантирует, что сумма всех выходных значений (вероятностей) меньше или равна 1.

])  model.compile(optimizer='adam',               loss='categorical_crossentropy',               metrics=['accuracy'])
  • model.compile - это метод, который конфигурирует модель для обучения. optimizer='adam' задает оптимизатор Adam для обновления весов в процессе обучения. Adam - это алгоритм оптимизации, который может автоматически корректировать скорость обучения, что делает его эффективным для большинства задач.

  • loss='categorical_crossentropy' указывает на использование категориальной кросс-энтропии в качестве функции потерь, что является стандартным выбором для задач многоклассовой классификации.

  • metrics=['accuracy'] говорит Keras, что в процессе обучения и тестирования модели нам интересно отслеживать точность (accuracy) как показатель эффективности модели.

Обучение модели — это процесс, в котором модель учится распознавать правильные паттерны в данных. В нашем случае мы обучаем ее распознавать рукописные цифры. Запустим обучение, используя метод fit, и посмотрим на результаты после нескольких эпох.

model.fit(train_images, # данные для обучения           train_labels, #            epochs=10,    # кол-во эпох обучения           validation_data=(test_images, test_labels)) # данные для проверки

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

model.save('mnist_model.keras')

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

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


Пример использования модели с WebUI

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

Чтобы попробовать приложение в действии и изучить исходный код, посетите мой репозиторий на GitHub.


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


Источник: habr.com

Комментарии: