Обучение искусственной нейронной сети распознаванию нарисованных от руки персонажей Деванагари с помощью PyTorch.
Как следует из названия, нейронные сети во многом вдохновлены нейронами человеческого мозга. Но мы не будем здесь подробно останавливаться на аналогиях с мозгом. Скорее, мы поймем это с помощью математики и кодирования.
Перцептрон
Фрэнк Розенблатт предложил перцептрон в 1950-х годах, показав, что алгоритм может имитировать способность человеческого мозга принимать решения (и мы все еще пытаемся). В своей статье он написал, что мы можем рассматривать вход как нейрон, состоящий из двоичных чисел. Эти двоичные числа могут генерировать одно двоичное число в качестве вывода если и только если вывод соответствует определенному порогу.
Вы можете спросить:
Но, Гопал, мы также можем написать программу для выполнения этой задачи; зачем писать нейронную сеть? Я рад, что вы спросили.
Первая причина выбора нейронной сети перед любой программой заключается в том, что они являются универсальными аппроксиматорами функций, которые определяют, какую модель мы пытаемся построить, или, если она слишком сложна, нейронные сети всегда представляют эту функцию. .
Мы можем представить любую функцию в математических терминах, а затем мы можем использовать нейронную сеть для представления этой функции.
Вторая причина - масштабируемость и гибкость. Мы можем легко складывать слои в нейронные сети, что увеличивает сложность нейронной сети.
Базовая архитектура нейронных сетей
Нейронные сети состоят из следующих компонентов:
- Входной слой, x
- Произвольное количество скрытых слоев
- Выходной слой, 𝑦
- Набор параметров (𝑊) и смещений (𝑏) между каждым слоем, 𝑊 и 𝑏
- Выбор функции активации для каждого скрытого слоя, 𝜎
Мы обучаем нашу нейронную сеть для n итераций; каждая итерация состоит из двух шагов:
- Прямая связь
- Обратное распространение
Обратная связь:
Проще говоря, когда выход первого слоя становится входом следующего слоя. Такие сети называются сетями прямого распространения.
В нашей сети нет петель для обратной передачи информации; он всегда будет подаваться вперед.
Обратное распространение:
Это процесс, в котором наши нейронные сети фактически учатся на обучающих данных.
Но вопрос до сих пор остается без ответа, как наша сеть учится классифицировать или предсказывать? И если наша модель что-то предсказала, то как наша модель может быть уверена, правильное это предсказание или нет?
Ответ - функция потерь; это помогает понять, насколько прогноз нашей сети далек от первоначального значения.
Наша модель предсказала, что цена дома составит 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)
Все идет отлично. :)
использованная литература
Набор данных: