Обучение искусственной нейронной сети распознаванию нарисованных от руки персонажей Деванагари с помощью PyTorch.

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

Перцептрон

Фрэнк Розенблатт предложил перцептрон в 1950-х годах, показав, что алгоритм может имитировать способность человеческого мозга принимать решения (и мы все еще пытаемся). В своей статье он написал, что мы можем рассматривать вход как нейрон, состоящий из двоичных чисел. Эти двоичные числа могут генерировать одно двоичное число в качестве вывода если и только если вывод соответствует определенному порогу.

Вы можете спросить:

Но, Гопал, мы также можем написать программу для выполнения этой задачи; зачем писать нейронную сеть? Я рад, что вы спросили.

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

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

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

Базовая архитектура нейронных сетей

Нейронные сети состоят из следующих компонентов:

  • Входной слой, x
  • Произвольное количество скрытых слоев
  • Выходной слой, 𝑦
  • Набор параметров (𝑊) и смещений (𝑏) между каждым слоем, 𝑊 и 𝑏
  • Выбор функции активации для каждого скрытого слоя, 𝜎

Мы обучаем нашу нейронную сеть для n итераций; каждая итерация состоит из двух шагов:

  1. Прямая связь
  2. Обратное распространение

Обратная связь:

Проще говоря, когда выход первого слоя становится входом следующего слоя. Такие сети называются сетями прямого распространения.

В нашей сети нет петель для обратной передачи информации; он всегда будет подаваться вперед.

Обратное распространение:

Это процесс, в котором наши нейронные сети фактически учатся на обучающих данных.

Но вопрос до сих пор остается без ответа, как наша сеть учится классифицировать или предсказывать? И если наша модель что-то предсказала, то как наша модель может быть уверена, правильное это предсказание или нет?

Ответ - функция потерь; это помогает понять, насколько прогноз нашей сети далек от первоначального значения.

Наша модель предсказала, что цена дома составит 100 тысяч долларов, а первоначальная цена - 101 тысяч долларов, тогда разница между исходной и прогнозируемой будет составлять 1 тысячу долларов; вот какая функция потерь помогает решить нашу сеть.

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

Но насколько нам нужно обновить наши веса и смещения?

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

Думаю, теперь у нас достаточно интуиции, чтобы начать наш раздел кодирования.

Реализация искусственной нейронной сети для классификации нарисованных от руки персонажей Деванагари

Мы будем использовать библиотеку PyTorch для построения нашей нейронной сети.

Я написал небольшую программу plot_images для отображения символов вместе с их метками.

Посмотрим, что у нас есть в нашем CSV-файле.

df.head () предоставит нам 5 верхних столбцов нашего фрейма данных. В нашем наборе данных у нас есть значения пикселей от 0 до 1023. Столбец character для отображения конкретного символа состоит из определенных значений пикселей.

Давайте запустим нашу функцию plot_images и посмотрим на изображения.

>>plot_images(df, 4, "character")

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

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

Итак, в приведенном выше примере кода мы читаем данные и отделяем от них функции и метки. Если вы заметили, я также делю features_numpy на 255,0; Я делаю это для нормализации наших значений пикселей.

Затем я конвертирую наши категориальные метки в коды, потому что мы можем создавать тензорные значения только с числовыми данными.

В нашей функции data_loader мы берем функции и цели; если они есть в данных NumPy, мы конвертируем их в тензоры; после этого мы создаем тензорные данные с помощью torch.utils.data.TensorDataset, и наконец конвертируем данные в загрузчик данных.

Вот и все; наши данные теперь готовы для ввода в модель. А теперь давайте построим нейронную сеть.

В нашей модели ANNModel мы берем 32 * 32, а входное значение выходного измерения в последнем слое - 46. Но у нас есть два новых термина, о которых я еще не говорил.

Отсев: удаляет случайные веса активации со значением вероятности. Допустим, мы установили значение вероятности равным 0,2. Затем для каждого процесса прямой или обратной связи он будет игнорировать 20% нейронов. Это помогает предотвратить переобучение.

Softmax: в математике функция softmax, также известная как softargmax или нормализованная экспоненциальная функция, представляет собой функцию, которая принимает в качестве входных данных вектор из K действительных чисел и нормализует его до распределения вероятностей, состоящего из K вероятностей, пропорциональных экспонентам введенные числа.

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

Тренировочный процесс прост; мы перебираем изображения и метки загрузчика обучающих данных. Затем очищаем начальные значения градиента и потом делаем прогнозы. После запуска вы должны получить точность данных тестирования более 94%.

Невозможно объяснить каждый шаг; пожалуйста, не стесняйтесь спрашивать меня в разделе комментариев.

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

Это выглядит хорошо. :)

Вывод:

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

>> make_predictions(test_loader, 44)

Все идет отлично. :)

использованная литература



Набор данных: