Отбор данных и формирование обучающей выборки.



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

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

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

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

Разработка собственной программы или использование существующего нейроимитатора?

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

Исключение составляют нестандартные задачи и специализированные архитектуры нейросетей, в этом случае необходимо разрабатывать новую программу. При выборе технической среды для вашего проекта полезно учитывать имеющиеся инструментальные средства для написания нейропрограмм и обработки баз данных. В качестве языка программирования чаще всего используется C (или C++). Для небольших проектов можно выбрать ПАСКАЛЬ или БЕЙСИК.

И, пожалуйста, не тратьте время на перепрограммирование стандартной функции вычисления квадратного корня!

Анализ результатов.

Это одна из самых важных фаз решения задачи. Для полноты анализа следует позаботиться о нагладности результатов, используя представление их в графическом виде. Если результаты будут использоваться в дальнейших вычислениях с примененим ЭВМ, целесообразно сразу представить их в формате, понимаемом другими программами. Для обмена между программами небольшими таблицами данных можно использовать текстовое представление. Для больших объемов лучше применить стандартные форматы, например, формат dbf-файлов системы dBASE разработки фирмы Ashton-Tate. Это автоматически позволит использовать вам средства этой (и многих других) системы для представления, хранения и редактирования данных.

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

Однако возможно, что вы на пороге нового открытия...

Описание программы PERC.

В этом пункте будет описана простейшая программа PERC, реализующая обучение однослойного ПЕРСЕПТРОНА. В качестве примера была выбрана следующая задача. Нейронной сети предъявляется вектор, состоящий из 10 копмонент, каждая из которых может быть нулем или единицей. Сеть должна научиться определять, чего больше - нулей или единиц.

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

В качестве обучающей выборки используются 200 векторов, компоненты которых разыгрываются с использованием датчика псевдослучайных чисел ПАСКАЛЯ. Правильный ответ определяется непосредственным сравнением числа нулей и единиц.

Обучение сети проводится по дельта-правилу Ф.Розенблатта, подробно рассмотренному в лекции 4. По завершении обучения программа выдает число выполненных итераций и значение достигнутой ошибки обучения. В конце этого пункта приведен полный листинг программы PERC и результаты ее работы (Внимание! Если вы проведете расчет по программе на вашем компьютере, то полученные значения могут слегка отличаться от приведенных из-за различных последовательностей случайных чисел).

Для тестирования качества обучения разработана отдельная программа TEST (текст и результаты работы которой тоже приводятся). Структуры используемых данных и работа программы аналогичны программе PERC. Для тестирования также используются случайные вектора.

Результаты теста весьма удовлетворительны, нейронная сеть успешно справляется с задачей с точностью до ошибок во 2-3 знаке ответа. Интерпритация этих ошибок не вызывает затруднений или недоразумений.

Текст программы PERC.

PROGRAM PERC;

 

(* P E R C - Учебная программа, реализующая однослойный

          PERCEPTRON.

 

          ДАТА: 26 октября 1994 г.

          АВТОР: С.А.Терехов (email: sta@ch70.chel.su)

*)

 

CONST

CMaxInp = 20;  (* Максимальное число входов *)

CMaxOut = 10;  (* Максимальное число выходов *)

CMaxImages = 200; (* Максимальное число образов *)

CEta   = 0.75; (* Темп обучения *)

CError = 5.0e-3; (* Граница требуемой ошибки *)

CCounter = 1000; (* Максимальное число итераций *)

CInitWeight = 5.0; (* Максимальное начальное значение

                          случайных синаптических весов *)

CBiasNeuron = 1.0; (* Активность нейрона-порога *)

 

TYPE

TMatrix = ARRAY[0..CMaxInp,1..CMaxOut] OF REAL;

               (* Нулевой столбец содержит значения порогов *)

TInpVector = ARRAY[1..CMaxInp] OF REAL;

TOutVector = ARRAY[1..CMaxOut] OF REAL;

 

(* Структура сети *)

TPerceptron = RECORD  

   NInp : INTEGER; (* Число входов *)

   NOut : INTEGER; (* Число выходов *)

   Inp : TInpVector; (* Текущий вектор входов *)

   Out : TOutVector; (* Текущий вектор выходов *)

   W : Tmatrix; (* Матрица связей *)

END;

 

(* Запись в базе данных - обучающей выборке *)

TBaseRecord = RECORD

   X : TInpVector;

   Y : TOutVector;

END;

 

(* Структура базы данных *)  

TBase = RECORD

   NImages : INTEGER; (* Число обучающих образов *)

   Images : ARRAY[1..CMaxImages] OF TBaseRecord;

END;

 

VAR

VNet             : TPerceptron;

VBase            : TBase;

VOK              : BOOLEAN;

VError, VTemp, VDelta : REAL;

VCounter, Vi, Vj, Vk : INTEGER;

VFile            : FILE OF TPerceptron;

 

PROCEDURE InitAll;

(* Инициализация нейронной сети с 10 входами и одним выходом,

задание начальных случайных значений матрицы связей *)

VAR

Li, Lj, Lk : INTEGER;

BEGIN

WITH VNet, VBase DO

BEGIN

   NInp := 10;

   NOut := 1;

   FOR Li := 0 TO NInp DO

       FOR Lj := 1 TO NOut DO

            W[Li,Lj] := CInitWeight*(RANDOM-0.5);

END;

VOK := TRUE;

END;

 

PROCEDURE GetDataBase;

(* Генерация обучающей выборки из 200 случайных образов.

При определении правильного числа единиц используется прямой

подстчет *)

VAR

Li, Lj, Lk : INTEGER;

BEGIN

VOK := TRUE;

WITH VBase, VNet DO

BEGIN

   NImages := 200;

   FOR Li:= 1 TO NImages DO

   BEGIN

       Lk := 0;

       FOR Lj:=1 TO NInp DO

       BEGIN

           (* Случайно 0 или 1 *)

           Images[Li].X[Lj] := RANDOM( 2 );

           (* Подсчет единиц *)

           IF ( Images[Li].X[Lj] > 0 )

               THEN Lk := Lk + 1;

       END;

       (* Выход равен единице, если в данном входном векторе

          число единиц больше числа нулей *)

       IF ( Lk > (NInp-Lk) )

           THEN Images[Li].Y[1] := 1

           ELSE Images[Li].Y[1] := 0

      END;

END;

END;

 

PROCEDURE SaveNet;

(* Запись параметров нейронной сети в файл SAMPLE.DAT.

Производится контроль за операциями вывода с использованием

ключа I+ и I- компилятора ТУРБО ПАСКАЛЯ *)

BEGIN

ASSIGN( VFile, 'SAMPLE.DAT' );

{$I-}

REWRITE( VFile );

{$I+}

VOK := (IOResult = 0);

 

IF VOK THEN

BEGIN

   {$I-}

   WRITE( VFile, VNet );

   CLOSE ( VFile );

   {$I+}

   VOK := (IOResult = 0);

END;

END;

 

FUNCTION Sigmoid( Z: REAL ): REAL;

(* Сигмоидальная переходная функция нейрона *)

BEGIN

Sigmoid := 1.0/(1.0+EXP(-Z));

END;

 

(* Основная программа *)

BEGIN

WRITELN('<< P E R C E P T R O N >> (Нейроимитатор) ');

 

WRITELN('----------------------------------------- ');

VOK := TRUE;

(* Инициализация с контролем ошибки *)

RANDOMIZE;

InitAll;

IF (NOT VOK) THEN

BEGIN

   WRITELN('Ошибка инициализации');

   HALT;

END;

 

(* Генерация базы данных *)

VOK := TRUE;

GetDataBase;

IF (NOT VOK) THEN

BEGIN

   WRITELN('Ошибка при генерации базы данных');

   HALT;

END;

 

(* Цикл обучения *)

VOK := TRUE;

VCounter := 0;

WITH VNet, VBase DO

   REPEAT

       VError := 0.0;

       (* Цикл по обучающей выборке *)

       FOR Vi := 1 TO NImages DO

       BEGIN

           (* Подача очередного образа на входы сети *)

           FOR Vj := 1 TO NInp DO

           BEGIN

               Inp[Vj] := Images[Vi].X[Vj];

           END;

 

           (* Цикл по нейронам. При аппаратной реализации

              будет выполняться параллельно !!! *)

           FOR Vk := 1 TO NOut DO

           BEGIN

               (* Состояние очередного нейрона *)

               VTemp := CBiasNeuron*W[0,Vk];

               FOR Vj := 1 TO NInp DO

               BEGIN

                   VTemp := VTemp +

                       Inp[Vj]*W[Vj,Vk];

               END;

               Out[Vk] := Sigmoid( VTemp );

 

               (* Накопление ошибки *)

               VDelta := Images[Vi].Y[Vk]-Out[Vk];

               VError := VError + 0.5*SQR( VDelta );

 

               (* Обучение по дельта-правилу Розенблатта *)

               W[0,Vk] := W[0,Vk] +

                   CEta*CBiasNeuron*VDelta;

               FOR Vj := 1 TO NInp DO

               BEGIN

                   W[Vj,Vk] := W[Vj,Vk] +

                       CEta*Inp[Vj]*VDelta;

               END;

           END;

       END;

       VCounter := VCounter + 1;

   UNTIL ( (VCounter >= CCounter) OR

           (VError <= CError) );

   (* Цикл завершен при достижении максимального числа

      итераций или минимально достаточной ошибки *)

 

WRITELN( 'Выполнено ', VCounter, ' итераций');

WRITELN( 'Ошибка обучения ', VError );

 

(* Сохранение результатов обучения на диске *)

SaveNet;

IF (NOT VOK) THEN

BEGIN

   WRITELN('Ошибка при записи на диск');

   HALT;

END;

 

WRITE('Нейронная сеть обучена, параметры');

WRITELN(' записаны в файл SAMPLE.DAT');

END.

 


Дата добавления: 2018-11-24; просмотров: 228; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!