diff --git a/programs/develop/libraries/nnp/about.htm b/programs/develop/libraries/nnp/about.htm index 624d97aa26..2c00f71b0a 100644 --- a/programs/develop/libraries/nnp/about.htm +++ b/programs/develop/libraries/nnp/about.htm @@ -53,6 +53,7 @@ table { font-size: 15px; } @@ -69,7 +71,7 @@ table { font-size: 15px; }

Документация к библиотеке nnp.obj, для ОС Колибри. Эта библиотека создана для работы с нейросетями (neural network perceptron). Видео по нейросетям: 1, 2. Исходный код (язык java), на основе которого делалсь библиотека: 3.

-

Последнее обновление библиотеки 01.03.22.

+

Последнее обновление библиотеки 28.05.22.

Функции

@@ -96,40 +98,45 @@ ends nnlopt dd 2,8,8,8,8,8,3 ... stdcall [NNP_Create], nnp_0, 0.01, 0, 0, nnlopt, NNLOPT_LEN -

где nnp_0 - структура буфера.

+

где nnp_0 - структура нейросети.

0.01 - скорость обучения.

0 - адрес функции активации, если 0 то берется стандартная функция внутри библиотеки.

0 - адрес функции свёртки, если 0 то берется стандартная функция внутри библиотеки.

nnlopt - массив с числом нейронов на каждом слое.

NNLOPT_LEN - длинна массива nnlopt.

+

NNP_Reset

+

Сброс параметров нейросети. Для каждого слоя базисный вектор и веса заполняются случайными числами от -1 до 1. Такие же действия происходят в конструкторе NNP_Create.

+
stdcall [NNP_Reset], nnp_0
+

где nnp_0 - структура нейросети.

+

NNP_FeedForward

Функция расчета значений выходных нейронов. На вход подаються значения входных нейронов. На выходе возвращается указатель на слой выходных нейронов.

n_input dq ?,?,?
 ...
 stdcall [NNP_FeedForward], nnp_0,n_input
-

где nnp_0 - структура буфера, n_input - указатель на данные входных нейронов.

+

где nnp_0 - структура нейросети, n_input - указатель на данные входных нейронов.

NNP_BackPropagation

Функция для обучения сети. Пример:

n_targ dq ?,?,?
 ...
 stdcall [NNP_BackPropagation], nnp_0, n_targ
-

где nnp_0 - структура буфера, n_targ - указатель на данные для обучения сети.

+

где nnp_0 - структура нейросети, n_targ - указатель на данные для обучения сети.

NNP_GetMemData

Берет данные нейросети и записывает их в указанное место в памяти. Пример:

f_data dd ?
 ...
 stdcall [NNP_GetMemData], nnp_0, NNP_FF_JSON, [f_data]
-

где nnp_0 - структура буфера, f_data - указатель на данные для записи параметров сети.

+

где nnp_0 - структура нейросети, f_data - указатель на данные для записи параметров сети.

NNP_SetMemData

-

Берет данные из указанного места памяти и записывает их в нейросеть. Пример:

+

Берет данные из указанного места памяти и записывает их в нейросеть. В случае успеха в регистре eax возвращается 0, иначе указатель на строку с текстом ошибки. Пример:

f_data dd ?
 ...
 stdcall [NNP_SetMemData], nnp_0, NNP_FF_JSON, [f_data]
-

где nnp_0 - структура буфера, f_data - указатель на данные с параметрами сети.

+

где nnp_0 - структура нейросети, f_data - указатель на данные с параметрами сети.

NNP_Destroy

Освобождает память занятую нейросетью.

@@ -145,24 +152,31 @@ stdcall [NNP_SetMemData], nnp_0, NNP_FF_JSON, [f_data]
align 4
 import_nnp_lib:
 	dd sz_lib_init
-	NNP_Create dd sz_nnp_create
-	NNP_FeedForward dd sz_nnp_FeedForward
-	NNP_BackPropagation dd sz_nnp_BackPropagation
-	NNP_GetMemData dd sz_nnp_GetMemData
-	NNP_SetMemData dd sz_nnp_SetMemData
-	NNP_Destroy dd sz_nnp_Destroy
-	dd 0,0
-	sz_lib_init db 'lib_init',0
-	sz_nnp_create db 'NNP_Create',0
-	sz_nnp_FeedForward db 'NNP_FeedForward',0
-	sz_nnp_BackPropagation db 'NNP_BackPropagation',0
-	sz_nnp_GetMemData db 'NNP_GetMemData',0
-	sz_nnp_SetMemData db 'NNP_SetMemData',0
-	sz_nnp_Destroy db 'NNP_Destroy',0
+	NNP_Create      dd sz_create
+	NNP_Reset       dd sz_reset
+	NNP_FeedForward dd sz_feedforward
+	NNP_BackPropagation dd sz_backpropagation
+	NNP_GetMemData  dd sz_getmemdata
+	NNP_SetMemData  dd sz_setmemdata
+	NNP_Destroy     dd sz_destroy
+dd 0,0
+	sz_lib_init     db 'lib_init',0
+	sz_create       db 'NNP_Create',0
+	sz_reset        db 'NNP_Reset',0
+	sz_feedforward  db 'NNP_FeedForward',0
+	sz_backpropagation db 'NNP_BackPropagation',0
+	sz_getmemdata   db 'NNP_GetMemData',0
+	sz_setmemdata   db 'NNP_SetMemData',0
+	sz_destroy      db 'NNP_Destroy',0
 
-

История

-

01.03.22 - самая первая версия библиотеки (примеры использования возможно будут позже).

+

Пример

+

В данном примере создаются 8 объектов (точек с координатами x, y), каждый из которых имеет тип 0 (синие) или 1 (зеленые). При нажатии кнопки происходит тренировка нейросети. В процессе тренировки нейросеть учится определять какой цвет должен соответствовать заданным координатам x, y. Тренировать сеть можно много раз, число циклов тренировки показано в заголовке окна. Кнопка переставляет точки случайным образом. Кнопка сбрасывает состояние нейросети.

+

+

Рис. 1. Пример использования библиотеки

+

История

+

01.03.22 - самая первая версия библиотеки.

+

28.05.22 - пример использования библиотеки, новая функция NNP_Reset, обновление функции NNP_SetMemData.

