Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2011, 07:43   #1
Sanchos
Новичок
Джуниор
 
Регистрация: 28.07.2011
Сообщений: 3
По умолчанию Нейронные сети

Есть задание написать алгоритм обучения НС обратным распространением ошибки для задачи XOR.
Наваял это
Код:
var
  IN_1,IN_2,N1,N2,NOut:real;
  Sin_12:array[1..2,1..2] of real;
  Sin_23:array[1..2] of real;


Procedure SinRandom;// устанавливает исходные веса
begin
randomize;
Sin_12[1,1]:=random(1000)/1000;
Sin_12[1,2]:=random(1000)/1000;
Sin_12[2,1]:=random(1000)/1000;
Sin_12[2,2]:=random(1000)/1000;
Sin_23[1]:=random(1000)/1000;
Sin_23[2]:=random(1000)/1000;  
end;

Function Fx(x:real):real;  //функция активации - сигмоида
begin
Fx:=1/(1+exp(-x)) ;
end;

Function Calc(DIn1,DIn2:real):real;  //прямой проход
begin
N1:=0;
N2:=0;
NOut:=0;
IN_1:=DIn1;
IN_2:=DIn2;
N1:=Sin_12[1,1]*DIn1;
N1:=N1+Sin_12[2,1]*DIn2;
N2:=Sin_12[1,2]*DIn1;
N2:=N2+Sin_12[2,2]*DIn2;
N1:=Fx(N1);
N2:=Fx(N2);
NOut:=N1*Sin_23[1];
NOut:=NOut+N2*Sin_23[2];
NOut:=Fx(NOut);
Calc:=NOut; 
end;

Procedure LearnProc(T,OUTq:real);  // обратный проход (обучение)
var Err,n,w,Err2:real;
begin
n:=0.5;

Err:=OUTq*(1-OUTq)*(T-OUTq); 

Sin_23[1]:=Sin_23[1]+n*Err*N1;
Sin_23[2]:=Sin_23[2]+n*Err*N2;

Err2:=N1*(1-N1)*(Err*Sin_23[1]);
Sin_12[1,1]:=Sin_12[1,1]+n*Err2*IN_1;
Sin_12[2,1]:=Sin_12[2,1]+n*Err2*IN_2;

Err2:=N2*(1-N2)*(Err*Sin_23[2]);
Sin_12[1,2]:=Sin_12[1,2]+n*Err2*IN_1;
Sin_12[2,2]:=Sin_12[2,2]+n*Err2*IN_2;


end;

procedure Learn;
begin
//  0.1-0.1-0
LearnProc(0,Calc(0.1,0.1));
//  1-1-0
LearnProc(0,Calc(1,1));
//  1-0.1-1
LearnProc(1,Calc(1,0.1));
//  0.1-1-1
LearnProc(1,Calc(0.1,1));
end;

procedure TForm1.Button3Click(Sender: TObject);
var i,j:integer;
begin
decimalseparator:='.';
SinRandom;
j:=strtoint(form1.Edit1.Text);
for i:=1 to j do Learn;
Form1.Memo1.Clear;
form1.Memo1.Lines.Add('0.1    0.1    '+floattostr(Calc(0.1,0.1)));
form1.Memo1.Lines.Add('1      0.1    '+floattostr(Calc(1,0.1)));
form1.Memo1.Lines.Add('0.1    1      '+floattostr(Calc(0.1,1)));
form1.Memo1.Lines.Add('1      1      '+floattostr(Calc(1,1)));
end;
Но не работает, помогите найти ошибку.

Последний раз редактировалось Sanchos; 29.07.2011 в 04:01. Причина: Нашел ошибку, исправил, все равно обучается не так как нужно.
Sanchos вне форума Ответить с цитированием
Старый 28.07.2011, 08:22   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Вы не по адресу. Вам к Мессингу надо. Это он мысли на расстоянии читал.
Что за ошибка?
Ошибка алгоритма? Где формулы?
Ошибка синтаксиса? Где сообщение компилятора?
У Вас только процедуры и функции. Как они увязаны в основном блоке?
Что каждая из них выполняе?
И какой помощи Вы от нас ждёте?
А может сочувствия. Ну, я Вам сочувствую.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 28.07.2011, 08:33   #3
Sanchos
Новичок
Джуниор
 
Регистрация: 28.07.2011
Сообщений: 3
По умолчанию

Проблема связана с тем что сеть не обучается т.е. ошибка со временем обучения не уменьшается.
Формулы брал тут.
Хотел помощи от тех кто занимался нейронными сетями. Ошибка где то в алгоритме обучения (процедура LearnProc), то ли я не совсем правильно понимаю сам алгоритм обучения, то ли не правильно его реализовал в программе.
Sanchos вне форума Ответить с цитированием
Старый 28.07.2011, 08:47   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Что-ж из Вас приходится инфу щипцами тянуть.
Что каждая из функций реализует?
Или кидайте весь проект во фриланс, там за денюжку всё сделают.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 28.07.2011, 09:01   #5
Sanchos
Новичок
Джуниор
 
Регистрация: 28.07.2011
Сообщений: 3
По умолчанию

Так это и есть вся программа.
По нажатию кнопочки случайно выбираются веса, затем цикл обучения (Learn), он вызывает функцию прямой прогонки (Calc), и обратной (LearnProc), и выводит результат в мемо.
Sanchos вне форума Ответить с цитированием
Старый 09.08.2011, 17:47   #6
gusluk
Форумчанин
 
Аватар для gusluk
 
Регистрация: 16.10.2008
Сообщений: 205
По умолчанию

У вас в процессе обучения корректируются веса Sin_23[1] и Sin_23[2], а затем уже скорректированные используются для вычисления ошибки в следующем слое. А нужно брать первоначальные значения, т.е. рассчитать ошибки для всех слоев, а только потом корректировать веса.
И еще, у вас строгая последовательность обучающих примеров, а обычно они выбираются в случайном порядке, хотя возможно это и не существенно.
gusluk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Радиально-базисные нейронные сети BZuk Помощь студентам 7 06.07.2011 20:23
Нейронные сети. Как создать? Aizada Помощь студентам 1 24.04.2011 16:53
Нейронные сети... amico Помощь студентам 1 06.12.2010 10:06
Нейронные сети. Asblue Помощь студентам 4 09.11.2010 08:13
Нейронные сети russian-stalker Свободное общение 8 26.08.2010 21:57