Использование языка MC# для реализаций параллельного классификатора образов.*

1 Цели и проблемы

К задаче классификации можно свести много прикладных задач : от оптического распознавания текста до выявление фальшивых кредитных карт и медицинской диагностики. Существует несколько подходов к построению классификаторов. В данной статье рассмотрен классификатор на основе искусственной нейронной сети [1]. При большой размерности нейронной сети, возникает потребность в высокопроизводительных многопроцессорных вычислительных системах [2]. Это особенно важно для классификаторов реального времени, где необходимо получать результат сразу, без существенных задержек. Для многопроцессорных вычислительных систем необходимо создавать специальные программы. В тексте такой программы определяются части (ветки), которые могут выполнятся параллельно, а также алгоритм их взаимодействия. Целью данной работы является построение классификатора для эффективного использования на многопроцессорных вычислительных системах.

2 Постановка задачи

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

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

3 Решение

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

3.1 Искусственная нейронная сеть

Искусственная нейронная сеть это совокупность нейронных элементов (рис. 1) и связей между ними [3].

clip_image001

Рисунок: математическая модель нейрона

Нейронный элемент (нейрон) обладает группой однонаправленных входных связей clip_image002, соединенных с выходами других нейронов. Каждый вход clip_image003 характеризуется величиной синаптической связи или весом clip_image004.
Каждый нейрон имеет текущее состояние, определяемое, как взвешенная сумма его входов1 :

clip_image005

Нейрон имеет выходную связь clip_image006, с которой сигнал поступает на входы следующих нейронов. Выход нейрона есть функция его состояния:

clip_image007

Функция clip_image008 называется активационной.

Множество всех нейронов нейронной сети можно разделить на подмножества - т.н. слои. Слой искусственной нейронной сети это множество нейронов на которые в каждый такт времени параллельно поступают сигналы от других нейронов данной сети [3]. Взаимодействие нейронов происходит послойно.

3.2 Классификатор

В данной работе для реализации классификатора используется однослойная нейронная сеть (персептрон) из 10 нейронов (рис. 2).

3.2.1 Параметры сети

clip_image009

Рисунок: Классификатор

однослойная нейронная сеть (рис. 2)
35 входов
10 выходов
состояние нейрона clip_image010 :

clip_image011

(1)

пороговая функция активации с порогом clip_image012

clip_image013

(2)

3.2.2 Алгоритм работы классификатора

На вход классификатора подаются бинарные картинки (рис. 3) размером clip_image014 точек с изображением цифр (clip_image015), т.е. всего clip_image016 входов. На выходе получаем слово clip_image017 , clip_image018, т.е. всего 10 выходов. Номер clip_image019, для которого выход clip_image020, соответствует номеру класса входного образца.

clip_image021

Рисунок: образы для классификации

Важной особенностью искусственной нейронной сети есть возможность её обучения. Процесс обучения сводится к процедуре корректировки весовых коэффициентов. В качестве метода обучения используется правило Видроу-Хоффа [4]:

clip_image022

(3)

где

clip_image023 - весовой коэффициент связи clip_image010-того нейрона с clip_image019-тым входом
clip_image024 - коэффициент скорости обучения
clip_image025 - clip_image019-тый вход сети
clip_image026 - ошибка нейрона clip_image010 на clip_image027-том образце

clip_image028

(4)

где

clip_image029 - состояние (1) нейрона clip_image010
clip_image030 - верный выход нейрона clip_image010 на clip_image027-том образце

Так же необходимо определить :

clip_image031 - ошибка сети на clip_image027-том образце

clip_image032

(5)

clip_image033 - максимальная ошибка сети

clip_image034

(6)

clip_image035clip_image036 - допустимая максимальная ошибка сети

Таким образом, прежде чем классификатор начнет работать его необходимо обучить на множестве учебных примеров, которое представляет собой множество пар - (картинка, выход сети).

Цикл обучения выглядит так :

1. прогнать через сеть все образцы из множества учебных примеров и рассчитать максимальную ошибку сети clip_image033 по (6)

2. если clip_image037 clip_image035 то конец

3. в случайном порядке подать на вход сети все образцы из множества учебных примеров, для каждого образца и выхода сети рассчитать ошибку по (4) и скорректировать веса по (3)

4. перейти на п.1

3.3 Реализация с распараллеливанием

Соответственно представленной выше модели, на языке MC# [5][6][7] написан параллельный классификатор бинарных образов.

''Память'' сети это матрица весовых коэффициентов clip_image038. На этапе инициализации программы порождается начальная сеть. Эта сеть обучается на множестве пар [образ,выход_сети], которые содержатся в двух текстовых файлах : patterns.dat - обучающая выборка, targets.dat - верные выходы для обучающей выборки. Создается рабочая матрица весов, соответствующая [patterns.dat, targets.dat], которая используется, динамически создаваемыми, классификаторами для одновременного распознавания образов из файла tests.dat Таким образом, полученная система может ''читать'' словами.

Классификатор реализуется тремя классами :

// однослойная сеть
class OneLayerNet { . . . }
// персептрон, пороговая функция активации
class Perceptron : OneLayerNet { . . . }
// классификатор, 35 входов, 10 выходов
// распознает бинарные картинки 5x7 точек
class Classificator : Perceptron { . . . }

ParClassificator - класс, реализующий параллельный классификатор. На этапе инициализации программы при помощи конструктора ParClassificator(), на основе содержимого patterns.dat и targets.dat, создается рабочая матрица весов m_weight. Собственно, механизм распараллеливания заключен в двух методах recognize и Get :

movable recognize(double[,] W, sbyte[] I, Channel(NeuralIO)c) это перемещаемый (т.е. выполняемый параллельно с остальной программой) метод, который распознает бинарный образ I, используя матрицу весов W. Результат помещается в т.н. канал c. Конструкция c(res) в некотором смысле аналог конструкции return(res) для обычных ( последовательных ) функций.
void Get() & Channel m_channel( NeuralIO n )
Стандартная конструкция языка MC#. Здесь объявляется канал m_channel типа NeuralIO и метод-обработчик канала Get, который забирает из канала данные, посланные туда, параллельно работающими методами recognize.

Параллельный классификатор ParClassificator осуществляет одновременное распознавание бинарных образов из tests.dat при помощи метода makeTestPar. Этот метод для каждого образа из tests.dat вызывает movable метод recognize и собирает результаты методом Get.

class ParClassificator {
. . .
protected double[,] m_weight;
public ParClassificator() {
Classificator nnet=new Classificator(N);
nnet.teach("patterns.dat","targets.dat");
m_weight=nnet.weight();
. . .
}
. . .
public void makeTestPar(string file) {
. . .
for(i=0;(loadPattern()==1);i++) {
recognize(m_weight,Copy(m_pattern), m_channel );
}
for(int j=0;j<i;j++) { Get(); }
. . .
}
public movable recognize(double [,] W, sbyte[] I, Channel( NeuralIO ) c ) {
Classificator nnet=new Classificator(N);
NeuralIO n=new NeuralIO(IN_SIZE,OUT_SIZE);
n.I(I);
nnet.I(I);
nnet.weight(W);
nnet.step();
n.O(nnet.O());
c(n);
}
public void Get() & Channel m_channel( NeuralIO n ) {
printIn(n.I());
printOut(n.O());
}
}

4 Результат

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

При увеличении количества процессоров, предполагается ускорение близкое к линейному. Ускорение[8] на clip_image039 процессорах это отношение

clip_image040

где clip_image041 и clip_image042- время выполнения программы на clip_image043 и clip_image039 процессорах соответственно.

clip_image044

Рисунок: результат работы классификатора

Текст программы на MC# [ здесь ]

Литература

1      Борисов Е.С. Искусственные нейронные сети - http://mechanoid.narod.ru/nns

2    Борисов Е.С. Вычислительные системы сверхвысокой производительности. - http://mechanoid.narod.ru/high_perf

3      Головко В.А., под ред. Галушкина А.И. Нейронные сети: обучение, организация и применение. - Москва : ИПРЖР, 2001. - 256 c.

4      Уоссермен Ф. Нейрокомпьютерная техника : Теория и практика. - Москва : Мир, 1992. - 200 c.

5       MC# - http://u.pereslavl.ru/~vadim/MCSharp

6       Адрес разработчиков языка MC# - yury@serdyuk.botik.ru

7       Борисов Е.С. Использование языка MC# для реализаций параллельных алгоритмов в 3D моделировании.

8  Дорошенко А.Е. Математические модели и методы организации высокопроизводительных параллельных вычислений. - Киев : Наукова думка, 2000. - 176 c.

Сноски

... образов*  эта статья опубликована в журнале "Кибернетика и Системный Анализ" Института Кибернетики АН Украины - [ http://www.icyb.kiev.ua ]

... входов1  возможны и другие определения

Автор: Е.С.Борисов оригинал статьи

Предлагаю ознакомиться с аналогичными статьями: