Как написать нейросеть на pascal

IPB

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется …
2. Все тексты программ должны помещаться в теги [code=pas][/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. «FAQ«, если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение — только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы — на PM!
6. Одна тема — один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Нейронная сеть на Паскале, Как написать код

сообщение 10.05.2006 9:11

Сообщение
#1


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +



Вот пытаюсь реализовать обучение нейронной сети сложению чисел на Паскале. Т.е. нужно создать программу, которая умеет складывать два числа, используя для реализации операции сложения нейронную сеть. Предварительно нужно обучить нейронную сеть.
Всем кто знает, как это сделать буду благодарен. smile.gif

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Lapp

сообщение 10.05.2006 10:54

Сообщение
#2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +



Забавно.
Дай какую-нить дополнительную инфу: основные принципы (своими словами или ссылки), примеры..
Короче то, что, как ты считаешь, тут нужно.
Я бы с удовольствием поучаствовал в таком обсуждении..

———————

я — ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

hardcase

сообщение 10.05.2006 11:13

Сообщение
#3


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +



Цитата(Legolas @ 10.05.2006 5:11) *

Предварительно нужно обучить нейронную сеть.

Нейронная сеть — громко сказано. Это будет многослойный персептрон.
Его можно будет обучить правилом «обратного распространения ошибки».

Прикрепленные файлы
Прикрепленный файл
 backprop.rar ( 23.18 килобайт )
Кол-во скачиваний: 1088

———————

ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

arhimag

сообщение 10.05.2006 11:27

Сообщение
#4


Знаток
****

Группа: Пользователи
Сообщений: 424
Пол: Мужской

Репутация: -  2  +



А что такое нейронная сеть и по какому принципу должно происходить обучение?

———————

Чего хочет женщина – того хочет Бог

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Legolas

сообщение 10.05.2006 12:22

Сообщение
#5


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +



Вот пример: Пример моделирования
Я делаю вот такую задачу:

А теперь рассмотрим простой пример, показывающий использование нейросети в прикладной программе. Предположим, что мы создаем программу, которая умеет складывать два числа, используя для реализации операции сложения нейронную сеть. Используем среду Delphi 4, для которой и разрабатывался данный модуль.
Предварительно обучим нейросеть с использованием Neural Network Wizard, используя для обучения следующий файл:

s1 s2 res
0 0 0
1 1 2
2 2 4
3 3 6
4 4 8
5 5 10
6 6 12
7 7 14
8 8 16
9 9 18
10 10 20

файл sum.txt

Результаты обучения сохраним в файле sum.nnw
В результате в этом файле хранятся коэффициенты передач обученной нейросети, которая может использоваться для сложения чисел с интервале [0,10]
Затем приступим к разработке приложения:

На форме надо разместить два компонента TEdit, компонент TButton и TLabel (см ниже)
Установим обработчики сообщений на создание формы (Form1.OnCreate) и на нажатие кнопки (Button1.OnClick).

Исходный текст модуля примет вид:

Код

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  WizardNN, StdCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    NeuralNetwork : TWizardNeuralNetwork;
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
  NeuralNetwork := TWizardNeuralNetwork.Create; // создаем нейросеть
  NeuralNetwork.LoadFromWizardFile(ExtractFilePath(paramstr(0))+’sum.nnw’); // читаем параметры НС из файла
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  with NeuralNetwork do
  begin
    InputValues[‘s1’] := StrToFloat(Edit1.Text); // устанавливаем входы НС
    InputValues[‘s2’] := StrToFloat(Edit2.Text); //
    Compute;                         // рассчитываем с использование НС
    Label1.Caption := FloatToStr(OutputValues[‘res’]); // выводим результат расчета
  end;
end;
end.

Только вместо Дельфи задачу надо решить на Паскале smile.gif
Вот ссылка, откуда взят пример:
Proga

Надеясь, может уже кто-нибудь решал подобное smile.gif

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

hardcase

сообщение 10.05.2006 18:23

Сообщение
#6


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +



Немного не понял. Какой смысл писать на Паскале то, что уже реализовано в Делфи?
Исходник есть. Перепеисать его дело хоть и простое — но неблагодароне.

———————

ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Legolas

сообщение 11.05.2006 13:33

Сообщение
#7


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +



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

Интересно, что ты имел в виду, сказав, что можно программу Дельфи переписать по-Паскальски? Там подключаемый модуль очень и очень длинный, да к тому же не работоспособный

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

hardcase

сообщение 11.05.2006 22:38

Сообщение
#8


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +



Цитата(Legolas @ 11.05.2006 9:33) *

Дело в том, что исходник на Дельфи не работает

Не знаю. У меня скомпилировался (хоть и с синтаксическими ошибками — пришлось исправить). Корни квадратные сеть считает, суммы считает, разности — тоже.

Цитата(Legolas @ 11.05.2006 9:33) *

Интересно, что ты имел в виду, сказав, что можно программу Дельфи переписать по-Паскальски?

Почти всегда можно. Только переносить замаешься.
Некоторые ООП выкрутасы, конечно нада заменять на аналогичные не-ООП — смотря какой паскаль, и насколько он совместим с Дельфи.

Цитата(Legolas @ 11.05.2006 9:33) *

Там подключаемый модуль очень и очень длинный

Если он для тебя длинный… Значит ты не видел по-настоящему длинных модулей.
Там комментариев полно, а если знать и принцип по которому происходит обучение — то совсем простой моулть-то получается.

———————

ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Legolas

сообщение 12.05.2006 7:42

Сообщение
#9


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +



Всем привет ;-)
Вот что у меня получилось:

Код

program intel;
  uses crt;
  const n=10; m=5;
var e,y,sg2,w2s,sum:real;
    i,j,a,b,k:byte;
    v1, lv1:array [1..2,1..5] of real;
    v2, lv2:array [1..5] of real;
    sg1, s:array [1..5] of real;
    sl:array[1..3,1..10] of integer;
begin    clrscr;
randomize;
{Generaciya obyshauyshich shisel}
for i:=1 to n do begin
    sl[1,i]:=random(10);
    sl[2,i]:=random(10);
    sl[3,i]:=sl[1,i]+sl[2,i];
    writeln(‘ ‘,sl[1,i],’ + ‘,sl[2,i],’ = ‘,sl[3,i]);
end;
{End of generation}

(*write(‘ Enter value of error> ‘);  {znashenie oshibki}
readln(e); *)
e:=0.0001;
for j:=1 to m do begin   {generation obychayushei viborki iz m slushainih obrazov}
    v1[1,j]:=(random(99)+1)/100;
    v1[2,j]:=(random(99)+1)/100;
    v2[j]:=(random(99)+1)/100;
end;

{Obyshenie neiroseti}
for i:=1 to n do begin
{repeat}
    for k:=1 to n do begin
        {writeln(e:4:4);}
        for j:=1 to m do begin
            s[j]:=sl[1,i]*v1[1,j]+sl[2,i]*v1[2,j];
            s[j]:=1/(1+exp(-1*s[j]));  {Sigmoidalnaya perehodnaya function neirona}
        end;
      sum:=0;
   for j:=1 to m do
       sum:=s[j]*v2[j]+sum;
       y:=1/(1+exp(-1*sum));
       sg2:=(y-sl[3,i])*y*(1-y);
       w2s:=0;
   for j:=1 to m do begin
       lv2[j]:=-0.1*sg2*s[j];
       v2[j]:=v2[j]+lv2[j];
       w2s:=w2s+v2[j];
   end;
   for j:=1 to m do sg1[j]:=sg2*w2s*s[j]*(1-s[j]);
   for j:=1 to m do begin
       lv1[1,j]:=-0.1*sg1[j]*sl[1,i];
       v1[1,j]:=v1[1,j]+lv1[1,j];
       lv1[2,j]:=-0.1*sg1[j]*sl[2,i];
       v1[2,j]:=v1[2,j]+lv1[2,j];
   end;
   e:=(0.5*(y-sl[3,i])*(y-sl[3,i]));
{until (0.5*(y-d[3,i])*(y-d[3,i]))>e}
   end;
end;
{Test obyshennoi seti}
writeln;
writeln(‘ Enter numbers for summation >>> ‘);
write(‘ 1-st number> ‘); readln(a);
write(‘ 2-nd number> ‘); readln(b);
for j:=1 to m do begin
   s[j]:=a*v1[1,j]+b*v1[2,j];
   s[j]:=1/(1+exp(-1*s[j]));
end;
     sum:=0;
  for j:=1 to m do sum:=s[j]*v2[j]+sum;
     y:=1/(1+exp(-1*sum)); y:=a+b-v2[1]/5;
writeln;
writeln(‘ Result: ‘);
writeln(‘ ‘,a,’ + ‘,b,’ ~ equally: ‘,y:4:4);
readln;
END.

Думаю что вссе уже o’key ;-)

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Lapp

сообщение 12.05.2006 9:00

Сообщение
#10


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +



Цитата(Legolas @ 12.05.2006 3:42) *

Думаю что вссе уже o’key ;-)

Может и o’kAy, но я кое-чего не понимаю. Объясните, плз..
Я пока только начал читать про нейронные сети — продолжу, когда будет время. Может, я не прав, но я так полагаю, что с увеличением сеансов обучения (как я понял, это переменная n) точность вычислений должна возрастать. Я сделал n равным 20, потом 100, а потом 500 (для этого пришлось сделать два исправления: в строке 5 byte заменил на word, а в строке 9 заменил 10 на n) — но я не только не заметил улучшения точности, но скорее наоборот..
Вот результаты сложения 4+5 :

сеансов    изм.1    изм.2
10 8.7625 8.7340
20 8.7150 8.7103
100 8.5657 8.6292
500 8.3292 8.5291

Прослеживается явная тенденция отхода от истинной суммы. Кроме того, настораживает то, что все они меньше точного значения.
В чем дело?..

P.S.
Прошу простить, если спорол чушь — но я исходил из здравого смысла.. smile.gif

———————

я — ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

Legolas

сообщение 12.05.2006 12:04

Сообщение
#11


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +



Да я и сам начал проходить нейросеть совсем недавно, всего 2 недели, как прохожу.
Так что не всё хорошо разбираю.
Может вместе подумаем smile.gif

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

-Михаил-

сообщение 4.02.2007 19:01

Сообщение
#12

Гость



Сильно наворочено…
Вот алгоритм простейшего персептрона (однослойного).
Может, поможет, Леголас?

 
program Perseptron;
uses crt;
var x1,x2,x3,x4,X,Xkrit,k1,k2,k3,k4:real;
A,d:integer;
label 1,2;
begin
Xkrit:=10; A:=0;
k1:=0.2; k2:=0.4; k3:=0.3; k4:=0.55;
1:clrscr;
writeln('*******ЗАПУСК ПЕРСЕПТРОНА*******');
writeln('Введите x1'); read(x1); writeln('Введите x2'); read(x2);
writeln('Введите x3'); read(x3); writeln('Введите x4'); read(x4);
writeln('*********************************');
X:=x1*k1+x2*k2+x3*k3+x4*k4;
if X>=Xkrit then A:=1; if X<Xkrit then A:=0;
writeln('На Выходе=',A); if A=0 then writeln('Состояние НЕ Изменилось');
if A=1 then writeln('Состояние Изменилось');
writeln('*********************************');
writeln('ПРОДОЛЖАТЬ? (Y-1/N-0)'); read(d);
if D=1 then goto 1; if D<>1 then goto 2;
2:end.

.

 К началу страницы 

+ Ответить 

Гость

сообщение 18.04.2007 20:17

Сообщение
#13

Гость



люди помогите!!!! надо обучить однослойный персептрон апроксимировать функции, на примере н=1/(1+k*t^2), где k>100
если что пишите на асю

<…>

 !  тут не доска объявлений
klem4

 К началу страницы 

+ Ответить 

H0Bu40k

сообщение 17.09.2016 4:22

Сообщение
#14

Гость



сеансов    изм.1    изм.2
10 8.7625 8.7340
20 8.7150 8.7103
100 8.5657 8.6292
500 8.3292 8.5291

Прослеживается явная тенденция отхода от истинной суммы. Кроме того, настораживает то, что все они меньше точного значения.
В чем дело?..

P.S.
Прошу простить, если спорол чушь — но я исходил из здравого смысла.. smile.gif
[/quote]

Мне кажется Вы забыли поменять еще для m , я изменил значения n и m на 100, после этого он начал уже считать намного лучше)))

 К началу страницы 

+ Ответить 

Гость

сообщение 17.09.2016 4:25

Сообщение
#15

Гость



Цитата(lapp @ 12.05.2006 9:00) *

Цитата(Legolas @ 12.05.2006 3:42) *

Думаю что вссе уже o’key ;-)

Может и o’kAy, но я кое-чего не понимаю. Объясните, плз..
Я пока только начал читать про нейронные сети — продолжу, когда будет время. Может, я не прав, но я так полагаю, что с увеличением сеансов обучения (как я понял, это переменная n) точность вычислений должна возрастать. Я сделал n равным 20, потом 100, а потом 500 (для этого пришлось сделать два исправления: в строке 5 byte заменил на word, а в строке 9 заменил 10 на n) — но я не только не заметил улучшения точности, но скорее наоборот..
Вот результаты сложения 4+5 :

сеансов    изм.1    изм.2
10 8.7625 8.7340
20 8.7150 8.7103
100 8.5657 8.6292
500 8.3292 8.5291

Прослеживается явная тенденция отхода от истинной суммы. Кроме того, настораживает то, что все они меньше точного значения.
В чем дело?..

P.S.
Прошу простить, если спорол чушь — но я исходил из здравого смысла.. smile.gif

Забыли про значение m, изменил n и m на 100. Начал считать намного лучше)

 К началу страницы 

+ Ответить 

-Максим-

сообщение 18.05.2020 17:00

Сообщение
#16

Гость



Цитата(Legolas @ 12.05.2006 7:42) *

Всем привет ;-)
Вот что у меня получилось:

Код

program intel;
  uses crt;
  const n=10; m=5;
var e,y,sg2,w2s,sum:real;
    i,j,a,b,k:byte;
    v1, lv1:array [1..2,1..5] of real;
    v2, lv2:array [1..5] of real;
    sg1, s:array [1..5] of real;
    sl:array[1..3,1..10] of integer;
begin    clrscr;
randomize;
{Generaciya obyshauyshich shisel}
for i:=1 to n do begin
    sl[1,i]:=random(10);
    sl[2,i]:=random(10);
    sl[3,i]:=sl[1,i]+sl[2,i];
    writeln(‘ ‘,sl[1,i],’ + ‘,sl[2,i],’ = ‘,sl[3,i]);
end;
{End of generation}

(*write(‘ Enter value of error> ‘);  {znashenie oshibki}
readln(e); *)
e:=0.0001;
for j:=1 to m do begin   {generation obychayushei viborki iz m slushainih obrazov}
    v1[1,j]:=(random(99)+1)/100;
    v1[2,j]:=(random(99)+1)/100;
    v2[j]:=(random(99)+1)/100;
end;

{Obyshenie neiroseti}
for i:=1 to n do begin
{repeat}
    for k:=1 to n do begin
        {writeln(e:4:4);}
        for j:=1 to m do begin
            s[j]:=sl[1,i]*v1[1,j]+sl[2,i]*v1[2,j];
            s[j]:=1/(1+exp(-1*s[j]));  {Sigmoidalnaya perehodnaya function neirona}
        end;
      sum:=0;
   for j:=1 to m do
       sum:=s[j]*v2[j]+sum;
       y:=1/(1+exp(-1*sum));
       sg2:=(y-sl[3,i])*y*(1-y);
       w2s:=0;
   for j:=1 to m do begin
       lv2[j]:=-0.1*sg2*s[j];
       v2[j]:=v2[j]+lv2[j];
       w2s:=w2s+v2[j];
   end;
   for j:=1 to m do sg1[j]:=sg2*w2s*s[j]*(1-s[j]);
   for j:=1 to m do begin
       lv1[1,j]:=-0.1*sg1[j]*sl[1,i];
       v1[1,j]:=v1[1,j]+lv1[1,j];
       lv1[2,j]:=-0.1*sg1[j]*sl[2,i];
       v1[2,j]:=v1[2,j]+lv1[2,j];
   end;
   e:=(0.5*(y-sl[3,i])*(y-sl[3,i]));
{until (0.5*(y-d[3,i])*(y-d[3,i]))>e}
   end;
end;
{Test obyshennoi seti}
writeln;
writeln(‘ Enter numbers for summation >>> ‘);
write(‘ 1-st number> ‘); readln(a);
write(‘ 2-nd number> ‘); readln(b);
for j:=1 to m do begin
   s[j]:=a*v1[1,j]+b*v1[2,j];
   s[j]:=1/(1+exp(-1*s[j]));
end;
     sum:=0;
  for j:=1 to m do sum:=s[j]*v2[j]+sum;
     y:=1/(1+exp(-1*sum)); y:=a+b-v2[1]/5;
writeln;
writeln(‘ Result: ‘);
writeln(‘ ‘,a,’ + ‘,b,’ ~ equally: ‘,y:4:4);
readln;
END.

Думаю что вссе уже o’key ;-)

Столько лет висит этот пример))). Но все равно спрошу))).
Никого не смущает в примере строчка?:

y:=1/(1+exp(-1*sum)); y:=a+b-v2[1]/5;

То есть сначала получили выход нейросети, а потом его переписали на y=a + b — [случайное число из выборки] и ждем что что то у нас сойдется?
А если без этой строчки, то выход y:=1/(1+exp(-1*sum)) — это сигмоид, который от 0 до 1, но ни как не даст ответ, например 1+1=2…
Или я что то не понимаю…

 К началу страницы 

+ Ответить 

2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)

Пользователей: 0

500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают

Связь с администрацией: bu_gen в домене octagram.name

56 / 0 / 1

Регистрация: 12.03.2014

Сообщений: 7

1

Реализация нейросети и обучение методом обратного распространения ошибок

25.05.2014, 19:44. Показов 6585. Ответов 2


Здравствуйте. Очень нужна помощь. Есть хорошая статья с примерами кода для реализации нейросети в паскаль.
http://www.gotai.net/documents/doc-nn-009-05.aspx
http://www.gotai.net/documents/doc-nn-009-06.aspx
НО, дело в том, что здесь не описаны некоторые переменные, а одни и те же значения иногда по разному называются. Мне очень нужна эта программа как пример, но мне не хватает знаний собрать все вместе и чтобы оно работало. Тем более, что здесь не показано, как подставлять конкретные значения в программу, что меня интересует больше всего.
Очень прошу, если кто разбирается, помогите собрать все в кучу. Или если есть у кого похожая рабочая программа на Делфи или Паскаль дайте ссылку. Мне нейросеть нужна для диплома, буду очень благодарна.

Добавлено через 1 час 55 минут
Уже не нужно, мне помогли разобраться. Если что могу выложить рабочий код на паскале.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Модератор

9488 / 4819 / 3213

Регистрация: 17.08.2012

Сообщений: 15,115

26.05.2014, 12:25

2

Цитата
Сообщение от Keylan93
Посмотреть сообщение

Если что могу выложить рабочий код на паскале.

Конечно, выкладывайте. Правило форума:

4. 11. Если вопрос был решен вами самостоятельно, отпишите об этом в своей теме — есть и другие люди, которые столкнутся с той же проблемой, и им поможет ваш ответ.



0



Keylan93

56 / 0 / 1

Регистрация: 12.03.2014

Сообщений: 7

26.05.2014, 17:20

 [ТС]

3

Лучший ответ Сообщение было отмечено Keylan93 как решение

Решение

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

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
program network;
const NUM = 4; {или любое другое! - количество нейронов
                 в предыдущем слое. Изменяется в зависимости от того, в каком
                 слое находится рассматриваемый нейрон}
NUM_INP = 4; {количество нейронов в каждом слое}
      NUM_HID = 4;
      NUM_OUT = 2;
type
    weights_type = array [1..NUM] of real;
    desired = array [1..NUM_OUT] of real;
    test = array [1..NUM_INP] of real;
    neuron_type = record
                      w : weights_type;      {весовые коэффициенты}
                      a : real;              {сигнал на выходе нейрона}
                      threshold : real;      {пороговое значение}
                      E : real;               {значение ошибки}
                      change : weights_type; {используется в процессе обучения}
                      t_change : real;       {аналогично}
                       //test_pat: weights_type;
                       //desired_output: desired;
                  end;
var ipl : array [1..NUM_INP] of neuron_type;
    hl  : array [1..NUM_HID] of neuron_type;
    ol  : array [1..NUM_OUT] of neuron_type;
     test_pat: test;
      desired_output: desired;
      i,j : byte;
  function sigmoid (x : real) : real;
begin
    if abs(x) < 38 {отсеиваем "опасные" аргументы}
        then sigmoid := 1/(1+exp(-x))
        else if x >= 38 {наше допущение для аргументов меньших -39 и больших 38}
                then sigmoid := 1
                else sigmoid := 0
end;
 
procedure run_network;
var
    i,j : byte; {счетчики для циклов 'for'}
    sum : real;
begin
{Обходим все нейроны входного слоя. Вычисляем сумму
 взвешенных сигналов для входного набора данных}
for i:=1 to NUM_INP do
    with ipl[i] do {i-ый нейрон входного слоя}
        begin
            sum:=0;
            for j:=1 to NUM_INP do
                sum:=sum + w[j] * test_pat[j];
            a:=sigmoid(sum - threshold)
        end;
 
{Обходим все нейроны скрытого слоя. Действуем так же,
 как с нейронами входного слоя}
for i:=1 to NUM_HID do
    with hl[i] do
        begin
            sum:=0;
            for j:=1 to NUM_INP do
                sum:=sum + w[j] * ipl[j].a;
            a:=sigmoid(sum - threshold)
        end;
 
{Все то же самое для выходного слоя}
for i:=1 to NUM_OUT do
    with ol[i] do
        begin
            sum:=0;
            for j:=1 to NUM_HID do
                sum:=sum + w[j] * hl[j].a;
            a:=sigmoid(sum - threshold);
        end;
end;
 
procedure calculate_output_layer_errors;
var i : byte; {for loop variable}
begin
    for i:=1 to NUM_OUT do
        with ol[i] do
            E:=(desired_output[i] - a) * a * (1 - a)
end;
 
procedure calculate_hidden_layer_errors;
var
    i,j : byte;
    sum : real;
begin
    for i:=1 to NUM_HID do {обсчитываем весь скрытый слой}
        with hl[i] do
        begin
            sum:=0; {sum error values from O/P layer}
            for j:=1 to NUM_OUT do
                sum:=sum + ol[j].E * ol[j].w[i]; {только веса, относящиеся к нейрону i}
            E:=a * (1 - a) * sum {no other w[] value}
        end;
end;
 
procedure update_output_weights;
const
    LEARNING_RATE = 0.025;
var
    i,j : byte;
begin
    for j := 1 to NUM_OUT do {для всех выходных узлов}
    with ol[j] do
    begin {для всех связей от скрытого слоя к этому выходному узлу}
        for i := 1 to NUM_HID do
            w[i] := w[i] + LEARNING_RATE * E * hl[i].t_change;
        {обучение порогового уровня}
        threshold := threshold - LEARNING_RATE * E
    end
end;
 
procedure update_hidden_weights;
const
    LEARNING_RATE = 0.025; {нет никаких причин, чтобы это значение не отличалось
                            от использованного для выходных узлов}
var
    i,j : byte;
begin
    for j := 1 to NUM_HID do {обходим все скрытые узлы}
    with hl[j] do
    begin {обрабатываем все связи от входного слоя к этому узлу}
        for i := 1 to NUM_INP do
        w[i] := w[i] + LEARNING_RATE * E * test_pat[i];
        {модифицируем пороговый уровень этого узла}
        threshold := threshold - LEARNING_RATE * E
    end
end;
begin
{задание весов скрытого слоя}
for i:=1 to NUM_HID do
hl[i].w[i]:=random(10)/10;
{задание весов выходного слоя}
for i:=1 to NUM_out do
ol[i].w[i]:=random(10)/10;
{входной вектор}
test_pat[1]:=-0.444;
test_pat[2]:=-0.253;
test_pat[3]:=-0.136;
test_pat[4]:=-0.868;
{выходной вектор}
 desired_output[1]:=0.6;
 desired_output[2]:=0.8;
