Всем привет, данная методичка была взята у одного препода в универе в котором я учился. Может кому будет интересно, увы, кодовая база в скриншотах, да и текст как-то странновато написан и тема сисек раскрыта не полностью=) Попозже попробую повторить и переделаю код в текст.
В данной методичке мы познакомимся с основами построения нейронной модели, а также попробуем её обучить, используя датасеты с данными.
Перед началом работы, обязательно удостоверьтесь что у вас есть права администратора, это позволит воспользоваться всеми возможностями компьютера, которых не будет без этих прав.
Стэк технологий которые с которыми мы будем работать:
Обучение нейронных сетей по железной части обычно включает использование специализированных процессоров и ускорителей, таких как графические процессоры (GPU), тензорные процессоры (TPU), аппаратные ускорители для машинного обучения, а также процессоры общего назначения
(CPU). Вот более подробное описание различных методов обучения нейронных сетей в железной части:
Процессоры общего назначения (CPU):
Универсальные вычисления: Процессоры общего назначения, такие как Intel Core или AMD Ryzen, предоставляют универсальные возможности для обучения нейронных сетей и широкий спектр обработки задач.
Многозадачность: CPU эффективно обрабатывают множество задач одновременно, что полезно в контексте обучения нейронных сетей.
Графические процессоры (GPU):
Параллельные вычисления: Графические процессоры предназначены для обработки графики, и их параллельная архитектура делает их эффективными для обучения нейронных сетей, которые требуют интенсивных вычислений.
CUDA и OpenCL: Программные интерфейсы, такие как CUDA (для NVIDIA GPU) и OpenCL (для различных GPU), позволяют разработчикам программировать графические процессоры для выполнения операций машинного обучения.
Тензорные процессоры (TPU):
Оптимизированные для тензорных операций: Тензорные процессоры, такие как Google TPU, созданы специально для выполнения операций, связанных с тензорами, используемыми в глубоком обучении.
Ускорение инференса и обучения: TPU могут быть использованы как для обучения, так и для инференса (применения обученной модели к новым данным).
ASIC (Application-Specific Integrated Circuit):
Специализированные чипы: ASIC представляют собой специализированные интегральные микросхемы, разработанные для выполнения конкретных вычислительных задач. В области машинного обучения могут использоваться ASIC, оптимизированные для операций нейронных сетей.
FPGA (Field-Programmable Gate Array):
Программируемые чипы: FPGA обеспечивают гибкость программирования на уровне аппаратного обеспечения. Они могут быть программированы для выполнения различных вычислительных задач, включая операции нейронных сетей.
В нашем случае нам подходит 2 типа железных мощностей это СPU и GPU, в данной методических указаниях мы рассмотрим эти два вида и сравним их в сложности настройке и в скорости обучения нейронной сети.
Теоретическая часть по популярным библиотекам используемых в создании нейронных сетей:
Существует множество библиотек и фреймворков для создания нейронных сетей, предоставляющих разработчикам мощные инструменты для проектирования, обучения и развертывания искусственных нейронных сетей. Вот несколько популярных библиотек, используемых в создании нейронных сетей:
1. TensorFlow:
Описание: Разработана компанией Google. TensorFlow предоставляет открытый исходный код и широкие возможности для создания различных типов нейронных сетей. Имеет обширное сообщество и много ресурсов для обучения.
Особенности: Гибкость, масштабируемость, поддержка для различных уровней абстракции, включая Keras (встроен в TensorFlow).
2. PyTorch:
Описание: Разработана Facebook. PyTorch является фреймворком с открытым исходным кодом, который активно используется в исследовательских проектах и становится все более популярным в индустрии.
Особенности: Динамический вычислительный граф, интуитивный интерфейс, легко использовать для исследований.
3. Keras:
Описание: Изначально разработана как высокоуровневый интерфейс поверх TensorFlow, Keras теперь поддерживается и другими библиотеками, включая Microsoft Cognitive Toolkit (CNTK) и Theano.
Особенности: Простота использования, понятный интерфейс, хорошая абстракция для быстрого создания моделей нейронных сетей.
4. MXNet:
Описание: Проект Apache MXNet предоставляет гибкий и эффективный фреймворк для глубокого обучения. Он широко используется в индустрии иисследовательских проектах.
Особенности: Масштабируемость, поддержка различных уровней абстракции, включая Gluon, и хорошая производительность.
5. Caffe:
Описание: Caffe является быстрым и эффективным фреймворком для глубокого обучения, который изначально разрабатывался в университете Беркли.
Особенности: Простота использования, высокая производительность в обработке изображений.
6. Theano:
Описание: Theano был одним из первых фреймворков для глубокого обучения, но его активная разработка была прекращена. Однако, он все еще используется в некоторых проектах.
Особенности: Эффективность, оптимизация для работы с GPU.
7. CNTK (Microsoft Cognitive Toolkit):
Описание: Разработан Microsoft. CNTK предоставляет мощные инструменты для обучения глубоких нейронных сетей и был использован в различных исследованиях и приложениях Microsoft.
Особенности: Высокая производительность, поддержка для различных моделей.
Для создания своей модели нейронной сети был выбран TensorFlow из-за своего обширного сообщества позволяющий нам найти множество информации по созданию собственной модели нейросети, а также огромного ресурсного и функционального потенциала при её обучении и настройке.
Как мы видим из представленной статьи на их сайте, для нас на Windows 11 есть 1 вариант установки TensorFlow + СPU и 2 варианта установки TensorFlow + GPU:
1. Это нативная установка, где все компоненты мы устанавливаем целиком на наш компьютер, но обращая внимание на примечание мы видим, что начиная с версии TensorFlow 2.10 и выше, появляются дополнительные особенности при установке и могу возникнуть проблемы (Рисунок 3).
Рисунок 3 – Установка TensorFlow + CPU нативно на Windows
2. Тоже нативная установка, но обращая внимание уже на красную пометку мы видим, что начиная с версии TensorFlow 2.11 и выше не поддерживает графический процессор на нативном уровне, а это значит, что улучшения добавленные в новых версия нам не будут доступны в нативной версии (Рисунок 4).
Рисунок 4 – Установка TensorFlow + GPU нативно на Windows
С помощью Windows WSL2, это что-то вроде обертки Linux под Windows позволяющий запускать на системе Windows, Linux нуждающиеся программы. C помощью этой обертки мы уже можем пользоваться более новыми версиями и функциями для связки установки TensorFlow + GPU (Рисунок 5).
Рисунок 5 – Установка TensorFlow + GPU через Windows WSL2
Ну всё, с не большой теорией мы разобрались, и теперь вы наверное уже пришли к выводу, что если нам нужно более новые версии TensorFlow мы должны работать через Windows WSL2 для GPU и CPU, а если нужны старые, то можно и нативно, но только до определённой версии с GPU, а на CPU это не распространяется, c этим убеждением я с вами соглашусь на 100%, но все это было бы просто замечательно если это на этом было бы всё, но к примеру при работе с нативной версией GPU нам придется разбираться с различными версиями и их совместимостью.
Так как, мы просто не можем скачать IDE, установить через pip Tensorflow и сразу начать работать, если мы хотим использовать GPU нативно, нам нужны определённые драйвера, в нашем случае от компании NVIDIA. Для этого даже была составлена таблица от самих создателей Tensorflow (Рисунок 6).
Рисунок 6 – Таблица с проверенными комбинациями драйверов, версий языков и библиотек для работы с GPU
Хочется отметить, что эта таблица не единственная, есть такая же только уже для CPU (Рисунок 7).
Рисунок 7 – Таблица с проверенными комбинациями драйверов, версий языков и библиотек для работы с CPU
В нашем случае нам не нужна последняя версия библиотеки TensorFlow, поэтому мы будем нативно устанавливать все необходимые нам инструменты и библиотеки, по уже проверенной таблице.
Но в тоже время вы спросите сами себя, почему бы нам не выбрать Windows WSL2, и будете в чем-то правы, мы можем накатить более последнюю версию библиотеки, но уже там придется подбирать самому все драйвера и версии по совместимости, так как таких проверенных таблиц как рисунок 6-7 нету, и тут вы выходите в открытое плаванье с перебором разных версий той или иной программы и библиотеки, что сильно усложнит процесс.
В следующем шаге надо скачать и установить miniconda3, что мы и делаем (ссылка на скачивание): https://docs.conda.io/projects/miniconda/en/latest/
Нажимаем на файл как показано на рисунке 8.
Рисунок 8 – Скачиваем файл программы miniconda3
Обратите внимание что при установке miniconda3, папка пользователя в каталоге Users, не должна иметь название на русском языке, её название должно быть на английском языке, во избежание конфликтов.
Рисунок 10 – Реализация команды
После того как всё скачалось и установилось, активируем конду через команду: conda activate tf_gpu.
Далее используем команду: conda list
И начинаем проверять какие файлы установились, искать надо только основные, а это:
На рисунке 11, показано как применены команды и частичный список установленных файлов.
Рисунок 11 – Команда активации и списка установленных файлов
В моем случае всё установилось правильно, только версия у нас numpy 1.26.2, а нужна 1.23.0, поэтому используем команду (Рисунок 12):
Рисунок 12 – Установка Numpy 1.23.0
Далее нам подсказывает сама консоль, что не хватает keras версии >=2.4.0, поэтому мы установим его, команда (Рисунок 13):
Рисунок 13 – Установка keras 2.6.0
Остается только второстепенные файлы и их команды:
После этой команды появляется не совместимость с google-auth но это мы исправляем командой:
Далее:
И на последок установим Matplotlib версии 3.7, он поможет нам в будующем при создании окна для рисования, команда:
Теперь деактивируем конду командой:
И запускаем Visual Studio Code, для проверки работы TensorFlow + GPU
После запуска сразу переходим в панель плагинов и устанавливаем Python и Russian Language Pack, первый нам нужен для того, чтобы работать с языком Python, второй что бы русский язык был в Visual Studio Code (Рисунок 14).
Рисунок 14 – Установка необходимых плагинов
Теперь смело нажимаем создать файл и выбираем файл Python (Рисунок 15).
Рисунок 15 – Создание проекта на языке Python
В новом проекте пишем вот такой код (Рисунок 16):
Рисунок 16 – Код для проверки TensorFlow + GPU
Перед запуском обязательно выберете нужный нам интерпретатор, в нашем случае это Python 3.9.18 (‘tf_gpu’), как это можно сделать показано на рисунке 17
Рисунок 17 – Выбор интерпретатора Python 3.9.18 (‘tf_gpu’)
Теперь сохраняем файл, через меню файл – сохранить как, и запускаем наш код.
Если в ответе в консоли будет возвращать информацию о видеокарты и фразу GPU доступен, то TensorFlow + GPU работает и использует установленные CUDA и cuDNN правильно (Рисунок 18).
Так же код возвращает доступность TensorFlow + СPU, но это условно, так как если к GPU не подключается, то по умолчанию начинает работать CPU, а он работает в любом случае, если есть установленый TensorFlow любой версии.
Рисунок 18 – Проверка работы TensorFlow + GPU
Установка TensorFlow + CPU
Теперь давайте для проверки скорости и сложности настройки установим также и все зависимости для CPU. Для этого откроим так же поиск и напишем miniconda, далее откроим то, что показано на рисунке 19
Рисунок 19 – Открываем miniconda3
Теперь в консоли пишем команду и устанавливаем (Рисунок 20):
Рисунок 20 – Реализация команды
После того как всё скачалось и установилось, активируем конду через команду: conda activate tf_cpu.
Далее используем команду:
И начинаем проверять какие файлы установились, искать надо только основные, а это:
На рисунке 21, показано как применены команды и частичный список установленных файлов.
Рисунок 21 – Команда активации и списка установленных файлов
Так же установим Matplotlib версии 3.7, он поможет нам в будующем при создании окна для рисования, команда:
Рисунок 22 – Установка Matplotlib 3.7
После окончания установки библиотеки Matplotlib деактивируем конду командой: conda deactivate
Открываем Visual Studio Code, и то же проект что мы делали для GPU, код тоже берем из раздела про GPU.
Рисунок 23 – Код для проверки TensorFlow + CPU
Перед запуском обязательно выберете нужный нам интерпретатор, в нашем случае это Python 3.10.13 (‘tf_cpu’), как это можно сделать показано на рисунке 24
Рисунок 24 – Выбор интерпретатора Python 3.10.13 (‘tf_cpu’)
Теперь проверим есть ли доступность к CPU и GPU, в этот раз должно показать, что GPU не найдено (Рисунок 25)
Рисунок 25 – Проверка доступности
На этом часть подготовки конфигурации закончена.
Что бы создать уже обученную нейронную сеть, которая сможет распознать или структурировать определённые данные нам нужны 3 основные вещи, это:
1. DataSet с данными:
В нашем случае это будет набор данных MNIST состоящий из различных рукописных цифр в размере 60 тыс. разбитых по папкам для каждой вариации цифры от 0 до 9 (Рисунок 26).
Файл с цифрами будет прикреплен с этой методичкой. (Я его потом прикреплю).
Рисунок 26 – DataSet из рукописных цифр
2. Сама модель нейронной сети:
В нашей задачи по распознаванию рукописных цифр нам идеально подходит сверточная нейронной сеть с применением Pooling (Рисунок 27).
Рисунок 27 – Топология сверточной нейронной сети
Примечание!! Сверточная нейронная сеть — это не единственный подход для построений нейронов в модели машинного обучения, их существует огромное множество, и для большего понимания рекомендуется ознакомится с этой информации в более специализированных источниках информации посвященных изучению для каких задач берутся те или иные подходы в построение нейронных сетей.
3. Проверка работоспособности обученной модели:
В приведённом примере ниже мы будем использовать холст для рисования рукописных цифр, после чего нам будет выдаваться ответ, о том, как понимает и распознает нашу цифры уже обученная нейронная сеть (Рисунок 28).
Рисунок 28 – Холст для проверки распознавания
Теория применение метода Pooling в сверточной нейронной сети
Конвергентные (сверточные) нейронные сети предназначены для работы с изображениями. Основной задачей при работе с изображениями является распознавание различных объектов на изображении, таких как люди, животные, цифры, буквы и так далее.
Однако очень трудно найти что-то в изображении, если рассматривать каждый пиксель по отдельности. Вместо этого сверточные нейронные сети используют скользящие окна (также известные как ядра), которые рассматривают группы пикселей. Предполагается, что нейронная сеть будет распознавать небольшие особенности, такие как "края" или "кривые". После распознавания можно использовать комбинацию краев и кривых в другом слое для определения формы (квадрат, круг или другие более сложные формы).
Рассмотрим данный процесс на теоретическом изображении цифры, в нашем случае – числа 2, с моделируя на нем пиксели (рисунок 29).
Рисунок 29 – Разбиение изображения числа 2 на условные пиксели
Предположим, что каждый квадрат — это пиксель. Для начала свертки возьмем произвольное квадратное окно со стороной в n пикселей. Эти свойства объединяются в одну новую карту характеристик.
Затем операция повторяется путем перемещения окна для получения новой карты характеристик (рисунок 30).
Рисунок 30 – Перемещение карты характеристик по изображению
Продолжаем этот процесс получения новой карты характеристик, пока не охватим полностью все наше изображение.
По итогу получим данные по картам характеристик (рисунок 31) с расставленными индексами степени приоритизации в зависимости от количества вхождений нашей цифры 2 в область генерируемой карты характеристик.
Рисунок 31 – Данные по картам характеристик в зависимости от покрытия искомой цифры
Теперь мы будем делать пулинг (или операцию подвыборки). Допустим, наша ранее проделанная с помощью карт характеристик свертка дала следующую матрицу, представленную на рисунке 32.
Рисунок 32 – Матрица свертки обрабатываемого изображения Сейчас берем окно для пулинга (или фильтра) размером 3x3.
Самая распространенная форма операции пулинга называется макспулинг (Max-pooling).
В данном случае мы просто берем максимальное число (это число является весом, описывающим степень совпадения искомого элемента изображения, в нашем случае – цифры 2) из окна нашей матрицы, и оно становиться новым значением этого сегмента (рисунок 33).
Рисунок 33 – Выбор максимального значения методом макспулинга
Продолжая данный процесс до конца, мы получим примерно то, что изображено на рисунке 34. Так примерно и выглядит процесс распознавания сверточной нейронной сетью различных объектов, которые мы используем в своей работе для распознавания рукописных цифр.
Во многих случаях один или несколько полностью связанных слоев могут быть размещены после слоя свертки, с дополнительным выходным слоем. Однако выходной слой также может быть размещен сразу после слоя свертки.
По сути, сверточная нейронная сеть сначала ищет низкоуровневые объекты, такие как линии и кривые, затем их комбинации и так далее.
Рисунок 34 – Полученная подвыборка методом макспулинга матрицы весов необходимая для снижения размерности входного тензора
Листинг кодаДля начала пропишем модули (библиотеки), которые нам нужно подключить для использования возможностей Tensorflow, MatPolib и Path (рисунок 35).
Рисунок 35 – Подключаемые модули.
Начнем составлять описывать путь для данных и их свойства, такие как Аугментация (Рисунок 36).
Рисунок 36 – Аугментация и загрузка данных
Далее для обучения нам нужно поделить данные на тренировочные и валидационные, на одних база данных будет себя тренировать, а на других проверять, выводя отчет как она узнает те или иные цифры, т.е. процент ошибок и процент точности (Рисунок 37).
Данные будут поделены в соотношении 80/20, 80 процентов – тренировочные, 20 процентов – валидационные.
Рисунок 37 – Создание тренировочного и валидационного набора данных
Теперь надо добавить необходимые свойства которые помогут улучшить и оптимизировать обучения модели при работе с тренировочным и валидационным набором данных (Рисунок 38).
Рисунок 38 – Необходимые свойства по оптимизации тренировочного и валидационного набора данных
Переходим к одному из самых главных вещей в создании нейронной сети, а это создание модели с нейронами (Рисунок 39).
Рисунок 39 – Создание модели с нейронной сети
Далее надо создать ещё два метода один для компиляции модели, второй для свойств обучения модели (Рисунок 40).
Рисунок 40 – Компиляция и свойства обучения модели
На этом моменте мы уже написали все составляющие модели нейронной сети, и она является готовой.
Переходим к проверке работоспособности модели, для этого будем создавать холст для рисования, создадим новый класс DrawingApp, и опишем первый метод __init__ (Рисунок 41)
Рисунок 41 – Компиляция и свойства обучения модели
Теперь допишем методы для рисования курсором, очистки холста, распознавания цифры и получения самого изображения с холста (Рисунок 42)
Рисунок 42 – Создание методов для рисования курсором, очистки холста, распознавания цифры и получения самого изображения с холста.
И в заключении создаем окно и отображаем его на экране (Рисунок 43)
Рисунок 43 – Создание окна и отображение его на экране
Тесты и визуализация результата
Исходные конфигурации для тестов нейронной сети:
Для тестирования работоспособности СPU при обучении нашей нейронной сети выбираем интерпретатор Python 3.10.13 (‘tf_cpu’).
Время, затраченное на обучения каждой из 5 эпох (Рисунок 44)
Рисунок 44 – Затраты времени при использовании CPU
TensorFlow + GPU
Для тестирования работоспособности GPU при обучении нашей нейронной сети выбираем интерпретатор Python 3.9.18 (‘tf_gpu’).
Время, затраченное на обучения каждой из 5 эпох (Рисунок 45)
Рисунок 45 – Затраты времени при использовании GPU
Итог
Как мы видим разница в скорости обучения практически в 2 раза, что позволит обучать и создавать различные нейронные сети быстрее, что на счет качества распознавания, то они довольно скудные при 5 эпохах Val_loss: 0.23 что очень много, с таким результатом из 10 цифр нейронная сесть распознает только 3 цифры. Для улучшения результата повысив количество эпох до 10, и проверим результат (Рисунок 46).
Рисунок 46 – Результат 10 эпох
Как мы видим увеличение количества эпох до 10 улучшило распознавание Val_loss: 0.18, с таким результатом из 10 цифр нейронная сесть распознает уже 5 цифр, что может не радовать (Рисунок 47).
Рисунок 47 – Результат распознавания
В данной методичке мы познакомимся с основами построения нейронной модели, а также попробуем её обучить, используя датасеты с данными.
Перед началом работы, обязательно удостоверьтесь что у вас есть права администратора, это позволит воспользоваться всеми возможностями компьютера, которых не будет без этих прав.
Стэк технологий которые с которыми мы будем работать:
Таблица 1 – Список технического оборудования (конфигурация системы которую использовал преподаватель)
| Железо/ Прогр. Обеспеч. | Версия | Описание |
| Windows 11 64-bit | 22H2 | Операционная система, выпущенная Microsoft, представляет собой последнюю версию линейки операционных систем Windows |
| AMD Ryzen 7 | 4800HS | Представляет собой процессор, разработанный и выпущенный компанией Advanced Micro Devices (AMD). Этот процессор предназначен для высокопроизводительных настольных и мобильных систем. |
| NVIDIA GeForce GTX | 1650ti | Графический процессор (GPU), производимый компанией NVIDIA и предназначенный для использования в геймерских компьютерах, ноутбуках и рабочих станциях. |
Таблица 2 – Список используемых библиотек и технологий
| Приложение/ библиотека | Версия | Описание |
| Microsoft Visual Studio Code | 1.18.5 | Среда разработки, где можно использовать язык программирования Python для последующего создания нейронной сети. |
| Miniconda3 | 23.9.0 | Облегченная версия дистрибутива Conda. Является пакетным менеджером и средой управления пакетами для языков программирования, в нашем случае для Python. Conda позволяет легко устанавливать, обновлять и управлять зависимостями пакетов и окружениями. |
| TensorFlow | 2.6.0 | Открытая библиотека машинного обучения, разработанная и поддерживаемая Google. Предназначена для построения и обучения различных моделей машинного обучения, особенно для задач работы с данными, связанными с искусственным интеллектом и глубоким обучением. |
| Numpy | 1.23.0 | Библиотека с открытым исходным кодом для языка программирования Python. Возможности: поддержка многомерных массивов; поддержка высокоуровневых математических функций, предназначенных для работы с многомерными массивами. |
| Matplotlib | 3.7.0 | Библиотека на языке программирования Python для визуализации данных двумерной графикой. Получаемые изображения могут быть использованы в качестве иллюстраций в публикациях. |
| Pillow | 10.1.0 | Библиотека Python для работы с изображениями. Предоставляет простой и удобный интерфейс для открытия, обработки и сохранения различных форматов изображений. |
| Protobuf | 3.17.2 | Метод сериализации данных, разработанный Google. Протокол предоставляет эффективный и универсальный способ обмена структурированными данными между разными системами и языками программирования. Используется для передачи данных между компонентами распределенных систем, обмена сообщениями в сетевых протоколах и хранения данных. |
| Python | 3.9.18 | Высокоуровневый, интерпретируемый, объектно-ориентированный язык программирования. |
| cuDNN NVIDIA | 8.2.1 | Библиотека примитивов с ускорением на GPU для глубоких нейронных сетей. cuDNN предоставляет хорошо настроенные реализации для стандартных процедур, таких как прямая и обратная свертка, объединение, нормализация и уровни активации. |
| CUDA Toolkit | 11.3.1 | Набор инструментов NVIDIA® CUDA® Toolkit предоставляет среду разработки для создания высокопроизводительных приложений с ускорением на GPU. |
Подготовка платформы для начала работ
Теоретическая часть по вычислительным мощностям применяемых в машинном обучении:
Обучение нейронных сетей по железной части обычно включает использование специализированных процессоров и ускорителей, таких как графические процессоры (GPU), тензорные процессоры (TPU), аппаратные ускорители для машинного обучения, а также процессоры общего назначения
(CPU). Вот более подробное описание различных методов обучения нейронных сетей в железной части:
Процессоры общего назначения (CPU):
Универсальные вычисления: Процессоры общего назначения, такие как Intel Core или AMD Ryzen, предоставляют универсальные возможности для обучения нейронных сетей и широкий спектр обработки задач.
Многозадачность: CPU эффективно обрабатывают множество задач одновременно, что полезно в контексте обучения нейронных сетей.
Графические процессоры (GPU):
Параллельные вычисления: Графические процессоры предназначены для обработки графики, и их параллельная архитектура делает их эффективными для обучения нейронных сетей, которые требуют интенсивных вычислений.
CUDA и OpenCL: Программные интерфейсы, такие как CUDA (для NVIDIA GPU) и OpenCL (для различных GPU), позволяют разработчикам программировать графические процессоры для выполнения операций машинного обучения.
Тензорные процессоры (TPU):
Оптимизированные для тензорных операций: Тензорные процессоры, такие как Google TPU, созданы специально для выполнения операций, связанных с тензорами, используемыми в глубоком обучении.
Ускорение инференса и обучения: TPU могут быть использованы как для обучения, так и для инференса (применения обученной модели к новым данным).
ASIC (Application-Specific Integrated Circuit):
Специализированные чипы: ASIC представляют собой специализированные интегральные микросхемы, разработанные для выполнения конкретных вычислительных задач. В области машинного обучения могут использоваться ASIC, оптимизированные для операций нейронных сетей.
FPGA (Field-Programmable Gate Array):
Программируемые чипы: FPGA обеспечивают гибкость программирования на уровне аппаратного обеспечения. Они могут быть программированы для выполнения различных вычислительных задач, включая операции нейронных сетей.
В нашем случае нам подходит 2 типа железных мощностей это СPU и GPU, в данной методических указаниях мы рассмотрим эти два вида и сравним их в сложности настройке и в скорости обучения нейронной сети.
Теоретическая часть по популярным библиотекам используемых в создании нейронных сетей:
Существует множество библиотек и фреймворков для создания нейронных сетей, предоставляющих разработчикам мощные инструменты для проектирования, обучения и развертывания искусственных нейронных сетей. Вот несколько популярных библиотек, используемых в создании нейронных сетей:
1. TensorFlow:
Описание: Разработана компанией Google. TensorFlow предоставляет открытый исходный код и широкие возможности для создания различных типов нейронных сетей. Имеет обширное сообщество и много ресурсов для обучения.
Особенности: Гибкость, масштабируемость, поддержка для различных уровней абстракции, включая Keras (встроен в TensorFlow).
2. PyTorch:
Описание: Разработана Facebook. PyTorch является фреймворком с открытым исходным кодом, который активно используется в исследовательских проектах и становится все более популярным в индустрии.
Особенности: Динамический вычислительный граф, интуитивный интерфейс, легко использовать для исследований.
3. Keras:
Описание: Изначально разработана как высокоуровневый интерфейс поверх TensorFlow, Keras теперь поддерживается и другими библиотеками, включая Microsoft Cognitive Toolkit (CNTK) и Theano.
Особенности: Простота использования, понятный интерфейс, хорошая абстракция для быстрого создания моделей нейронных сетей.
4. MXNet:
Описание: Проект Apache MXNet предоставляет гибкий и эффективный фреймворк для глубокого обучения. Он широко используется в индустрии иисследовательских проектах.
Особенности: Масштабируемость, поддержка различных уровней абстракции, включая Gluon, и хорошая производительность.
5. Caffe:
Описание: Caffe является быстрым и эффективным фреймворком для глубокого обучения, который изначально разрабатывался в университете Беркли.
Особенности: Простота использования, высокая производительность в обработке изображений.
6. Theano:
Описание: Theano был одним из первых фреймворков для глубокого обучения, но его активная разработка была прекращена. Однако, он все еще используется в некоторых проектах.
Особенности: Эффективность, оптимизация для работы с GPU.
7. CNTK (Microsoft Cognitive Toolkit):
Описание: Разработан Microsoft. CNTK предоставляет мощные инструменты для обучения глубоких нейронных сетей и был использован в различных исследованиях и приложениях Microsoft.
Особенности: Высокая производительность, поддержка для различных моделей.
Для создания своей модели нейронной сети был выбран TensorFlow из-за своего обширного сообщества позволяющий нам найти множество информации по созданию собственной модели нейросети, а также огромного ресурсного и функционального потенциала при её обучении и настройке.
Скачиваем и устанавливаем необходимый набор ПО
Для начала скачаем IDE для работы с кодом, в нашем случае это будет всем известный Visual Studio Code (ссылка на скачивание): https://code.visualstudio.com/Нажимаем кнопку Dowload for Free, и ожидаем окончания загрузки файла
(Рисунок 1).
Рисунок 1 – Скачиваем Visual Studio Code
Далее устанавливаем программу оставляя все галочки по умолчанию. По окончанию установки не запускаем программу и жмем кнопку завершить (Рисунок 2).
Рисунок 2 – Завершение установки
Теперь у нас появляется два этапа как дальше продолжить построение платформы, для этого перейдем на официальный сайт TensorFlow и посмотрим, что там говорят по установке и настройке для работы с их библиотекой (ссылка на сайт): https://www.tensorflow.org/install/pip?hl=ru#windows-native(Рисунок 1).
Рисунок 1 – Скачиваем Visual Studio Code
Далее устанавливаем программу оставляя все галочки по умолчанию. По окончанию установки не запускаем программу и жмем кнопку завершить (Рисунок 2).
Рисунок 2 – Завершение установки
Как мы видим из представленной статьи на их сайте, для нас на Windows 11 есть 1 вариант установки TensorFlow + СPU и 2 варианта установки TensorFlow + GPU:
1. Это нативная установка, где все компоненты мы устанавливаем целиком на наш компьютер, но обращая внимание на примечание мы видим, что начиная с версии TensorFlow 2.10 и выше, появляются дополнительные особенности при установке и могу возникнуть проблемы (Рисунок 3).
Рисунок 3 – Установка TensorFlow + CPU нативно на Windows
2. Тоже нативная установка, но обращая внимание уже на красную пометку мы видим, что начиная с версии TensorFlow 2.11 и выше не поддерживает графический процессор на нативном уровне, а это значит, что улучшения добавленные в новых версия нам не будут доступны в нативной версии (Рисунок 4).
Рисунок 4 – Установка TensorFlow + GPU нативно на Windows
Рисунок 5 – Установка TensorFlow + GPU через Windows WSL2
Так как, мы просто не можем скачать IDE, установить через pip Tensorflow и сразу начать работать, если мы хотим использовать GPU нативно, нам нужны определённые драйвера, в нашем случае от компании NVIDIA. Для этого даже была составлена таблица от самих создателей Tensorflow (Рисунок 6).
Рисунок 6 – Таблица с проверенными комбинациями драйверов, версий языков и библиотек для работы с GPU
Хочется отметить, что эта таблица не единственная, есть такая же только уже для CPU (Рисунок 7).
Рисунок 7 – Таблица с проверенными комбинациями драйверов, версий языков и библиотек для работы с CPU
В нашем случае нам не нужна последняя версия библиотеки TensorFlow, поэтому мы будем нативно устанавливать все необходимые нам инструменты и библиотеки, по уже проверенной таблице.
Но в тоже время вы спросите сами себя, почему бы нам не выбрать Windows WSL2, и будете в чем-то правы, мы можем накатить более последнюю версию библиотеки, но уже там придется подбирать самому все драйвера и версии по совместимости, так как таких проверенных таблиц как рисунок 6-7 нету, и тут вы выходите в открытое плаванье с перебором разных версий той или иной программы и библиотеки, что сильно усложнит процесс.
Установка TensorFlow + GPU
Перейдя к инструкции по установке TensorFlow + GPU нативно, мы видем что надо проверить установлены ли все Microsoft Visual C++ для Visual Studio 2015, 2017 и 2019 для вашей платформы, у меня это уже установлено поэтому я перехожу к следующему шагу, но если у вас нет то установите их (ссылка на установку): https://learn.microsoft.com/ru-RU/cpp/windows/latest-supported-vc-redist?view=msvc-170В следующем шаге надо скачать и установить miniconda3, что мы и делаем (ссылка на скачивание): https://docs.conda.io/projects/miniconda/en/latest/
Нажимаем на файл как показано на рисунке 8.
Рисунок 8 – Скачиваем файл программы miniconda3
Обратите внимание что при установке miniconda3, папка пользователя в каталоге Users, не должна иметь название на русском языке, её название должно быть на английском языке, во избежание конфликтов.
После установки открываем поиск и пишем miniconda3, и в результатах поиска выбираем Anaconda Powershell Prompt (Рисунок 9).
Рисунок 9 – Открываем miniconda3
В открытом окне пишем команду и нажимаем Enter: conda create --name tf_gpu tensorflow-gpu
Рисунок 9 – Открываем miniconda3
Рисунок 10 – Реализация команды
После того как всё скачалось и установилось, активируем конду через команду: conda activate tf_gpu.
Далее используем команду: conda list
И начинаем проверять какие файлы установились, искать надо только основные, а это:
Код:
Cudatoolkit, cudnn, numpy, pip, protobuf, python, tensorflow, tensorflow-gpu
Рисунок 11 – Команда активации и списка установленных файлов
В моем случае всё установилось правильно, только версия у нас numpy 1.26.2, а нужна 1.23.0, поэтому используем команду (Рисунок 12):
pip install Numpy==1.23.0
Рисунок 12 – Установка Numpy 1.23.0
pip install keras==2.6.0
Рисунок 13 – Установка keras 2.6.0
Остается только второстепенные файлы и их команды:
Bash:
pip install flatbuffers==1.12
pip install absl-py==0.10
После этой команды появляется не совместимость с google-auth но это мы исправляем командой:
pip install google-auth==1.9Далее:
pip install clang==5.0И на последок установим Matplotlib версии 3.7, он поможет нам в будующем при создании окна для рисования, команда:
pip install Matplotlib==3.7Теперь деактивируем конду командой:
conda deactivateИ запускаем Visual Studio Code, для проверки работы TensorFlow + GPU
После запуска сразу переходим в панель плагинов и устанавливаем Python и Russian Language Pack, первый нам нужен для того, чтобы работать с языком Python, второй что бы русский язык был в Visual Studio Code (Рисунок 14).
Рисунок 14 – Установка необходимых плагинов
Рисунок 15 – Создание проекта на языке Python
В новом проекте пишем вот такой код (Рисунок 16):
Python:
import tensorflow as tf
# Проверка доступности GPU
if tf.test.gpu_device_name():
print("GPU доступен.")
else:
print("GPU не доступен.")
# Проверка доступности CPU
if tf.config.list_physical_devices('CPU'):
print("CPU доступен.")
else:
print("CPU не доступен.")
Рисунок 16 – Код для проверки TensorFlow + GPU
Перед запуском обязательно выберете нужный нам интерпретатор, в нашем случае это Python 3.9.18 (‘tf_gpu’), как это можно сделать показано на рисунке 17
Рисунок 17 – Выбор интерпретатора Python 3.9.18 (‘tf_gpu’)
Теперь сохраняем файл, через меню файл – сохранить как, и запускаем наш код.
Если в ответе в консоли будет возвращать информацию о видеокарты и фразу GPU доступен, то TensorFlow + GPU работает и использует установленные CUDA и cuDNN правильно (Рисунок 18).
Так же код возвращает доступность TensorFlow + СPU, но это условно, так как если к GPU не подключается, то по умолчанию начинает работать CPU, а он работает в любом случае, если есть установленый TensorFlow любой версии.
Рисунок 18 – Проверка работы TensorFlow + GPU
Установка TensorFlow + CPU
Рисунок 19 – Открываем miniconda3
Теперь в консоли пишем команду и устанавливаем (Рисунок 20):
conda create --name tf_cpu tensorflow
Рисунок 20 – Реализация команды
После того как всё скачалось и установилось, активируем конду через команду: conda activate tf_cpu.
Далее используем команду:
conda listИ начинаем проверять какие файлы установились, искать надо только основные, а это:
Код:
Numpy, pip, protobuf, python, tensorflow
На рисунке 21, показано как применены команды и частичный список установленных файлов.
Рисунок 21 – Команда активации и списка установленных файлов
Так же установим Matplotlib версии 3.7, он поможет нам в будующем при создании окна для рисования, команда:
pip install Matplotlib==3.7
Рисунок 22 – Установка Matplotlib 3.7
Открываем Visual Studio Code, и то же проект что мы делали для GPU, код тоже берем из раздела про GPU.
Рисунок 23 – Код для проверки TensorFlow + CPU
Перед запуском обязательно выберете нужный нам интерпретатор, в нашем случае это Python 3.10.13 (‘tf_cpu’), как это можно сделать показано на рисунке 24
Рисунок 24 – Выбор интерпретатора Python 3.10.13 (‘tf_cpu’)
Теперь проверим есть ли доступность к CPU и GPU, в этот раз должно показать, что GPU не найдено (Рисунок 25)
Рисунок 25 – Проверка доступности
На этом часть подготовки конфигурации закончена.
Создание модели нейронной сети по распознаванию рукописных цифр в реальном времени
Что бы создать уже обученную нейронную сеть, которая сможет распознать или структурировать определённые данные нам нужны 3 основные вещи, это:
1. DataSet с данными:
В нашем случае это будет набор данных MNIST состоящий из различных рукописных цифр в размере 60 тыс. разбитых по папкам для каждой вариации цифры от 0 до 9 (Рисунок 26).
Файл с цифрами будет прикреплен с этой методичкой. (Я его потом прикреплю).
Рисунок 26 – DataSet из рукописных цифр
2. Сама модель нейронной сети:
В нашей задачи по распознаванию рукописных цифр нам идеально подходит сверточная нейронной сеть с применением Pooling (Рисунок 27).
Рисунок 27 – Топология сверточной нейронной сети
3. Проверка работоспособности обученной модели:
В приведённом примере ниже мы будем использовать холст для рисования рукописных цифр, после чего нам будет выдаваться ответ, о том, как понимает и распознает нашу цифры уже обученная нейронная сеть (Рисунок 28).
Рисунок 28 – Холст для проверки распознавания
Теория применение метода Pooling в сверточной нейронной сети
Однако очень трудно найти что-то в изображении, если рассматривать каждый пиксель по отдельности. Вместо этого сверточные нейронные сети используют скользящие окна (также известные как ядра), которые рассматривают группы пикселей. Предполагается, что нейронная сеть будет распознавать небольшие особенности, такие как "края" или "кривые". После распознавания можно использовать комбинацию краев и кривых в другом слое для определения формы (квадрат, круг или другие более сложные формы).
Рассмотрим данный процесс на теоретическом изображении цифры, в нашем случае – числа 2, с моделируя на нем пиксели (рисунок 29).
Рисунок 29 – Разбиение изображения числа 2 на условные пиксели
Предположим, что каждый квадрат — это пиксель. Для начала свертки возьмем произвольное квадратное окно со стороной в n пикселей. Эти свойства объединяются в одну новую карту характеристик.
Затем операция повторяется путем перемещения окна для получения новой карты характеристик (рисунок 30).
Рисунок 30 – Перемещение карты характеристик по изображению
Продолжаем этот процесс получения новой карты характеристик, пока не охватим полностью все наше изображение.
По итогу получим данные по картам характеристик (рисунок 31) с расставленными индексами степени приоритизации в зависимости от количества вхождений нашей цифры 2 в область генерируемой карты характеристик.
Рисунок 31 – Данные по картам характеристик в зависимости от покрытия искомой цифры
Теперь мы будем делать пулинг (или операцию подвыборки). Допустим, наша ранее проделанная с помощью карт характеристик свертка дала следующую матрицу, представленную на рисунке 32.
Рисунок 32 – Матрица свертки обрабатываемого изображения Сейчас берем окно для пулинга (или фильтра) размером 3x3.
Самая распространенная форма операции пулинга называется макспулинг (Max-pooling).
В данном случае мы просто берем максимальное число (это число является весом, описывающим степень совпадения искомого элемента изображения, в нашем случае – цифры 2) из окна нашей матрицы, и оно становиться новым значением этого сегмента (рисунок 33).
Рисунок 33 – Выбор максимального значения методом макспулинга
Продолжая данный процесс до конца, мы получим примерно то, что изображено на рисунке 34. Так примерно и выглядит процесс распознавания сверточной нейронной сетью различных объектов, которые мы используем в своей работе для распознавания рукописных цифр.
Во многих случаях один или несколько полностью связанных слоев могут быть размещены после слоя свертки, с дополнительным выходным слоем. Однако выходной слой также может быть размещен сразу после слоя свертки.
По сути, сверточная нейронная сеть сначала ищет низкоуровневые объекты, такие как линии и кривые, затем их комбинации и так далее.
Рисунок 34 – Полученная подвыборка методом макспулинга матрицы весов необходимая для снижения размерности входного тензора
Листинг кода
Рисунок 35 – Подключаемые модули.
Начнем составлять описывать путь для данных и их свойства, такие как Аугментация (Рисунок 36).
Рисунок 36 – Аугментация и загрузка данных
Далее для обучения нам нужно поделить данные на тренировочные и валидационные, на одних база данных будет себя тренировать, а на других проверять, выводя отчет как она узнает те или иные цифры, т.е. процент ошибок и процент точности (Рисунок 37).
Данные будут поделены в соотношении 80/20, 80 процентов – тренировочные, 20 процентов – валидационные.
Рисунок 37 – Создание тренировочного и валидационного набора данных
Теперь надо добавить необходимые свойства которые помогут улучшить и оптимизировать обучения модели при работе с тренировочным и валидационным набором данных (Рисунок 38).
Рисунок 38 – Необходимые свойства по оптимизации тренировочного и валидационного набора данных
Переходим к одному из самых главных вещей в создании нейронной сети, а это создание модели с нейронами (Рисунок 39).
Рисунок 39 – Создание модели с нейронной сети
Далее надо создать ещё два метода один для компиляции модели, второй для свойств обучения модели (Рисунок 40).
Рисунок 40 – Компиляция и свойства обучения модели
На этом моменте мы уже написали все составляющие модели нейронной сети, и она является готовой.
Переходим к проверке работоспособности модели, для этого будем создавать холст для рисования, создадим новый класс DrawingApp, и опишем первый метод __init__ (Рисунок 41)
Рисунок 41 – Компиляция и свойства обучения модели
Теперь допишем методы для рисования курсором, очистки холста, распознавания цифры и получения самого изображения с холста (Рисунок 42)
Рисунок 42 – Создание методов для рисования курсором, очистки холста, распознавания цифры и получения самого изображения с холста.
И в заключении создаем окно и отображаем его на экране (Рисунок 43)
Рисунок 43 – Создание окна и отображение его на экране
Тесты и визуализация результата
Исходные конфигурации для тестов нейронной сети:
- Одинаковый исходный код
- Количество эпох равное 5
Тесты и визуализация результата
TensorFlow + СPU
TensorFlow + СPU
Для тестирования работоспособности СPU при обучении нашей нейронной сети выбираем интерпретатор Python 3.10.13 (‘tf_cpu’).
Время, затраченное на обучения каждой из 5 эпох (Рисунок 44)
Рисунок 44 – Затраты времени при использовании CPU
TensorFlow + GPU
Время, затраченное на обучения каждой из 5 эпох (Рисунок 45)
Рисунок 45 – Затраты времени при использовании GPU
Итог
Рисунок 46 – Результат 10 эпох
Как мы видим увеличение количества эпох до 10 улучшило распознавание Val_loss: 0.18, с таким результатом из 10 цифр нейронная сесть распознает уже 5 цифр, что может не радовать (Рисунок 47).
Рисунок 47 – Результат распознавания
Последнее редактирование: