Нейронные сети на C# - Кластеризация цвета

ОГЛАВЛЕНИЕ

Кластеризация цвета

Это очень простой пример, демонстрирующий процесс построения самоорганизующейся карты Кохонена. Создается квадратная сеть SOM, состоящая из 10000 нейронов со случайно инициализированными весами. Каждый нейрон имеет три веса, интерпретируемые как значения RGB для отображения. Начальное отображение сети покажет какую-либо ярко раскрашенную карту. В ходе процедуры обучения выбираются случайные цвета и последовательно передаются входу сети. Повторяя итерации обучения, нейронная сеть организуется так, чтобы больше не выглядеть как случайная картинка при отображении, но она получает определенную структуру - цвета, близкие к палитре RGB, тоже размещаются ближе на карте Кохонена.

// установить диапазон рандомизации весов нейронов
Neuron.RandRange = new DoubleRange( 0, 255 );
// создать сеть
DistanceNetwork network = new DistanceNetwork( 3, 100 * 100 );
// создать алгоритм обучения
SOMLearning trainer = new SOMLearning( network );
// вход
double[] input = new double[3];
// цикл
while ( ... )
{
    // обновить скорость и радиус обучения
    // ...

    // подготовить вход сети
    input[0] = rand.Next( 256 );
    input[1] = rand.Next( 256 );
    input[2] = rand.Next( 256 );

    // выполнить итерацию обучения
    trainer.Run( input );
   
    ...
}

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

Задача коммивояжера

Задача коммивояжера показывает применение эластичной сети, похожей на SOM в плане самоорганизации, но отличающейся в интерпретации нейронной сети. SOM интерпретирует нейронную сеть как двумерную карту узлов, а эластичная сеть интерпретирует ее как кольцо узлов. В ходе этапа обучения векторы свойств последовательно предъявляются сети, что заставляет сеть принять какую-либо форму, представляющую решение. В случае задачи TSP каждый нейрон сети имеет два веса, представляющие координаты (X, Y). В ходе этапа обучения координаты произвольных городов последовательно передаются входу сети, и сеть организует свои веса так, чтобы они представляли путь коммивояжера.

// установить диапазон случайных генераторов
Neuron.RandRange = new DoubleRange( 0, 1000 );
// создать сеть
DistanceNetwork network = new DistanceNetwork( 2, neurons );
// создать алгоритм обучения
ElasticNetworkLearning trainer = new ElasticNetworkLearning( network );
// вход
double[] input = new double[2];
// цикл
while ( ... )
{
    // установить вход сети
    int currentCity = rand.Next( citiesCount );
    input[0] = map[currentCity, 0];
    input[1] = map[currentCity, 1];

    // выполнить одну итерацию обучения
    trainer.Run( input );
    ...
}

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

Заключение

Пять представленных примеров показывает, что начальная цель библиотеки была достигнута – она гибкая, многократно используемая и легко применимая к разным задачам. Хотя надо сделать еще много работы из-за большого диапазона разных архитектур нейронной сети и их алгоритмов обучения, тем не менее библиотека применима к множеству разных задач и может быть расширена, чтобы решать еще больше задач. Следует надеяться, что библиотека будет полезной и интересной для разных исследователей.