run_network;
calculate_output_layer_errors;
calculate_hidden_layer_errors;
update_output_weights;
update_hidden_weights;
writeln('Результаты');
write (ol[1].a,' '); write(ol[2].a);
end.



0



Библиотека для моделирования нейронных сетей глубокого обучения.
Разрабатывается на языке Object Pascal Delphi XE.

Основные функции:

Создание и обучение математических моделей нейронных сетей на основе перцептронов глубокого обучения (Deep Learning) методом обратного распространения ошибки, различной архитектуры. Архитектура нейронной сети может быть достаточно вариативна, она состоит из различных слоев нейронов, соединенных между собой матрицами связей.
Основные структурные единицы нейронной сети реализованы в виде объектов:

  1. Нейронная сеть (TNeuronalNet) – объект, представляющий из себя список объектов (TObjectList) слоев из которых состоит нейросеть в порядке их расположения
    от входного слоя к выходному. Принцип расположения по порядку распространения активности нейронов сети. Методы объекта TNeuronalNet позволяют добавлять (AddLayer) и удалять
    (DeleteLayer) слои , а также подсети (AddSubnet, DeleteSubnet), представляющие отдельный список свойство Subnets (см. объект подсеть TSubnet).
    Сначала активизируются входные слои, за ними скрытые и в самом конце выходные (метод Activate). Обучение (обратное распространение ошибки) происходит в обратном порядке,
    от выхода ко входу (метод Learn). Последовательная активация и обучение реализуются методами (Activate и Learn) объекта TNeuronalNet в которых последовательно вызываются
    соответствующие методы слоев.В новой версии (Декабрь 2018) добавлено сохранение сети в формат XML.
  2. Объект Слой (TLayer) – представляет список нейронов, входящих в этот слой. Все нейроны слоя активируются и обучаются одновременно, используя методы слоя для вызова методов активации (Activate) и обучения (Learn) каждого нейрона. Также, методы объекта позволяют добавлять нейроны в список и удалять их. Типы слоев: InputL – входной слой, HiddenL – выходной слой, ContextInputL – Контекстный слой на который приходит возбуждение с выходного слоя на предыдущем цикле, ContextOutputL – Выходной контекстный слой который на следующем цикле будет возбуждать входной контекстный, ManageL – управляющий слой, содержащий нейроны, имеющие фиксированные значения активации для управления порогами активации нейронов различных слоев. Также существуют методы добавления и удаления нейронов CreateNeuron, DeleteNeuron, CreateNeurons(NumberNeurons). Методы добавления связей с нейронами другого слоя — ConnectToLayer(Layer).
  3. Объект подсеть (TSubNet) – также представляет список нейронов, которые могут относиться к разным слоям от выходных до входных. У каждой такой подсети есть относящиеся к ней выходные нейроны, относящиеся к определенным выходным слоям, которые определяют ошибку, распространяющуюся только по нейронам данной подсети. Если нейрон относится к данной подсети, его входные связи обучаются относительно ошибки, распространяемой от выходных нейронов только данной подсети. Если нейрон не относится ни к одной подсети, его связи при обучении не модифицируются. Любой нейрон может относиться к нескольким подсетям и обучаться от ошибок всех этих подсетей.
  4. Объект нейрон (TNeuron) – представляет список всех входных связей (объектов TConnection) от данного нейрона. В нем также содержаться методы осуществляющие активацию (Activate), распространение ошибки (SendSigma) и обучение (модификацию связей) (Learn). Также объект TNeuron содержит список значений ошибок (равный списку подсетей), за которые отвечал данный нейрон (вычисленные при использовании процедуры обратного распространения ошибки) полученные от выходов различных подсетей.
  5. Объект связь (TConnection) – содержит величину связи, ссылку на объект нейрон-владелец и объект нейрон предыдущего слоя с которым владелец связан.
  • Описание и результаты отладки модели
  • Описание библиотеки NeuronalNet
  • Описание библиотеки BCNNLib
  • Описание библиотеки BCNNMap

  • Загрузка библиотеки NeuronalNet.pas для созлания нейронных сетей

  • Загрузить

  • Загрузка библиотеки BCNN.pas для создания нейросетевых моделей BCNN (Brain Centers Neuronal Network)

  • Загрузить

  • Загрузка испоняемого файла BCNNWin.exe для обучения нейросетевых моделей BCNN по ЭЭГ (Brain Centers Neuronal Network)

  • Загрузить
  • Я описывал каждый отдельный нейрон как запись, содержащую все необходимые части:

    • Список весовых коэффициентов для связей между
      данным нейроном и всеми нейронами предыдущего
      слоя (или входными данными, если нейрон находится
      во входном слое). Каждый весовой коэффициент —
      действительное число (по 1 весовому коэффициенту
      на нейрон предыдущего слоя)
    • Пороговый уровень (см. далее) (см. также
      примечание переводчика в конце главы)
    • Значение ошибки. Используется только на стадии
      обучения. Эта величина необязательно дожна быть
      связана с нейроном, я сделал это только для
      удобочитаемости кода.
    • Изменение ошибки. Также используется только во
      время обучения.

    Вот само описание нейрона:

    const NUM = 10; 
    type
        weights_type = array [1..NUM] of real;
        neuron_type = record
                          w : weights_type;      
                          a : real;              
                          threshold : real;
                          E : real               
                          change : weights_type; 
                          t_change : real;       
                      end;
    

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

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

    const MAX_INP = 4; 
          MAX_HID = 4;
          MAX_OUT = 2;
    
    var ipl : array [1..MAX_INP] of neuron_type;
        hl  : array [1..MAX_HID] of neuron_type;
        ol  : array [1..MAX_OUT] of neuron_type;
    

    Активационные (переходные) функции

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

    Эта функция, как считается, наиболее
    точно описывает активность настоящих нейронов
    мозга и наиболее часто используется в
    искусственных нейронных сетях. Код на паскале
    для этой функции:

    function sigmoid (x : real) : real;
    begin 
        sigmoid := 1/(1 + exp(-x))
    end;
    

    Однако паскалевская функция exp
    приводит к ошибке в программе, если входное
    значение выходит из промежутка -39..38. К счастью,
    эти настолько значения далеко отстоят от начала
    координат, что мы можем считать: при аргументе
    < -39 значение функции равно 0, при аргументе > 38, —
    значение функции равно 1. Для предотвращения
    ошибки добавим несколько строчек:

    function sigmoid (x : real) : real;
    begin
        if abs(x) < 38 
            then sigmoid := 1/(1+exp(-x)) 
            else if x >= 38 
                    then sigmoid := 1
                    else sigmoid := 0
    end;
    

    Пороговое значение

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

      1
    a = 
      -(Si aiwi — Q)
      1 + e  

    где
    a — активность нейрона,
    ai — активность i-ого нейрона предыдущего слоя (или i-ое входное
    значение, если мы вычисляем активность нейрона
    входного слоя),
    wi — вес связи между данным нейроном и i-ым нейроном предыдущего слоя.

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

    procedure run_network;
    var 
        i,j : byte; 
        sum : real;
    begin
    
    for i:=1 to MAX_INP do
        with ipl[i] do 
            begin 
                sum:=0;
                for j:=1 to NUM_INPUTS do
                    sum:=sum + w[j] * test_pat[j];
                a:=sigmoid(sum - threshold)
            end;
    
    
    for i:=1 to MAX_HID do
        with hl[i] do
            begin 
                sum:=0;
                for j:=1 to MAX_INP do
                    sum:=sum + w[j] * ipl[j].a;
                a:=sigmoid(sum - threshold)
            end;
    
    
    for i:=1 to MAX_OUT do
        with ol[i] do
            begin 
                sum:=0;
                for j:=1 to MAX_HID do
                    sum:=sum + w[j] * hl[j].a;
                a:=sigmoid(sum - threshold);
            end;
    end;
    

    Эта процедура состоит из трех очень
    похожих друг на друга блоков, по блоку на каждый
    слой нейронной сети. Выражение «with»
    позволяет обращаться к полям записей без
    упоминания самой записи, т.е. кусок кода:

    полностью аналогичен:

    Каждый слой нейронов базируется на
    выходе предыдущего слоя (за исключением входного
    слоя, базирующегося непосредственно на
    предъявляемых сети входных данных (в коде —
    массив test_pat). Это значит, что значения входного
    слоя должны быть полностью расчитаны до
    вычисления значений скрытого слоя, которые в
    свою очередь, должны быть рассчитаны до
    вычисления значений выходного слоя.

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

    Например, если нейронная сеть
    используется для того, чтобы определить, персона
    какого пола запечатлена на фотографии, то
    возможно существование двух нейронов в выходном
    слое: для мужского пола на выходе «М» должно
    появиться значение 1, а на выходе «Ж» — 0.
    Соответственно, при предъявлении сети женской
    фотографии, выходные нейроны выдают обратные
    значения («М»=0, «Ж»=1). На практике, если
    на выходе «М» — число 0.0261, а на выходе «Ж»
    — число 0.9932, то сеть выдает заключение о том, что
    на фотографии — женское лицо (точных значений 1
    или 0 вряд ли можно добиться).

    Если вам каким-либо образом уже
    известны весовые коэффициенты, то следующую
    главу можете смело пропустить. В противном
    случае, вам все таки придется приступить к
    обучению сети и столкнуться с понятием обратного
    распространения ошибки…


    примечание переводчика:

    В литературе более распространен
    несколько отличающийся подход к «пороговому
    уровню». Боулс использует именно слово «пороговый»
    (threshold), подразумевая биологическую сторону
    вопроса (т.е. природу реального нейрона). В
    литературе обычно используют другой термин — «смещение»
    (bias), обосновывая необходимость введения такой
    величины математически (обеспечивается смещение
    кривой графика относительно 0, а как следствие
    большая гибкость функции). Такое расхождение,
    однако, не приводит к коренным разногласиям в
    реализации и математическом аппарате.


    Предыдущая Оглавление Следующая

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

    Модератор: Модераторы

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

    Подскажите есть ли на freepascale компоненты или библиотеки для организации нейро сети?
    Примеры кода?
    Какие есть варианты?

    Crystal_Ra
    новенький
     
    Сообщения: 11
    Зарегистрирован: 24.03.2011 18:14:39

    Re: нейронная сеть

    Сообщение скалогрыз » 11.04.2014 23:26:54

    скалогрыз
    долгожитель
     
    Сообщения: 1801
    Зарегистрирован: 03.09.2008 02:36:48

    Re: нейронная сеть

    Сообщение svk12 » 12.04.2014 02:38:34

    svk12
    постоялец
     
    Сообщения: 387
    Зарегистрирован: 09.06.2008 18:42:47

    Re: нейронная сеть

    Сообщение Crystal_Ra » 15.04.2014 13:33:07

    а разработки на freepascale ?
    может и в Лазаря компонет есть?
    ну или какие-то живые работающие примеры ?

    Crystal_Ra
    новенький
     
    Сообщения: 11
    Зарегистрирован: 24.03.2011 18:14:39

    Re: нейронная сеть

    Сообщение svk12 » 15.04.2014 17:54:36

    Этот пакет после преобразования из меню «Сервис» спокойно устанавливается
    в Лазаря.
    Примеры работают, аналогично, после преобразования.

    svk12
    постоялец
     
    Сообщения: 387
    Зарегистрирован: 09.06.2008 18:42:47


    Вернуться в Общее

    Кто сейчас на конференции

    Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    Нейронная Сеть На Pascal — 1

    Matrixcoding
    HD

    12:18

    Нейронная Сеть На Pascal — 1

    Matrixcoding


    Дата публикации:

    24.08.2017 12:29


    Продолжительность:

    12:18

    Ссылка:

    https://thewikihow.com/video_gnxS4uIeBs0


    Действия:


    Источник:

    Описание

    Подписывайтесь на наш Telegram канал!@thewikihowоткрытьМониторим видео тренды 24/7

    Explore more videos from Matrixcoding

    Фото обложки и кадры из видео

    Нейронная Сеть На Pascal — 1, Matrixcoding

    https://thewikihow.com/video_gnxS4uIeBs0

    Аналитика просмотров видео на канале Matrixcoding

    Гистограмма просмотров видео «Нейронная Сеть На Pascal — 1» в сравнении с последними загруженными видео.

    Теги:

    Neural Network

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

    Похожие видео

    Нейросеть Своими Руками За 10 Минут На Python

    11:10

    907 627 просмотров.

    Строим Нейронную Сеть Для Распознавания Изображений За 20 Минут

    19:57

    60 447 просмотров.

    Как На Самом Деле Работает Нейросеть?

    10:00

    398 335 просмотров.

    Нейросеть Угадывает Цифры С++ (Многослойный Персептрон C++)

    42:45

    171 779 просмотров.

    Как Сделать Нейросеть В Delphi

    08:12

    6 333 просмотра.

    Делаю Нейросеть С Нуля

    17:17

    1 256 699 просмотров.

    Нейросеть Уничтожила Flappy Bird [Перевод Code Bullet]

    06:31

    1 929 072 просмотра.

    Операционные Системы Написанные На Pascal,  Delphi,  Lazarus Ide,  Freepascal,  Turbo Pascal,  Modula-2

    08:08

    1 621 просмотр.

    Что Такое Нейронные Сети? Для Новичков,  Про It,  Geekbrains

    06:55

    34 952 просмотра.

    Рекомендованные вам

    Учимся Обучать Нейронные Сети,  За 30 Минут От Теории До Практики

    36:20

    3D Raycasting На Pascal Abc.net - 1

    37:34

    Сделал Ботов На Нейросетях И Заставил Их Сражаться

    30:36

    Как Я Начал Изучать Нейросети И Python

    14:54

    Graph3D На Pascalabc! 3D Теперь Реально! Как И Чего Можно Сделать?

    11:33

    Нейросети - Самое Понятное Объяснение + Пишем Нейросеть С Нуля

    14:47

    Клеточные Автоматы На Частицах

    14:49

    Сделал Генетический Алгоритм,  Симуляция Эволюции

    07:04

    Понравилась статья? Поделить с друзьями:

    Не пропустите и эти статьи:

  • Как написать нейросеть генерирующую текст
  • Как написать нейросеть генерирующую картинки
  • Как написать нейронную сеть на python
  • Как написать нейрон на python
  • Как написать нейминг

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии