aumentata dimensione rete neurale, verificata immagine mnist con visualizzatore, messe 1000 epoche

This commit is contained in:
2025-02-14 15:34:18 +01:00
parent 2488b37d35
commit e49dcb42b7
9 changed files with 57 additions and 23 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -2,20 +2,24 @@
#include "percettroni.h"
#include "mnist/mnist_manager.h"
#define NUM_LAYERS 4
#define NUM_LAYERS 5
#define PERCETTRONI_LAYER_0 32
#define PERCETTRONI_LAYER_0 128
#define INPUT_LAYER_0 N_PIXEL
#define PERCETTRONI_LAYER_1 16
#define INPUT_LAYER_1 32
#define PERCETTRONI_LAYER_2 8
#define INPUT_LAYER_2 16
#define PERCETTRONI_LAYER_3 1
#define INPUT_LAYER_3 8
//#define PERCETTRONI_LAYER_4 1
//#define INPUT_LAYER_4 10
#define MAX_EPOCHE 50
#define PERCETTRONI_LAYER_1 64
#define INPUT_LAYER_1 PERCETTRONI_LAYER_0
#define PERCETTRONI_LAYER_2 32
#define INPUT_LAYER_2 PERCETTRONI_LAYER_1
#define PERCETTRONI_LAYER_3 16
#define INPUT_LAYER_3 PERCETTRONI_LAYER_2
#define PERCETTRONI_LAYER_4 1
#define INPUT_LAYER_4 PERCETTRONI_LAYER_3
#define MAX_EPOCHE 1000
//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
@@ -103,7 +107,7 @@ void main() {
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_input(&rete_neurale.layers[0], gradienti, sigmoidi, set.istanze[indice_set].immagine, NUM_LAYERS);

View File

@@ -6,7 +6,7 @@
typedef unsigned char byte;
double LRE = 0.2;
double LRE = 0.1;
double soglia_sigmoide = 0.5;
typedef struct {
@@ -162,9 +162,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 +179,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);
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,9 +1,14 @@
#include <allegro.h>
#include <time.h>
#include "percettroni.h"
#include "mnist/mnist_manager.h"
#define IMAGE_WIDTH 32
#define IMAGE_HEIGHT 32
//CIFAR_10
/* #define IMAGE_WIDTH 32
#define IMAGE_HEIGHT 32 */
//MNIST
#define IMAGE_WIDTH 28
#define IMAGE_HEIGHT 28
#define SCALE_FACTOR 2
//Cavalli
@@ -27,7 +32,8 @@ void main()
{
init_allegro();
set = get_dataset("cifar-10-batches/test_batch.bin");
//get_dataset("cifar-10-batches/test_batch.bin");
set = get_dataset("mnist/t10k-images.idx3-ubyte", "mnist/t10k-labels.idx1-ubyte");
if (set == NULL) {
printf("Errore nel caricare il dataset\n");
return;
@@ -67,7 +73,8 @@ void init_allegro() {
show_mouse(screen);
}
void carica_immagine(int indice_set)
//cifar_10
/* void carica_immagine(int indice_set)
{
printf("Immagine indice: %d, categoria: %d, previsione: %d\n", indice_set, set->istanze[indice_set].categoria, prevedi(indice_set));
@@ -81,6 +88,29 @@ void carica_immagine(int indice_set)
putpixel(image, x, y, makecol(r, g, b));
}
}
} */
//MNIST
void carica_immagine(int indice_set)
{
// Stampa informazioni sull'immagine
printf("Immagine indice: %d, categoria: %d\n", indice_set, set->istanze[indice_set].categoria);
// Itera su ogni pixel dell'immagine
for (int y = 0; y < IMAGE_HEIGHT; y++)
{
for (int x = 0; x < IMAGE_WIDTH; x++)
{
// Ottieni il valore del pixel (scala di grigi, quindi un solo canale)
int gray_value = set->istanze[indice_set].immagine[y * IMAGE_WIDTH + x];
// Converti il valore in scala di grigi in un colore RGB (r = g = b = gray_value)
int color = makecol(gray_value, gray_value, gray_value);
// Disegna il pixel sull'immagine
putpixel(image, x, y, color);
}
}
}
void disegna_interfaccia()