From 46cca564f48fab8902b562d6ea4d7346b802bb8d Mon Sep 17 00:00:00 2001 From: mirimatcode Date: Fri, 21 Feb 2025 13:59:47 +0100 Subject: [PATCH] lavoro ancora alle nuove formule --- classificatore_singolo | Bin 21304 -> 21392 bytes classificatore_singolo.c | 23 ++++++++++++++++++++++- percettroni.h | 37 ++++++++++++++++++++++++++++++++++++- visualizzatore | Bin 22448 -> 22448 bytes 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/classificatore_singolo b/classificatore_singolo index 0719ddb268ebc821e169b759a505e1683a13f97f..3d44c6e0a095a33597167d287db3eb12d6b621ed 100755 GIT binary patch delta 4084 zcmZu!4^R}>8Q`H*kAMO$l=(OQFG&->8Hf` z{u6sl;CJ}E_KO04*!Nm|Enl4_O2HhdN0iRhQ)WvgzbI9;h|;cBQOa);rDYAWtJSRt zl1u4K<~dH3T`h9HA{Jc~8*he*e2biGlwFE+PV|PSN5L-nPf#G`>-(zecLnHk=jXV= zNqkTA#(YLKKxsm(C|7fGen0~=Kmq;~?f*DF=VzvK&5Ne$%ZfK@8#Q=`~q6w<~}FhGrql znBfYT_SsZbb#GL7_b!DqNf(}~YE4b^Kk`NCw&)I|vRvPPmg_IYYN@IX$yTKNYtpjT zrIM=!d9+zr9+fjas=C&656fus}n%1Ft8In<@fb9QP|P}YEbJ?e~84pSfGne0x86`Vcfm4qze_C4~e zgdE|6d!#+V;n<;h1V!%-BRmyRYWzD5J!7Qtuihg`iD}glaC)``Sx9yhe49k?=*OdI z))=36?lL}Y;M1n@sb@yN@*OO!pgSiB99IvPoU&5$9>D&j?%mw){YdK-gL!~VV}Sz@{0j zA3>*K4Umqc%ZrQ|JXb8rVaX{_(nXosz_tSAn=Vxa{$>cRrEj2|Mag6KKUGC{9Tl8u z&-pM!$sY5;@o^KG1tE{Vr98vc$r}3!PgtByi?fmJ@v*jiIu*&2OLbCh0Yq0OU~FX5 z__%8337j`6jyIfpLBmPGtL({wFROaHrq;LxI#KnWzH{J&tMeNJ$N4=${Z(%wj}f7M z&y$eT&*7x4=u7qU;s%BqN-pOqlG9L7|Frt!5Sc9u7uY ze4Rd;Mw!h_uI0$FWLq`0(SGxexJ=oF!o2Yox`2z>PzISn=x(o-o`g ztFD(r{AgM_AI+?1 zFc2NqYs`d~zJ;=y3>Ab9>ebug3tAm(*(Ud__V!LptY%9rAE(gSC$Ly(Tfg#O9JpP> z+^p!4G+O&%RS7cd3Dz&~4r7j5zbw21Z@Zf{1Ftnz2758>+e+J2X2jTXqXW0-p|rr2 z7qSo=3ZcVni+8h8_+Qr11~fT2&a^)gC|zMSU3?AQ`HICU+6J>NTv>gG6g%gdf)NAg z?7dAsaxNKtRM)X_rrxGJTnZ_Svy;nCGf7XGEqoY3)~7gy>m7uoWDDzWldmAIbP)Tb zRN-(3Su*Lo!3+HkVWum288(qHH*~qN>bMROTqGtSozd6Sq`%&2+rH z##fyB6Q1~Ij;yAid$IU&U#n^lMCuJyZH1iFrm8l~ay#Ta$mn)eT@ASblzsu30@}ZW zd;<9?PeD)FW#3hg(^U!XcfK2DD#fpjBZNFKttfsCG&$S0H8 zvl6Q_!E-(4!DWv!?-dq|j4+h&BZe6{e7|x%(C@((Zy#ij>9?Cfe;4LgKFD6$Z%>82 z87Evh~rX+e2AdvHW(&_GapLwUHJ6& zk*l-DM0|qB_CE3$kC*WH;Gu8K>_@}M(I2ehr}>7@pKcHwX(TgyK3_q0W{-^?#TDRS zp%?e@n+#{+;4L=HT|@q*W2WNww1Jo+xU-| z-znQVAvjhXvzjnv9tW_N|&XFi6FA|4%r7^d@(W3=Ep9V3=l7FhW-(*8qhcsBJR z$AoA;k8167Da^pC(Xm3q?j+f;z6mQGsbR=S2gw##Kh~`$hFDLLL$Lmfj)bhlv+m)z z3p(^Ia$$irCrD!j8`m^s+%T*Ijr!9R&HW(!=w*SP`oA~CKY`4A$;zjYB$u@?Q;*%^ zU?ChUGdwQQ^~Y_R9v?OA`jM_*uPaQtz7%>hXMc{{R?>*E+;lAdLvsHmtGz)-xS=Co z#XG&OP#=4zZq1pXX<60c@iAEe1eM`Lk#?6g$BDkBvrfmqA$k?)v(C`x}Nqs z^}n8^`Ll+>U&ZdN6o2Mh@TBWIG|vZgguD8GVAj$=IK*Plu={zkWucXirO)T|V9N+#hdZ&z)gu)Bl!-WS?(U?u&w8 Ziy$B5&56YRz^)+qcivn+NGvOz{{xmd>>~gG delta 3188 zcmZWr4RBP|6~6cFhGa7&Z#RUzY<|e*2a;}3@`oTpW0w5*5(8w=I7nqQhEdu^g$|hl zg+^SKar?S7c-X;G#({~}C|XF@b`Xe3z+vMs*u{cvM=c2jvLTTTi!y1oyqvES3qBI(#8dz_an8HBgx8IVHnw^YQ5X+@x(E}*%gQZc<( zzAMz^-N0`pnWk?0=EB4CkG!}2`QG0wyxMa5WcT@}+5#s{N0Ovvw!rf?E43Bo5E7N2 z7>LTN`=hcoDJQTyWd^0`0spK@NgBc&9tKAOBiEJ z|JRJb=V?6>bp(9&PbIoM@N|}+!e)ncQCkWjs`oS18w_uY>bmN!4Xf_$VbX3_eQ~Qe z7z|%Vq>p0s;UZ?E)rNrPrb+Ka;ct#AX?+yzx%Et*dAS@rVb358FL3` zIVA$Oa-k8`)6diKvO#!#0^Z7NsH+qN6O5oWqeymCbQLQC$%aokA)LF9f3pnnTf52>DdUJ$uE?aMIe%&B^5*-pk}lf-(5$8}xfp?S}sx<;sZIfP$CEa)+_ z7_g1DnFv`O^duPbXXOZ9Bbz53=RwcRm=!@QQA0b>9k*SAh)`_c3OqxugJEjxr>bw}MHZc^2{&Jsjg`x} zF}Aiz;}k{__?jkTOJiMWSVV%*C#XJF2Zqfm9n_}gzKU~#+E>CB^JOKg8lEKMzkBRXZ+jsZ#y3ok8s{BHKc6?+!d*os*E{#2e22Hc$x=73T2g!nlJhRV#S zyO)b!zHO{0&eGX`cWn3uVu&72BchGUPvY}wV`p)f)=HusvelQ4-1tZ`6J8dvL(zO9 z6r*52VJEbXpY>FdSnShoJ;m2crN$1YX#T`#T*ufIU=-het?Og)ZeEeJ!`;g&)7(Bs z<0Z?>c}XI-6y;nqisp7VFI6gP{y{#Ge|>}9I*rH7PXlj)Vz{#U3tP}N=D}9kl;!4& z&>g+(ddP)@%#nBRM3ymg=NRo|Pu)7T*gUrgy*I^$*Nnn5&PDR;mTBSa3`4i`k=c(M zI=+rG%;LZ&wI$OItBPkqMRA!_V}bR>h0^CEu&3B1tq;Qm6c3 zrx9DPVX)2PNW*imb~^U;RsN|6JapfH)O9e?^lC|a;9N-qr39>HsU7T_nu@=sf9m=W z%9k$b`XI_JL%N=T5e88fp==%2^+uE@F6;URl$-yh>w8f)UeWdUQD);Z7f@0RWfJ98 zlv#Le@`$c4MLCN3d=ljxd=a*x{1rY*2P86&+{TCPBr1mSYw!ii1K;R6dr=OfbfEn5 zwysyfKgtT}QK01tT@Uv1Li%HHmFLiX&{Cc+$wRQKJWr|~hIh*I=ofGfkxuvudl!^e zWF|UrJ1lg11(GW=ps^x>4nT874m}I)*n7ZVk<+ms<7-1B;!3velB$ztn4Y6E;}b|0 zswPl>4R2E$hBpnDVz?FcWw@U)gr{)n8iR=gRV9f37x5GLjhMn!x5@MeGq=Gt;>lxZ zv^NS{7iP@ZghO`}_Tz9b4*jO6mGp7g;>w0J za|&Gp11^O=1vaxnUx1q~CGKaqo&$QMS#$?%G%v7s;XFl>NtF`^)7snIrcPu8&5Hzw<**0Q zN&{`f_kcD0uff|&7(nz#h}uXx={8oxdf@G+oOzewdtMRRD+byPxwQ)IV>YGd4VyE$ z0^}uz!^^0*5<3aqvzHO(MgPNl8G34!(p 0; indice_layer--) { + //Applico la correzione a tutti i percettroni del layer dal primo a seguire + for(int indice_percettrone = 0; indice_percettrone <= rete_neurale.layers[indice_layer].size; indice_percettrone++) { + correggi_pesi_percettrone(); + } + } + + //gradienti[NUM_LAYERS-1][0] = (output_corretto - sigmoidi[NUM_LAYERS-1][0]); errore_totale += gradienti[NUM_LAYERS-1][0]; correggi_layer_interni(&rete_neurale, gradienti, sigmoidi); diff --git a/percettroni.h b/percettroni.h index 4012f68..ff653d4 100644 --- a/percettroni.h +++ b/percettroni.h @@ -44,6 +44,9 @@ double *funzioni_attivazione_layer_double(Layer, double*); void correggi_layer_interni(ReteNeurale*, double**, double**); void correggi_layer_input(Layer*, double**, double**, byte*, int); +double calcola_gradiente_layer(ReteNeurale, int, int, double**); +void discesa_gradiente(ReteNeurale, double**, double**); + int previsione(double); void salvaReteNeurale(const char*, ReteNeurale*); @@ -211,7 +214,6 @@ void correggi_layer_interni(ReteNeurale *rete, double **gradienti, double **sigm } } } - //Questa funzione prende tutti i parametri della precedente + gli input passati dal dataset per correggere il layer di ingresso void correggi_layer_input(Layer *layer, double **gradienti, double **sigmoidi, byte *inputs, int n_layers) { //L'indice del layer d'ingresso che prende byte per input @@ -227,6 +229,39 @@ void correggi_layer_input(Layer *layer, double **gradienti, double **sigmoidi, b } } + +void discesa_gradiente(ReteNeurale rete, double **sigmoidi, double **gradienti) { + //For che scorre i layer dal penultimo al primo QUINI SIZE -2 + for(int indice_layer = rete.size -2; indice_layer >= 0; indice_layer--) { + //printf("Mi trovo nel layer %d, ho %d percettroni\n", indice_layer, rete.layers[indice_layer].size); + + //For che scorre i percettroni del layer partendo dal primo + //Per ogni percettrone mi devo prendere il gradiente disceso dal livello sopra e moltiplicarlo per la derivata di attivazione + for(int indice_percettrone = 0; indice_percettrone < rete.layers[indice_layer].size; indice_percettrone++) { + + double derivata_attivazione = sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone]); + //Passo anche l'indice del percettrone perchè corrisponde all'indice del peso del livello sopra + double gradiente_disceso = calcola_gradiente_layer(rete, indice_layer + 1, indice_percettrone, gradienti); + + + gradienti[indice_layer][indice_percettrone] = gradiente_disceso * derivata_attivazione; + } + } +} + +double calcola_gradiente_disceso(ReteNeurale rete, int livello, int indice_peso, double **gradienti) { + //printf("Qui ci arrivo\n"); + double sommatoria = 0.0; + //printf("Layer %d: N_percettroni: %d\n", livello, rete.layers[livello].size); + //Calcolo la sommatoria dei gradienti dei percettroni per i pesi + for(int indice_percettrone = 0; indice_percettrone < rete.layers[livello].size; indice_percettrone++) { + sommatoria += (gradienti[livello][indice_peso] * rete.layers[livello].percettroni[indice_percettrone].pesi[indice_peso]); + } + + return sommatoria; +} + + //Una volta finito il ciclo delle epoche viene salvato lo stato della rete neurale void salvaReteNeurale(const char *filename, ReteNeurale *rete) { FILE *file = fopen(filename, "wb"); diff --git a/visualizzatore b/visualizzatore index cf86a31fbe13b88a2c5a5897ae12250913b06288..9395e1eb87302ef57172f4727ef35397054da250 100755 GIT binary patch delta 54 zcmdn6o^b;ZtzZ@rp7Z6ytv>PIqYV$1I_dt@OLW@Dzj+UHr!A|gfuWJb