From b1104d9fb4eae26568041f577aee8d0c08cdb656 Mon Sep 17 00:00:00 2001 From: mirimatcode Date: Fri, 14 Feb 2025 16:55:56 +0100 Subject: [PATCH] niente, non converge nemmeno con mnist --- classificatore_singolo | Bin 21184 -> 21352 bytes classificatore_singolo.c | 53 ++++++++++++++++++--------------------- mnist/mnist_manager | Bin 15952 -> 15952 bytes mnist/mnist_manager.h | 7 +++++- percettroni.h | 22 ++++++++++------ rete_neurale | Bin 20640 -> 0 bytes rete_pesi.bin | Bin 0 -> 891876 bytes visualizzatore | Bin 22320 -> 22448 bytes visualizzatore.c | 6 ++--- 9 files changed, 48 insertions(+), 40 deletions(-) delete mode 100755 rete_neurale create mode 100644 rete_pesi.bin diff --git a/classificatore_singolo b/classificatore_singolo index 820ba44c94e541dd444a5d0b63c07a501752e5e2..6c66ed33215cea39edf41846f98df2109055214d 100755 GIT binary patch delta 4724 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 RapMC0KiBYC9Hgx`{~rdSevJSC delta 4797 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 Ia(V850km>SCjbBd diff --git a/classificatore_singolo.c b/classificatore_singolo.c index 6308a5b..4c0361c 100644 --- a/classificatore_singolo.c +++ b/classificatore_singolo.c @@ -19,19 +19,21 @@ #define PERCETTRONI_LAYER_4 1 #define INPUT_LAYER_4 PERCETTRONI_LAYER_3 -#define MAX_EPOCHE 1000 +#define MAX_EPOCHE 10 //Scelgo quale categoria voglio identificare. La 7 sono i cavalli. La rete mi dirà per ogni immagine se è un cavallo o no #define CATEGORIA 7 + byte get_out_corretto(byte); void stampa_layer_indirizzo(Layer*); +void stampa_tempo(time_t[], int); void main() { time_t tempo_epoche[MAX_EPOCHE]; srand(time(NULL)); - Dataset *set_appoggio = get_dataset("mnist/t10k-images.idx3-ubyte", "mnist/t10k-labels.idx1-ubyte"); + Dataset *set_appoggio = get_dataset(file_immagini, file_label); if(set_appoggio == NULL) return; @@ -39,7 +41,7 @@ void main() { free(set_appoggio); ReteNeurale rete_neurale; - ReteNeurale *puntatore_rete = caricaReteNeurale("rete_cifar_pesi.bin"); + ReteNeurale *puntatore_rete = caricaReteNeurale(file_pesi); if(puntatore_rete == NULL) { rete_neurale = inizializza_rete_neurale(NUM_LAYERS); //inizializzo layer 0 @@ -51,7 +53,7 @@ void main() { //inizializzo layer 3 rete_neurale.layers[3] = inizializza_layer(PERCETTRONI_LAYER_3, INPUT_LAYER_3); //inizializzo layer ULTIMO - //rete_neurale.layers[4] = inizializza_layer(PERCETTRONI_LAYER_4, INPUT_LAYER_4); + rete_neurale.layers[4] = inizializza_layer(PERCETTRONI_LAYER_4, INPUT_LAYER_4); } else { rete_neurale = *puntatore_rete; free(puntatore_rete); @@ -62,26 +64,12 @@ void main() { //ADDESTRAMENTO for(int i = 0; i < MAX_EPOCHE; i++) { - time(&tempo_epoche[i]); - if(i == 0) - printf("Epoca %d\n", i); - else { - time(&tempo_epoche[i]); - double tempo_trascorso_epoca = difftime(tempo_epoche[i], tempo_epoche[i-1]); - double tempo_trascorso_totale = difftime(tempo_epoche[i], tempo_epoche[0]); - int minuti_epoca = (int)tempo_trascorso_epoca / 60; - int secondi_epoca = (int)tempo_trascorso_epoca % 60; - int minuti_totali = (int)tempo_trascorso_totale / 60; - int secondi_totali = (int)tempo_trascorso_totale % 60; - printf("Epoca %d\n", i); - printf("Tempo dall'epoca precedente: %d:%d\n", minuti_epoca, secondi_epoca); - printf("Tempo dall'inizio: %d:%d\n", minuti_totali, secondi_totali); - } - + printf("Epoca %d\n", i); + stampa_tempo(tempo_epoche, i); int corrette = 0; - for(int indice_set = 0; indice_set < set.size -1; indice_set++) { + for(int indice_set = 0; indice_set < set.size; indice_set++) { double **sigmoidi = (double **)malloc(sizeof(double*) * NUM_LAYERS); @@ -93,14 +81,10 @@ void main() { sigmoidi[j] = funzioni_attivazione_layer_double(rete_neurale.layers[j], sigmoidi[j-1]); } - //printf("\timmagine: %d post sigmoidi\n", indice_set); - byte output_corretto = get_out_corretto(set.istanze[indice_set].categoria); - //Se prevede male if(previsione(sigmoidi[NUM_LAYERS-1][0]) != output_corretto) { - double **gradienti = (double**)malloc(sizeof(double*) * NUM_LAYERS); for(int indice_layer = 0; indice_layer < NUM_LAYERS; indice_layer++) { @@ -116,14 +100,12 @@ void main() { { corrette++; } - - //printf("\timmagine: %d post correzioni\n", indice_set); } printf("\tRisposte corrette: %d\n", corrette); } - salvaReteNeurale("rete_cifar_pesi.bin", &rete_neurale); + salvaReteNeurale(file_pesi, &rete_neurale); } //Questa funzione ritorna 1 se la categoria è quella che voglio individuare, altrimenti 0 @@ -143,4 +125,19 @@ void stampa_layer_indirizzo(Layer *layer) { } printf("\n"); } +} + +void stampa_tempo(time_t tempo_epoche[], int i) { + + time(&tempo_epoche[i]); + if(i > 0) { + double tempo_trascorso_epoca = difftime(tempo_epoche[i], tempo_epoche[i-1]); + double tempo_trascorso_totale = difftime(tempo_epoche[i], tempo_epoche[0]); + int minuti_epoca = (int)tempo_trascorso_epoca / 60; + int secondi_epoca = (int)tempo_trascorso_epoca % 60; + int minuti_totali = (int)tempo_trascorso_totale / 60; + int secondi_totali = (int)tempo_trascorso_totale % 60; + printf("Tempo dall'epoca precedente: %d:%d\n", minuti_epoca, secondi_epoca); + printf("Tempo dall'inizio: %d:%d\n", minuti_totali, secondi_totali); + } } \ No newline at end of file diff --git a/mnist/mnist_manager b/mnist/mnist_manager index 6ca176f17fba6efff1766a86a8e96b691e3d29f8..269d8bc9c40622b02bf540244acb0dc4d8d33d42 100755 GIT binary patch delta 749 zcmX|9O=#0l9M5a**00$vjT@W8B{;jOTiZE7*D^-YU_{XEFc^Y|qOBI}2X$2(Egq_) zp%i8Bpa(_fMRrgIfgw0QhG6JrbRPVummVfoI#|^nqEq7kwY7oAFTelqBQGz>C-R9U zJu>QaRPEB~FpV6B4OFKa(n;h*?G?68n<$BzUc@kghYt$Z3g>UzN46K9ew@Eo$g9$d z*4c(;rA_NNLIFHTkD@^wpvO=Shv-iHf;M*Rq3k7jKz0alLnKt%Dpq;rJ-r0NCt<<2p3Lo?qrf@6miXBs&Oe$ zjnvt9h~eV>iHlvOU)pWn!>rHC7`yq6fITCl=VTorOGf_5X+pMaYk)?)E}UE-Br8zsV~&f7>Ey`)`8S`L1lLS2I}7YMTCcYasWrpB!xWg z%;J*7ysAV6)fBGDxeC#SjMB{320(wY0J|Nj~w zUGe$<|1*WYa#eH%fZbmS9gV{+zYV_w6^ z!_L7V0~D$O;!l%TD$0v40h($D2t!9&}2<(b50ILh(3 @@ -59,7 +64,7 @@ Dataset *get_dataset(char *path_mnist, char *path_categoria) int numero_righe = 0; //Leggo male il file, cambiare in base alle dichiarazioni sopra - if(fread(istanze[numero_righe].immagine, sizeof(byte), 16, file) == 16) + if(fread(istanze[numero_righe].immagine, sizeof(byte), 16, file) == 16 && fread(&istanze[numero_righe].categoria, sizeof(byte), 8, categorie) == 8) while (fread(istanze[numero_righe].immagine, sizeof(byte), N_PIXEL, file) == N_PIXEL) { if(fread(&istanze[numero_righe].categoria, sizeof(byte), 1, categorie) == 1) { diff --git a/percettroni.h b/percettroni.h index 0c5caf1..d7c3a14 100644 --- a/percettroni.h +++ b/percettroni.h @@ -2,11 +2,15 @@ #include #include +char *file_pesi = "rete_pesi.bin"; +char *file_immagini = "mnist/t10k-images.idx3-ubyte"; +char *file_label = "mnist/t10k-labels.idx1-ubyte"; + // Siccome il char è un byte che rappresenta il valore tra 0 e 255. Per evitare confusioni definisco il tipo "byte" come in Java typedef unsigned char byte; -double LRE = 0.1; +double LRE = 0.2; double soglia_sigmoide = 0.5; typedef struct { @@ -47,7 +51,7 @@ ReteNeurale *caricaReteNeurale(const char*); //Questa funzione genera un valore reale random compreso nell'intervallo [-1, 1] double randomico() { // Genero numeri nell'intervallo [-1,1] - return ((double)(rand() % 101 * 0.01 * 2 ) -1); + return (double)((rand() / RAND_MAX) * -1);//((double)(rand() % 101 * 0.01 * 2 ) -1); } //Questa funzione inizializza il percettrone allocando la memoria in base al numero dei pesi che voglio ed inizializza il loro valore usando randomico() @@ -130,6 +134,7 @@ double *funzioni_attivazione_layer_byte(Layer layer, byte *inputs) { for(int i = 0; i < layer.size; i++) { funzioni[i] = sigmoide_byte(layer.percettroni[i], inputs, layer.percettroni[i].size); + //printf("\tsigmoide layer input %f\n", funzioni[i]); } return funzioni; @@ -142,6 +147,7 @@ double *funzioni_attivazione_layer_double(Layer layer, double *inputs) { for(int i = 0; i < layer.size; i++) { funzioni[i] = sigmoide_double(layer.percettroni[i], inputs, layer.percettroni[i].size); + //printf("\tsigmoide layer %d: %f\n", i, funzioni[i]); } return funzioni; @@ -162,9 +168,9 @@ void correggi_layer_interni(ReteNeurale *rete, double **gradienti, double **sigm for(int indice_percettrone = 0; indice_percettrone < rete->layers[indice_layer].size; indice_percettrone++) {//Numero percettroni for(int indice_peso = 0; indice_peso < rete->layers[indice_layer].percettroni[indice_percettrone].size; indice_peso++) {//Numero pesi - gradienti[indice_layer][indice_percettrone] = gradienti[rete->size-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); - rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); - //rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[rete->size-1][0] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); + //gradienti[indice_layer][indice_percettrone] = gradienti[rete->size-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); + //rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); + rete->layers[indice_layer].percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[rete->size-1][0] * LRE * sigmoidi[indice_layer-1][indice_percettrone]); } rete->layers[indice_layer].percettroni[indice_percettrone].bias += (gradienti[indice_layer][indice_percettrone] * LRE); //printf("bias: %f\n", rete->layers[indice_layer].percettroni[indice_percettrone].bias); @@ -179,9 +185,9 @@ void correggi_layer_input(Layer *layer, double **gradienti, double **sigmoidi, b for(int indice_percettrone = 0; indice_percettrone < layer->size; indice_percettrone++) {//Numero percettroni for(int indice_peso = 0; indice_peso < layer->percettroni->size; indice_peso++) { //Numero pesi - gradienti[indice_layer][indice_percettrone] = gradienti[n_layers-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); - layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * inputs[indice_peso]); - //layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[n_layers-1][0] * LRE * inputs[indice_peso]); + //gradienti[indice_layer][indice_percettrone] = gradienti[n_layers-1][0] * (sigmoidi[indice_layer][indice_percettrone] * (1 - sigmoidi[indice_layer][indice_percettrone])); + //layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[indice_layer][indice_percettrone] * LRE * inputs[indice_peso]); + layer->percettroni[indice_percettrone].pesi[indice_peso] += (gradienti[n_layers-1][0] * LRE * inputs[indice_peso]); } layer->percettroni[indice_percettrone].bias += (gradienti[n_layers-1][0] * LRE); } diff --git a/rete_neurale b/rete_neurale deleted file mode 100755 index fb620de0be2098f1b465087c393611abc1d49be3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20640 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 G75@WigE;m8 diff --git a/rete_pesi.bin b/rete_pesi.bin new file mode 100644 index 0000000000000000000000000000000000000000..16f244c464a6b756682befc70f2ab937294f9e0c GIT binary patch literal 891876 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 literal 0 HcmV?d00001 diff --git a/visualizzatore b/visualizzatore index 5e493b0ce4decf1a9210342d9cc21e266046bc93..cf86a31fbe13b88a2c5a5897ae12250913b06288 100755 GIT binary patch delta 4664 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 l$J(H1ab8eKfuh(B&5N^x)$^56m{{suOS_1$8 delta 4837 zcma)A4OCQR8ou`qlR(G}zca(%3?eY7@n@u|38=GP)K&8*X*W|sQ8N_`&T7eGi{*}2 z5__$q{kZ7aTKI9Le7wo{%O6ip89Pea}2cGB))GRDLA%-ahwwM+Cv=IS(0wDuTeS0nui)k zbDUUX+(*9;cLr`$Cpqg#3Lh!l8cogNsr)hWhG&lzi;szmPJHF9af*#?j>g*o?#9Mj z_O!!`56@3)b{{M;T|3la8g#hBWHx3ba9oG!(Z&u_p$GH+sp|Z(Msh{ic_+<}aPkZ3 z#fW%*0_}>J!f&MRh)Mi7Du}G?_d>U#h|+A@7L`Qa$iC& z$o{vYP-095wb?Rw3&q6DHkaH{lv4J>#**vn|LtVA zzmuB((#%e=_=MPa-hes$GfS@ji%*TkR2g+Q7zmQr79HWIPYsTvW3lm67#nV6xl*~J z{J6|!mYIe3Q*`W-05^;MSgf6P#10TX7)pm@M+vv@P+(mAusPw#ulqaE-6RLxK)twK zvRGXya}_q!u}dX3$-$k9(tuoW^6m~+Q?6sQH7;6s{|1%EvS?<302N(YM63E7`mw(qs?0M zbgU2crNgXIyhw*vOUG7~*d*_0?@33d7N7@-oOW08JJ7MPU3Von>5@;iD<(aYH<839 z*BOo)9Tr-c7((wjf&xRC&FU^QbviPI@7gIPF-1tfMw1gWgvxfRN*pZIw$rXed)BoO zpP!qq`mA+netxSGo8(vFhgL>;SE)O3n2_2|IRi4{Z$hHl)yX5~7KwY%)w!w`!!DNN zzh9;223V_Vj7L-*U!o{mbZv{VdqubL+~ zq1&odohG%Vm(*FEBZ^6_W+f%DNTjG$_mMRzuIgjtRxZ*|(;z1WZ~66>duBJb9~>Qz z#cK#=Qtgm8?KK`8!f|Un<)6W~0A>X|A6#bojCVj`(>F1d9pKhBf?R>&Cx(CkxEu8- zjwR9kWdjs)@+c7GswT$%5?&1shCGE)zPbrMVNCl9u@eqBm=_pu@~t*SIlyoY3@0B3 zH9(ds1QN6;kwwp*I%l`1+}sP|l^^8>S^wlj`{OdA-qrZeR- zr6rFJvM}3{(K?t)lZObew$aw)T;X&Z{VO>p_4z^2hCEkv<-2b&ZR;;7%0Bqd9bhjl zN1NNok>VJ>1BW*B41)+7OW>1AzWY$VyUTqXIXxPrx-Kt=xLEzUS(I`XXzYQ5Xhlkj zuu!JDlxV95$m$mUc~ALD$v7Aj^hC)Ro<>Jg9xqmKs5Ugitn7dqy@ySQEvLKk3@lFo z|J`#9&IZXW^XP+;FXoQA0J90GR+= zF!G@5f@%E}1^!6J2q(OVqV3KIp*590at;tiw9^mHSGFn&YlcmLQvr+5D@r*a0d4}E`XgE)<7nkjyYS0-IxsXQh%t)@ z>_gfQh6-vOYOkt7u>XY9KE;M_1*Vxbgj47;Ep2Fv-5pMjk|17CywH!SleKlu%+yaTu^pvPj_ zcl4HbRT~Vit137LRp#^)-sq$kat0XdP!|#Pdvb2{qn!^G3iAe$F!~(Uzjd@7ANG9i z9J+s2BxRBXJ%YX78s7lW;DSt4P+cN2qMggW#T;oJW<%?9FCv~2_7r|xp+&GI(()Hhy zr0G}71;Z`0XPhN#C!-3X+*CcT2#tw*PnW7j%VUqaMt~nNo&0eMb6Mig={#ON(vvDD z))n{xv`2{G`%#(8f=dM61?&ry#lJu|@w(1EO2>bW?|Jqd*MM5SjDL)NB~_~ow7IIb zrMgrRu379+cOf9VGO>KgeO9y@{9%HXv+8(N2(JxHn{6ATLTY%QEWgF5MepmfTpwBX z0l}o2``G#tc;@-}ftnR{gJJlMj<@L6z?3mW}i1wt6c2Ht@_hZy(=qDIIU&!)cpn zv01>(vLx6wWvrF4Cyi10QR;gl9TzkBbh4c(#J4`ov4BhTZI4@Ud>| zX%F{7SOvZ}ax3Z&%~;FR z8l#!!KH>=KSzIf*AIasdbm)=XpyBx%Ybk}z8Wy~>K%2D((6m_(2(L`0b+c0b0}*?) Ang9R* diff --git a/visualizzatore.c b/visualizzatore.c index e9e1ce2..c35890d 100644 --- a/visualizzatore.c +++ b/visualizzatore.c @@ -33,13 +33,13 @@ void main() init_allegro(); //get_dataset("cifar-10-batches/test_batch.bin"); - set = get_dataset("mnist/t10k-images.idx3-ubyte", "mnist/t10k-labels.idx1-ubyte"); + set = get_dataset(file_immagini, file_label); if (set == NULL) { printf("Errore nel caricare il dataset\n"); return; } - rete_neurale = caricaReteNeurale("rete_cifar_pesi.bin"); + rete_neurale = caricaReteNeurale(file_pesi); if (rete_neurale == NULL) { printf("Errore nel caricare il modello\n"); return; @@ -94,7 +94,7 @@ void init_allegro() { void carica_immagine(int indice_set) { // Stampa informazioni sull'immagine - printf("Immagine indice: %d, categoria: %d\n", indice_set, set->istanze[indice_set].categoria); + printf("Immagine indice: %d, valore: %d. è un 7? %d\n", indice_set, set->istanze[indice_set].categoria, prevedi(indice_set)); // Itera su ogni pixel dell'immagine for (int y = 0; y < IMAGE_HEIGHT; y++)