Раньше мы учились создавать разные части нейронных сетей. Для обучения различных версий нашего искусственного интеллекта мы использовали абстрактные обучающие данные. А теперь пришло время использовать реальные данные.

Данные

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

Набор данных MNIST содержит 60 000 помеченных точек данных (изображений) в качестве набора данных для обучения и 10 000 наборов данных для тестирования. Исходные данные хранятся в двоичных файлах, поэтому нам нужно будет выполнить некоторую работу по извлечению. Вы можете найти тот же набор данных на Kaggle в более удобной для пользователя форме, но мы не ищем простого выхода.

Данные в файле IDX файла хранятся как векторы в пространстве многомерных матриц. Чтобы извлечь данные из файла IDX, нам нужно будет разделить каждое измерение матрицы, а затем каждую точку данных, которая в нашем случае будет пикселем. Затем мы будем использовать данные формы метода numpy в виде знакомых нам массивов. А библиотека gzip поможет нам открыть и прочитать файл IDX. Вот как вы это делаете для тренировочного набора:

Вот как мы извлекаем обучающие метки (это одномерный массив, поэтому он короче):

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

Предварительная обработка данных

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

Первый шаг - нормализация. Мы собираемся использовать метод нормализации min-max, который преобразует значения всех пикселей в диапазоне [-1: 1]. -1 - это полностью белый пиксель, а 1 - черный. Нам нужно это сделать, потому что исходные значения пикселей находятся в диапазоне [0: 255], а нейронные сети предпочитают (работают быстрее) работать со значениями от -1 до 1.

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

На третьем этапе мы перетасуем наши данные, чтобы уменьшить дисперсию и сделать модели более общими и не слишком подходящими.

И последний шаг предварительной обработки - изменение формы набора данных меток. Сейчас он представлен в виде массива размером 1x, и каждое значение соответствует каждому изображению из набора обучающих данных. Что нам нужно сделать, так это преобразовать каждую метку в размер массива выходного слоя (в нашем случае 10) и заполнить его нулями. И замените 0 на 1 в индексе, который соответствует номеру в исходном наборе данных меток.

Пакетирование

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

Вот как мы распределяем данные:

И нам нужно будет немного изменить процесс обучения, чтобы загружать по одному пакету за раз:

Обучение и оценка

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

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

Ознакомьтесь с окончательным кодом:

Заключение

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

А вот как наша модель работала с параметрами, объявленными в коде:

Как мы видим, коэффициент ошибок составляет всего 1,97%, это неплохо для нейронной сети, созданной с нуля. Теперь мы можем придумывать варианты использования и создавать приложения, которые будут работать с искусственным интеллектом!

Продолжайте учиться, продолжайте расти!