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

В этой статье мы сосредоточимся на практическом случае, когда нейронные сети оказываются очень интересными:

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

Для этого программа должна уметь «читать» числа на страницах. Это то, что нейронные сети позволяют вам делать.

Обучив нейронную сеть серии нарисованных от руки изображений чисел, она сможет «угадывать», какие цифры есть в телефонном номере вашей старой тети Франсуазы.

Внедрение нейронной сети с нуля

Инициализация

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

  • Матрица весов от входа до скрытого слоя: `weight_ih`
  • Матрица весов от скрытого до выходного слоя: `weight_ho`
  • Матрица смещения для скрытого слоя: `bias_h`
  • Матрица смещения для выходного слоя: `bias_o`
  • Инициализированное обучение произвольное значение: `learningRate`

Метод обучения, оценки и прямой связи

У нас есть три основных метода для реализации:

  • feedforward: функция, которая позволит получить прогноз по одному входу 400 пикселей.
  • train: метод, который будет принимать входные изображения и их метки из набора поездов в качестве аргумента, учитывая, что мы проводим контролируемое обучение.
  • оценка: метод, который будет принимать входные изображения и их метки из тестового набора в качестве аргумента.

Метод прямой связи

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

После этого нам нужно реализовать функцию обучения.
мы начинаем с вычисления ошибок выходного (`output_errors`) и скрытого (`hidden_errors`) слоев по этим формулам:

мы возьмем активации выходного слоя в качестве вывода этой функции

Метод поезда

После этого нам нужно реализовать функцию обучения.
мы начинаем с вычисления ошибок выходного (`output_errors`) и скрытого (`hidden_errors`) слоев по этим формулам:

Получив ошибки для каждого слоя, мы можем вычислить градиенты, чтобы получить значение, на которое мы собираемся скорректировать наши веса ​​(`weight_ih_deltas` и `weight_ho_deltas` ) и смещение(`hidden_gradients` и `output_gradients`).
Для этого воспользуемся формулами линейной регрессии.

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

Метод оценки

Метод оценки позволяет вычислить точность модели на наборе поездов.
Для этого мы просто берем максимальное значение наших выходных данных и заявляем, что это наше прогнозируемое значение.
Затем мы создаем массив, который сравнивает `фактическое` и `прогнозируемое` значение.
Мы добавляем единицу в массив, если прогнозируемое значение равно фактическая единица и ноль, если нет

После этого нам просто нужно вернуть следующий результат:

Применение этой модели к распознаванию рукописных чисел

Модель встала!

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

Очистка данных

Начнем с загрузки наших данных

Как указано в теме, необходимо заменить «10» на 0 в наборе данных.
Для этого мы используем функцию «заменить».

Разделение данных

мы используем метод `scikit Learn` под названием `train_test_split`, чтобы разделить данные на поезд и тестовыйнабор
Здесь мы используем тестовый набор, представляющий 20% нашего набора данных.
этот метод автоматически добавляет данные

Тестируем нашу модель

Для этого мы будем использовать «400» в качестве числа, составляющего входной слой, что дает нам 400 пикселей в каждом изображении.
Мы будем использовать «10» выходных узлов в качестве наших 10 различных возможных значений
Мы используем произвольные «35» узлов для скрытого слоя

Мы используем метод «sample», чтобы перетасовать наши данные перед обучением нашей модели со всем тренировочным набором.

Здесь мы видим MSE, индикатор ошибки модели, который уменьшается по мере прохождения диска.

Мы используем метод `score` для вычисления точности нашей модели.

Таким образом, у нас есть точность 84% на тестовом наборе.

Сравнение точности нашей модели с моделью scikit Learn

Scikit Learn — хорошо известная библиотека для обработки данных Python, она позволит нам иметь точку сравнения.

Нейронная сеть Scikit Learn работает иначе.
Действительно, он будет передавать все наборы данных перед вычислением ошибок.
наборы данных будут повторяться несколько раз.

Модель нейронной сети Scikit Learn дает нам оценку точности 97%.
Это значение можно объяснить тем, как эта нейронная сеть сначала обучает модель, как описано выше, и очень низкой скоростью обучения.

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

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