aggiornato classificatore singolo per mnist

This commit is contained in:
2025-02-14 15:09:58 +01:00
parent 55b0e97546
commit 2488b37d35
5 changed files with 28 additions and 18 deletions

Binary file not shown.

View File

@@ -77,9 +77,7 @@ void main() {
int corrette = 0; int corrette = 0;
for(int indice_set = 0; indice_set < set.size; indice_set++) { for(int indice_set = 0; indice_set < set.size -1; indice_set++) {
printf("\timmagine: %d\n", indice_set);
double **sigmoidi = (double **)malloc(sizeof(double*) * NUM_LAYERS); double **sigmoidi = (double **)malloc(sizeof(double*) * NUM_LAYERS);
@@ -91,6 +89,8 @@ void main() {
sigmoidi[j] = funzioni_attivazione_layer_double(rete_neurale.layers[j], sigmoidi[j-1]); 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); byte output_corretto = get_out_corretto(set.istanze[indice_set].categoria);
@@ -103,7 +103,7 @@ void main() {
gradienti[indice_layer] = (double*)malloc(sizeof(double) * rete_neurale.layers[indice_layer].size); gradienti[indice_layer] = (double*)malloc(sizeof(double) * rete_neurale.layers[indice_layer].size);
} }
gradienti[NUM_LAYERS-1][0] = output_corretto - sigmoidi[NUM_LAYERS-1][0]; gradienti[NUM_LAYERS-1][0] = - (output_corretto - sigmoidi[NUM_LAYERS-1][0]);
correggi_layer_interni(&rete_neurale, gradienti, sigmoidi); correggi_layer_interni(&rete_neurale, gradienti, sigmoidi);
correggi_layer_input(&rete_neurale.layers[0], gradienti, sigmoidi, set.istanze[indice_set].immagine, NUM_LAYERS); correggi_layer_input(&rete_neurale.layers[0], gradienti, sigmoidi, set.istanze[indice_set].immagine, NUM_LAYERS);
@@ -113,7 +113,7 @@ void main() {
corrette++; corrette++;
} }
printf("\timmagine: %d post calcoli, indovinate: %d\n", indice_set, corrette); //printf("\timmagine: %d post correzioni\n", indice_set);
} }
printf("\tRisposte corrette: %d\n", corrette); printf("\tRisposte corrette: %d\n", corrette);

Binary file not shown.

View File

@@ -1,3 +1,16 @@
/*
Il file MNIST in formato IDX ha questa struttura:
Byte 0-3: Numero magico (4 byte).
Byte 4-7: Numero di immagini (4 byte).
Byte 8-11: Numero di righe per immagine (4 byte).
Byte 12-15: Numero di colonne per immagine (4 byte).
Byte 16 in poi: Dati delle immagini (ogni immagine è composta da 28x28 = 784 byte).
Le immagini sono 28x28 pixel.
I dati sono byte non firmati (valori da 0 a 255).
Il file contiene 60.000 immagini (per il training set),
*/
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@@ -29,7 +42,6 @@ Dataset *get_dataset(char *path_mnist, char *path_categoria)
Dataset *set = (Dataset *)malloc(sizeof(Dataset)); Dataset *set = (Dataset *)malloc(sizeof(Dataset));
FILE *file; FILE *file;
FILE *categorie; FILE *categorie;
Istanza istanza;
Istanza *istanze = (Istanza *)malloc(sizeof(Istanza)); Istanza *istanze = (Istanza *)malloc(sizeof(Istanza));
file = fopen(path_mnist, "rb"); file = fopen(path_mnist, "rb");
@@ -46,9 +58,8 @@ Dataset *get_dataset(char *path_mnist, char *path_categoria)
int numero_righe = 0; int numero_righe = 0;
//printf("Scorro il while %d\n", fread(istanze[numero_righe].categoria, sizeof(byte), 2, categorie)); //Leggo male il file, cambiare in base alle dichiarazioni sopra
if(fread(istanze[numero_righe].immagine, sizeof(byte), 16, file) == 16)
// Fino a quando questo fread restituisce 1 significa che il file contiene ancora roba
while (fread(istanze[numero_righe].immagine, sizeof(byte), N_PIXEL, file) == N_PIXEL) while (fread(istanze[numero_righe].immagine, sizeof(byte), N_PIXEL, file) == N_PIXEL)
{ {
if(fread(&istanze[numero_righe].categoria, sizeof(byte), 1, categorie) == 1) { if(fread(&istanze[numero_righe].categoria, sizeof(byte), 1, categorie) == 1) {

View File

@@ -107,7 +107,6 @@ double sigmoide_byte(Percettrone p, byte *valori, int n_input) {
//Questa funzione viene usata per gli altri livelli dove gli input sono double, ossia i valori della sigmoide dei livelli precedenti //Questa funzione viene usata per gli altri livelli dove gli input sono double, ossia i valori della sigmoide dei livelli precedenti
double sigmoide_double(Percettrone p, double *valori, int n_input) { double sigmoide_double(Percettrone p, double *valori, int n_input) {
double sommatoria = 0.0; double sommatoria = 0.0;
for(int i = 0; i < n_input; i++) { for(int i = 0; i < n_input; i++) {
sommatoria += (valori[i] * p.pesi[i]); sommatoria += (valori[i] * p.pesi[i]);