\ No newline at end of file diff --git a/programs/develop/libraries/nnp/but01.png b/programs/develop/libraries/nnp/but01.png new file mode 100644 index 0000000000..dd2a9552d7 Binary files /dev/null and b/programs/develop/libraries/nnp/but01.png differ diff --git a/programs/develop/libraries/nnp/but04.png b/programs/develop/libraries/nnp/but04.png new file mode 100644 index 0000000000..87b112ab6d Binary files /dev/null and b/programs/develop/libraries/nnp/but04.png differ diff --git a/programs/develop/libraries/nnp/but05.png b/programs/develop/libraries/nnp/but05.png new file mode 100644 index 0000000000..27ec66d322 Binary files /dev/null and b/programs/develop/libraries/nnp/but05.png differ diff --git a/programs/develop/libraries/nnp/examples/build.bat b/programs/develop/libraries/nnp/examples/build.bat new file mode 100644 index 0000000000..b93ada8388 --- /dev/null +++ b/programs/develop/libraries/nnp/examples/build.bat @@ -0,0 +1,6 @@ +if not exist bin mkdir bin +@fasm.exe ..\nnp.asm bin\nnp.obj + +@fasm.exe -m 16384 nnp_points.asm bin\nnp_points.kex +@kpack nnp_points.kex +pause \ No newline at end of file diff --git a/programs/develop/libraries/nnp/examples/nnp_points.asm b/programs/develop/libraries/nnp/examples/nnp_points.asm new file mode 100644 index 0000000000..2a8edac0a3 --- /dev/null +++ b/programs/develop/libraries/nnp/examples/nnp_points.asm @@ -0,0 +1,747 @@ +use32 + org 0 + db 'MENUET01' ;Ё¤Ґ­вЁд. ЁбЇ®«­пҐ¬®Ј® д ©«  ўбҐЈ¤  8 Ў ©в + dd 1, start, i_end, mem, stacktop, 0, sys_path + +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../KOSfuncs.inc' +include '../../../../load_img.inc' +include '../../../../load_lib.mac' +include '../../../../develop/libraries/box_lib/trunk/box_lib.mac' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'NNP example 28.05.22',0 ;Ї®¤ЇЁбм ®Є­  + +run_file_70 FileInfoBlock + +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +image_data_toolbar dd 0 + +memory_file_size dd 512*1024 ;а §¬Ґа Ї ¬пвЁ ¤«п ®вЄалвЁп д ©«®ў (ў ­ з «Ґ 512 Kb, ­® ¬®¦Ґв 㢥«ЁзЁў вбп ЇаЁ ­Ґ®Ўе®¤Ё¬®бвЁ) + +NNP_FF_BIN equ 0x6e6962 +NNP_FF_JSON equ 0x6e6f736a + +struct NeuralNetwork + learningRate dq ? ;+ 0 бЄ®а®бвм ®Ўг祭Ёп + layers dd ? ;+ 8 [] б«®Ё + layers_length dd ? ;+12 зЁб«® б«®Ґў + activation dd ? ;+16 гЄ § вҐ«м ­  дг­ЄжЁо  ЄвЁў жЁЁ + derivative dd ? ;+20 гЄ § вҐ«м ­  дг­ЄжЁо + errors dd ? ;+24 ¬ ббЁў ¤«п ўлзЁб«Ґ­Ё© + errorsNext dd ? ;+28 + gradients dd ? ;+32 + deltas dd ? ;+36 +ends + +struct Point + x dq ? ;double + y dq ? + t dd ? ;long +ends + +align 4 +NNLOPT_LEN equ 4 +nnlopt dd 2,3,3,2 +_nn NeuralNetwork +lea_rate dq 0.01 + +POINTS_COUNT equ 8 ;зЁб«® в®зҐЄ +_p rb sizeof.Point*POINTS_COUNT + +_cycles_st dd 0 +_r_op rb 128 +txt_error db '"Error open: ',39,'%s',39,'" -tE',0 +txt_cycles db 'Cycles = %i000',0 + +;Њ Єа®б ¤«п Ї а ¬Ґва®ў вЁЇ  double (8 Ў ©в) +macro glpush double_v { + push dword[double_v+4] + push dword[double_v] +} + +align 8 +proc __ftol + sub esp,12 + wait + fstcw word[esp+8] + wait + mov al,[esp+9] + or byte[esp+9],0x0c + fldcw word[esp+8] + fistp qword[esp] + mov [esp+9],al + fldcw word[esp+8] + mov eax,[esp] + mov edx,[esp+4] + add esp,12 + ret +endp + +align 16 +Math_random: + imul eax,dword[_rand_x],22695477 + inc eax + push ecx + mov dword[_rand_x],eax + and eax,65535 + mov dword[esp],eax + fild dword[esp] + fmul dword[@f] + pop edx + ret +align 4 +@@: + db 0,0,128,55 ;dd 1.0/65536.0 +_rand_x dd 0 + + +align 8 +start: + load_libraries l_libs_start,l_libs_end + ;Їа®ўҐаЄ  ­  бЄ®«мЄ® г¤ з­® § Јг§Ё« бм ЎЁЎ«Ё®вҐЄ  + mov ebp,lib_0 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall SF_TERMINATE_PROCESS + @@: + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors + mcall SF_SET_EVENTS_MASK,0xC0000027 + stdcall [OpenDialog_Init],OpenDialog_data ;Ї®¤Ј®в®ўЄ  ¤Ё «®Ј  + stdcall [buf2d_create], buf_0 ;ᮧ¤ ­ЁҐ ЎгдҐа  + + include_image_file 'toolbar.png', image_data_toolbar + + stdcall mem.Alloc,[memory_file_size] + mov dword[open_file],eax + + push NNLOPT_LEN + push nnlopt + push 0 + push 0 + glpush lea_rate + stdcall [NNP_Create], _nn + call but_update + +align 8 +red_win: + call draw_window + +align 16 +still: + mcall SF_WAIT_EVENT + + cmp al,1 + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 ;¬лим + jne @f + jmp mouse + @@: + jmp still + +align 8 +draw_window: +pushad + mcall SF_REDRAW,SSF_BEGIN_DRAW + + ; *** аЁб®ў ­ЁҐ Ј« ў­®Ј® ®Є­  (ўлЇ®«­пҐвбп 1 а § ЇаЁ § ЇгбЄҐ) *** + mov edx,[sc.work] + or edx,(3 shl 24)+0x30000000 + mov edi,caption + mcall SF_CREATE_WINDOW, (20 shl 16)+590, (20 shl 16)+540 + + ; *** ᮧ¤ ­ЁҐ Є­®Ї®Є ­  Ї ­Ґ«м *** + mov esi,[sc.work_button] + mcall SF_DEFINE_BUTTON, (5 shl 16)+20, (5 shl 16)+20, 3 + + add ebx,(25 shl 16) + mov edx,4 + int 0x40 + + add ebx,(25 shl 16) + mov edx,5 + int 0x40 + + add ebx,(30 shl 16) + mov edx,6 + int 0x40 + + add ebx,(25 shl 16) + mov edx,7 + int 0x40 + + ; *** аЁб®ў ­ЁҐ ЁЄ®­®Є ­  Є­®ЇЄ е *** + mcall SF_PUT_IMAGE, [image_data_toolbar], (16 shl 16)+16, (7 shl 16)+7 ;icon new + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;icon open + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;icon save + int 0x40 + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(30 shl 16) ;icon update points + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;icon calculate + int 0x40 + + call PointsDraw + ; *** аЁб®ў ­ЁҐ ЎгдҐа  *** + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW,SSF_END_DRAW +popad + ret + +align 8 +key: + mcall SF_GET_KEY + jmp still + +align 8 +mouse: + + jmp still + +align 8 +button: + mcall SF_GET_BUTTON + cmp ah,3 + jne @f + call but_new_file + jmp red_win + @@: + cmp ah,4 + jne @f + call but_open_file + jmp red_win + @@: + cmp ah,5 + jne @f + call but_save_file + jmp red_win + @@: + cmp ah,6 + jne @f + call but_update + jmp red_win + @@: + cmp ah,7 + jne @f + call but_calc + jmp red_win + @@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 + stdcall mem.Free,[image_data_toolbar] + stdcall mem.Free,[open_file] + stdcall [NNP_Destroy], _nn + mcall SF_TERMINATE_PROCESS + +align 8 +but_calc: + push esi edi ebp + add esp,-32 + mov ebp,_p + xor edi,edi ;i=0 +.cycle_0: ;for(i=0;i<50000;i++) + call Math_random + fimul dword[.172] + call __ftol + mov esi,eax ;k=(long)(Math_random()*POINTS_COUNT) + imul esi,sizeof.Point + fld qword[ebp+esi+Point.x] + fsub dword[f_0_5] + fstp qword[esp] ;v[0]=p[k].x-.5 + fld qword[ebp+esi+Point.y] + fsub dword[f_0_5] + fstp qword[esp+8] ;v[1]=p[k].y-.5 + stdcall [NNP_FeedForward], _nn,esp ;r=NNP_FeedForward(&nn,v) + + xor eax,eax + mov dword[esp+16],eax + mov dword[esp+20],eax ;t[0]=0.0 + mov dword[esp+24],eax + mov dword[esp+28],eax ;t[1]=0.0 + cmp dword[ebp+esi+Point.t],eax + je .173 + mov dword[esp+16],eax + mov dword[esp+20],1072693248 ;if(p[k].t) t[0]=1.0 + jmp .174 +.173: + mov dword[esp+24],eax + mov dword[esp+28],1072693248 ;else t[1]=1.0 +.174: + lea edx,dword[esp+16] + stdcall [NNP_BackPropagation], _nn,edx ;NNP_BackPropagation(&nn,t) + inc edi ;i++ + cmp edi,50000 + jl .cycle_0 + add dword[_cycles_st],50 + stdcall [sprintf], _r_op,txt_cycles,[_cycles_st] + add esp,12 + call NNP_DrawInBuf + call PointsDraw +; SaveNN("/tmp0/1/nnp_end.txt") + ;push s@+835 + ;call @@SaveNN$qpxc + ;pop ecx + mcall SF_SET_CAPTION,1,_r_op + add esp,32 + pop ebp edi esi + ret +align 4 +.172: + dd POINTS_COUNT + +align 8 +but_new_file: + mov dword[_cycles_st],0 + stdcall [NNP_Reset], _nn + call NNP_DrawInBuf + call PointsDraw + ret + +align 8 +but_update: + mov dword[_cycles_st],0 + call PointsInit + call NNP_DrawInBuf + call PointsDraw + ret + +align 8 +PointsInit: + push ebx esi + xor esi,esi ;i=0 + mov ebx,_p +.cycle_0: ;for(i=0;ilayers_length; i++) + xor esi,esi ;j=0 + mov eax,edi + imul eax,sizeof.Layer + mov edx,[ebp+8] + add eax,[edx+NeuralNetwork.layers] + mov edx,[eax+Layer.n_size] + mov [ebp-4],edx + mov edx,[eax+Layer.c_size] + mov [ebp-8],edx + jmp .2 +.cycle_1: ;for (j=0; j < o->layers[i].c_size; j++) + call Math_random + fmul dword[f_2_0] + fsub dword[f_1_0] + mov eax,[ebp+8] ;o + mov ecx,edi + imul ecx,sizeof.Layer + add ecx,[eax+NeuralNetwork.layers] + mov ecx,[ecx+Layer.biases] + fstp qword[ecx+8*esi] + xor ebx,ebx ;k=0 + cmp ebx,[ebp-4] + jae .1 +@@: ;for (k=0; k < o->layers[i].n_size; k++) + call Math_random + fmul dword[f_2_0] + fsub dword[f_1_0] + mov eax,edi + imul eax,sizeof.Layer + mov edx,[ebp+8] ;o + add eax,[edx+NeuralNetwork.layers] + mov eax,[eax+Layer.weights] + mov edx,[eax+4*esi] ;edx = &o->layers[i].weights[j] + fstp qword[edx+8*ebx] ;o->layers[i].weights[j][k] = Math_random()*2.0-1.0; + inc ebx ;k++ + cmp ebx,[ebp-4] + jb @b +.1: + inc esi ;j++ +.2: + cmp esi,[ebp-8] + jb .cycle_1 + inc edi ;i++ +.3: + mov ecx,[ebp+8] ;o + cmp edi,[ecx+NeuralNetwork.layers_length] + jb .cycle_0 + pop edi esi ebx + mov esp,ebp + pop ebp + ret 4 + +;расчет входных Рё выходных нейронов ;+ 8 NeuralNetwork* o ;+12 double* inputs align 16 @@ -621,7 +689,7 @@ NNP_GetMemData: mov ebp,esp add esp,-12 push ebx esi edi - cmp dword[ebp+12],1852797802 + cmp dword[ebp+12],NNP_FF_JSON jne .end_f mov esi,[ebp+16] mov byte[esi],0 @@ -665,14 +733,15 @@ align 4 add esi,eax stdcall [_strcat], esi,txt_nl_t_Qc_sizeQ add esp,8 - lea ebx,[edi+4*edi] + mov ebx,edi + imul ebx,sizeof.Layer push 1 push 0 - mov eax,[ebp+8] - mov edx,[eax+8] + mov edx,[ebp+8] + mov edx,[edx+NeuralNetwork.layers] xor eax,eax add esp,-8 - mov ecx,[edx+4*ebx] + mov ecx,[edx+ebx+Layer.c_size] mov dword[ebp-12],ecx mov dword[ebp-8],eax fild qword[ebp-12] @@ -685,11 +754,11 @@ align 4 add esp,8 push 1 push 0 - mov edx,[ebp+8] - mov ecx,[edx+8] + mov ecx,[ebp+8] + mov ecx,[ecx+NeuralNetwork.layers] xor edx,edx add esp,-8 - mov eax,[ecx+4*ebx+4] + mov eax,[ecx+ebx+Layer.n_size] mov dword[ebp-12],eax mov dword[ebp-8],edx fild qword[ebp-12] @@ -713,10 +782,11 @@ align 4 .235: push 1 push PRECISION - lea eax,[edi+4*edi] + mov eax,edi + imul eax,sizeof.Layer mov edx,[ebp+8] - mov ecx,[edx+8] - mov eax,[ecx+4*eax+8] + mov ecx,[edx+NeuralNetwork.layers] + mov eax,[ecx+eax+Layer.neurons] push dword[eax+8*ebx+4] push dword[eax+8*ebx] call @@DoubleToStr$qduso @@ -746,10 +816,11 @@ align 4 .239: push 1 push PRECISION - lea eax,[edi+4*edi] + mov eax,edi + imul eax,sizeof.Layer mov edx,[ebp+8] - mov ecx,[edx+8] - mov eax,[ecx+4*eax+12] + add eax,[edx+NeuralNetwork.layers] + mov eax,[eax+Layer.biases] push dword[eax+8*ebx+4] push dword[eax+8*ebx] call @@DoubleToStr$qduso @@ -758,17 +829,19 @@ align 4 add esp,8 inc ebx .238: - lea ecx,[edi+4*edi] + mov ecx,edi + imul ecx,sizeof.Layer mov eax,[ebp+8] - mov edx,[eax+8] - cmp ebx,[edx+4*ecx] + add ecx,[eax+NeuralNetwork.layers] + cmp ebx,[ecx+Layer.c_size] jb .cycle_2 stdcall [_strcat], esi,txt_sqbr_zap_t_QweightsQ add esp,8 mov eax,[ebp+8] - lea ecx,[edi+4*edi] - mov edx,[eax+8] - cmp dword[edx+4*ecx+4],0 + mov ecx,edi + imul ecx,sizeof.Layer + add ecx,[eax+NeuralNetwork.layers] + cmp dword[ecx+Layer.n_size],0 je .241 xor ebx,ebx jmp .243 @@ -791,10 +864,11 @@ align 4 .247: push 1 push PRECISION - lea edx,[edi+4*edi] - mov ecx,[ebp+8] - mov eax,[ecx+8] - mov edx,[eax+4*edx+16] + mov edx,edi + imul edx,sizeof.Layer + mov eax,[ebp+8] + add edx,[eax+NeuralNetwork.layers] + mov edx,[edx+Layer.weights] mov ecx,[edx+4*ebx] mov eax,[ebp-4] push dword[ecx+8*eax+4] @@ -811,20 +885,22 @@ align 4 add esp,8 inc dword[ebp-4] .246: - lea ecx,[edi+4*edi] + mov ecx,edi + imul ecx,sizeof.Layer mov eax,[ebp+8] - mov edx,[eax+8] - mov ecx,[edx+4*ecx+4] + add ecx,[eax+NeuralNetwork.layers] + mov ecx,[ecx+Layer.n_size] cmp ecx,[ebp-4] ja .245 stdcall [_strcat], esi,txt_sqbr add esp,8 inc ebx .243: - lea eax,[edi+4*edi] - mov edx,[ebp+8] - mov ecx,[edx+8] - cmp ebx,[ecx+4*eax] + mov eax,edi + imul eax,sizeof.Layer + mov ecx,[ebp+8] + add eax,[ecx+NeuralNetwork.layers] + cmp ebx,[eax+Layer.c_size] jb .242 .241: stdcall [_strcat], esi,txt_sqbr_fbr_zap @@ -852,27 +928,26 @@ NNP_GetMaxLLen: cmp dword[ebx+NeuralNetwork.layers_length],1 jge .1 xor eax,eax - jmp .5 + jmp .end_f .1: mov edx,[ebx+NeuralNetwork.layers] - mov eax,[ebx+NeuralNetwork.layers] - add eax,sizeof.Layer + lea eax,[edx+sizeof.Layer] mov ecx,[edx] - mov edx,1 - jmp .4 -.2: + mov edx,1 ;i=1 + jmp .3 +.cycle_0: ;for (i=1; i < o->layers_length; i++) mov esi,[eax] cmp esi,ecx - jbe .3 + jbe .2 mov ecx,esi -.3: +.2: inc edx add eax,sizeof.Layer -.4: +.3: cmp edx,[ebx+NeuralNetwork.layers_length] - jl .2 + jl .cycle_0 mov eax,ecx -.5: +.end_f: pop esi ebx ebp ret 4 @@ -934,18 +1009,18 @@ NNP_SetMemData: mov edx,[eax+12] cmp edx,[ebp-4] je .203 - mov eax,4 + mov eax,txt_err_layers_neq jmp .193 .203: - xor edi,edi + xor edi,edi ;i=0 jmp .205 -.204: +.204: ;for(i=0;ilayers_length;i++) stdcall @@strstr$qpxct1, esi,txt_c_size add esp,8 mov esi,eax test esi,esi jne .206 - mov eax,5 + mov eax,txt_err_c_size jmp .193 .206: stdcall @@strchr$qpxci, esi,':' @@ -997,46 +1072,39 @@ NNP_SetMemData: .211: mov byte[esi],0 inc esi - push ebx - call @@StrToInt$qpc + stdcall @@StrToInt$qpc,ebx pop ecx mov dword[ebp-8],eax - lea eax,[edi+4*edi] + mov eax,edi + imul eax,sizeof.Layer mov edx,[ebp+8] - mov ecx,[edx+8] - mov edx,[ecx+4*eax] + add eax,[edx+NeuralNetwork.layers] + mov edx,[eax+Layer.c_size] cmp edx,[ebp-4] jne .213 - mov ecx,[ebp+8] - mov edx,[ecx+8] - mov eax,[edx+4*eax+4] - cmp eax,[ebp-8] + mov edx,[eax+Layer.n_size] + cmp edx,[ebp-8] je .214 .213: mov ecx,[ebp+8] - push ecx - call NNP_GetMaxLLen + stdcall NNP_GetMaxLLen,ecx mov ecx,edi + imul ecx,sizeof.Layer mov ebx,eax - shl ecx,2 mov eax,[ebp+8] - mov edx,[eax+8] - lea ecx,[ecx+4*ecx] + mov edx,[eax+NeuralNetwork.layers] add edx,ecx - push edx - call Layer_Destroy + stdcall Layer_Destroy,edx mov eax,[ebp-8] push eax mov edx,[ebp-4] push edx mov edx,edi - shl edx,2 + imul edx,sizeof.Layer mov ecx,[ebp+8] - mov eax,[ecx+8] - lea edx,[edx+4*edx] + mov eax,[ecx+NeuralNetwork.layers] add eax,edx - push eax - call Layer_Create + stdcall Layer_Create,eax cmp ebx,[ebp-4] ;if(n>s || k>s) jb .215 cmp ebx,[ebp-8] @@ -1081,7 +1149,7 @@ NNP_SetMemData: mov ebx,eax test ebx,ebx jne .217 - mov eax,12 + mov eax,txt_err_sqbrl_b1 jmp .193 .217: inc ebx @@ -1089,11 +1157,8 @@ NNP_SetMemData: mov dword[ebp-8],edx jmp .219 .218: - mov esi,[ebp+8] dec edx cmp eax,edx - lea ecx,[edi+4*edi] - mov esi,[esi+8] jae .220 stdcall @@strchr$qpxci, ebx,',' add esp,8 @@ -1110,22 +1175,23 @@ NNP_SetMemData: jmp .193 .222: mov byte[esi],0 - push ebx - call @@StrToDouble$qpc + stdcall @@StrToDouble$qpc,ebx pop ecx - lea edx,[edi+4*edi] + mov edx,edi + imul edx,sizeof.Layer mov ecx,[ebp+8] lea ebx,[esi+1] - mov eax,[ecx+8] + mov eax,[ecx+NeuralNetwork.layers] mov ecx,[ebp-8] - mov edx,[eax+4*edx+12] + mov edx,[eax+edx+Layer.biases] fstp qword[edx+8*ecx] inc dword[ebp-8] .219: - lea edx,[edi+4*edi] + mov edx,edi + imul edx,sizeof.Layer mov ecx,[ebp+8] - mov ecx,[ecx+8] - mov edx,[ecx+4*edx] + add edx,[ecx+NeuralNetwork.layers] + mov edx,[edx+Layer.c_size] mov eax,[ebp-8] cmp edx,eax ja .218 @@ -1142,83 +1208,94 @@ NNP_SetMemData: add esp,8 mov esi,eax test esi,esi - jne .225 - mov eax,15 + jne .225 + mov eax,txt_err_sqbrl_w1 jmp .193 .225: inc esi xor edx,edx - mov dword[ebp-8],edx + mov dword[ebp-8],edx ;k=0 jmp .227 -.226: +.226: ;for(k=0;klayers[i].c_size;k++) + + mov eax,edi + imul eax,sizeof.Layer + mov edx,[ebp+8] + add eax,[edx+NeuralNetwork.layers] + mov eax,[eax+Layer.n_size] + or eax,eax + jnz .end_null_we + inc dword[ebp-8] ;k++ + jmp .227 ;if 'weights' is null array +.end_null_we: + stdcall @@strchr$qpxci, esi,'[' add esp,8 mov ebx,eax test ebx,ebx - jne .228 - mov eax,16 + jne .228 + mov eax,txt_err_sqbrl_w2 jmp .193 .228: inc ebx xor edx,edx - mov dword[ebp-12],edx - jmp .230 -.229: - mov esi,[ebp+8] + mov dword[ebp-12],edx ;j=0 + jmp .230 +.229: ;for(j=0;jlayers[i].n_size;j++) dec edx - cmp eax,edx - lea ecx,[edi+4*edi] - mov esi,[esi+8] - jae .231 + cmp eax,edx ;eax = j, edx = n_size-1 + jae .231 stdcall @@strchr$qpxci, ebx,',' add esp,8 mov esi,eax - jmp .232 + jmp .232 .231: stdcall @@strchr$qpxci, ebx,']' add esp,8 mov esi,eax .232: test esi,esi - jne .233 - mov eax,17 - jmp .193 + jne .233 + mov eax,txt_err_sqbrr_w2 + jmp .193 .233: mov byte[esi],0 - push ebx - call @@StrToDouble$qpc + stdcall @@StrToDouble$qpc,ebx pop ecx - lea edx,[edi+4*edi] + mov edx,edi + imul edx,sizeof.Layer mov ecx,[ebp+8] lea ebx,[esi+1] - mov eax,[ecx+8] + mov eax,[ecx+NeuralNetwork.layers] mov ecx,[ebp-8] - mov edx,[eax+4*edx+16] + mov edx,[eax+edx+Layer.weights] mov eax,[edx+4*ecx] mov edx,[ebp-12] fstp qword[eax+8*edx] inc dword[ebp-12] .230: - lea edx,[edi+4*edi] + mov edx,edi + imul edx,sizeof.Layer mov ecx,[ebp+8] - mov ecx,[ecx+8] - mov edx,[ecx+4*edx+4] + add edx,[ecx+NeuralNetwork.layers] + mov edx,[edx+Layer.n_size] mov eax,[ebp-12] cmp edx,eax - ja .229 + ja .229 mov esi,ebx inc dword[ebp-8] .227: - lea eax,[edi+4*edi] + mov eax,edi + imul eax,sizeof.Layer mov edx,[ebp+8] - mov ecx,[edx+8] - mov eax,[ecx+4*eax] + add eax,[edx+NeuralNetwork.layers] + mov eax,[eax+Layer.c_size] cmp eax,[ebp-8] ja .226 inc edi .205: mov edx,[ebp+8] - cmp edi,[edx+12] + cmp edi,[edx+NeuralNetwork.layers_length] jb .204 xor eax,eax jmp .193 @@ -1306,6 +1383,7 @@ align 16 EXPORTS: dd sz_lib_init, lib_init dd sz_create, NNP_Create + dd sz_reset, NNP_Reset dd sz_feedforward, NNP_FeedForward dd sz_backpropagation, NNP_BackPropagation dd sz_getmemdata, NNP_GetMemData @@ -1314,6 +1392,7 @@ EXPORTS: dd 0,0 sz_lib_init db 'lib_init',0 sz_create db 'NNP_Create',0 + sz_reset db 'NNP_Reset',0 sz_feedforward db 'NNP_FeedForward',0 sz_backpropagation db 'NNP_BackPropagation',0 sz_getmemdata db 'NNP_GetMemData',0