README.md

Neon - создание и исследование простых нейронных сетей

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

Neon представляет из себя десктопную программу, реализованую на платформе Avalonia с использованием паттерна MVVM и фреймворка ReactiveUI. Работа программы поддерживается в системах Windows и Linux.

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

На данный момент программа поддерживает работу с наборами данный MNIST. Подробное описание доступно на http://yann.lecun.com/exdb/mnist/.

Описание нового набора данных создается отдельным пунктом меню программы. При этом указывается имя набора данных и имя файла. Также указывается каталог с бинарными файлами и имена файлов с метками и образцами. Описание набора данных хранится в каталоге программы database/datasets под указанным именем файла с расширением ds. Каталог с бинарными файлами набора может быть каким угодно, но должен быть отличным от database/datasets. Бинарные файлы набора, такие как t10k-images.idx3-ubyte должны храниться в том каталоге в распакованном виде.

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

Нейронная сеть

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

Нейросеть хранится на диске в каталоге database/nets в файле с расширением nn. В этом файле хранится как информация из описания самой сети, так и непосредственно весовые коэффициенты.

Работа с сетью

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

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

Далее окно нейросети содержит несколько вкладок. Первая показывает общую информацию по сети и позволяет проводить единичное распознавание образцов. Также можно открыть дополнительные окна с визуализацией внутренней информации по работе сети. Другие вкладки - это “Обучение” и “Тестирование”.

Обучение сети

Вкладка “Обучение” позволяет выполнить обучение сети при помощи прогона всего выбранного набора образцов. При обучении используется метод обратного распространения ошибки.

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

Перед обучением доступна инициализация весовых коэффициентов нулями или случайными значениями из диапазона [-1, 1]. Однако при этом все предыдущие значения будут потеряны. При создании новой сети весовые коэффициенты инициализируются случайно [-1, 1].

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

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

Тестирование сети

Вкладка “Тестирование” позволяет выполнить тестирование обученной сети на нужном наборе данных. В момент начала тестирования также как и при обучении формируется моментальный снимок данных в соответствии с установленныи на тот момент у набора данных фильтром. Процесс тестирования также может быть длительным и его можно в любой момент прервать.

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

Визуализация внутренней информации сети

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

Внутренние массивы данных можно выбрать на первой вкладке окна открытой сети. Каждая сеть может предоставлять для просмотра разные массивы, это зависит от структуры самой сети. Всегда будут доступны массивы input и output. Это массивы входов и выходов. Если у сети есть скрытые слои, то будут доступны также массивы hidden:<n> в зависимости от количества этих слоев. Нумерация скрытых слоев идет с единицы от входа к выходу при прямом распространении сигнала. Все массивы входов, выходов и скрытых слоев одномерные.

Кроме этого, для визуализации доступны двумерные массивы весовых коэффициентов output_weights и hidden_weights:<n>. Размеры массивов зависят от размера самого слоя и предыдущего слоя. Например, рассмотрим сеть структуры 784-100-10, то есть входной слой имеет размерность 784, скрытый слой 100 и выходной слой 10. В этом случай размеры двумерных массивов весовых коэффициентов будут следующими: output_weights - массив double[10, 100], hidden_weights:1 - double[100, 784].

Особенности визуализации

Визуализация внутренних данных сети выполняется в виде изображений. Если размер массива является числом, предстваляющем квадрат какого либо целого числа, то это целое число становится размером изображения по осям X и Y. Например, размер входного слоя 784 - это 28x28. Это размер изображения в наборе данных MNIST. Размер скрытого слоя тоже выбран не случайно. Размер 100 - это квадрат 10x10. Выходной слой имеет размер 10, поскольку набор данных MNIST содержит цифры, а их всего 10. Однако 10 не является квадратом какого-либо целого числа. В этом случае будет формироваться изображение размером 10x1 (по оси X размер 10, по оси Y - 1). Программа автоматически определяет, доступно ли формирование изображения в виде квадрата, или требуется прямоугольник 1xN.

С визуализацией двумерных массивов все немного сложнее. Допустим, мы хотим посмотреть данные весовых коэффициентов слоя hidden_weights:1. Для нашей сети 784-100-10 этот массив будет иметь размерность [100, 784]. Такой двумерный массив будет показан следующим образом. Изображение будет иметь размер 10x10 секций (т.к. первая размерность 100 = 10x10). Каждая такая секция будет иметь размер 28x28 пикселей (при масштабе 1). То есть общий размер изображения станет 280x280 пикселей.

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

Массивы имеют тип данных double. Обычно в массивах input, hidden:<n> и output значения положительные из диапазона [0, 1]. При формировании пикселя в массиве сначала находится максимум (MAX), потом все значения приводятся к 256 градациям цвета. Значение 0 соответствует значению пиксля 0. Значение MAX соответствует значению пикселя 255. То есть минимальным значением всегда считается 0, а максимум определяется из фактических данных. Таким образом, если фактическое значение в массиве, например, в диапазоне [0, 0.3], то для визуализации максимального значения 0.3 будет использоваться максимальная градация 255. Это позволяет более наглядно показывать массивы с узким диапазоном малых значений.

Массивы весовых коэффициентов имеют значения как положительные, так и отрицательные. Для демонстрации положительных значений используются градации красного цвета. Отрицательные значения показываются градациями сине-зеленого цвета. Среди отрицательных значений также выполняется поиск максимума (по модулю) и выполняется подстройка градаций под этот максимум. Это независимо от положительных значений, среди которых ищется свой максимум и выполняется своя независимая подстройка градаций.

Описание

Создание и исследование простых нейронных сетей

Конвейеры
0 успешных
0 с ошибкой