diff --git a/src/mnist/main.c b/src/mnist/main.c index b6ab748..beb2642 100644 --- a/src/mnist/main.c +++ b/src/mnist/main.c @@ -248,6 +248,16 @@ void train(int epochs, int layers, int neurons, char* recovery, char* image_file for (int j=0; j < nb_threads; j++) { free(train_parameters[j]); } + + for (int i=0; i < nb_images_total; i++) { + for (int j=0; j < height; j++) { + free(images[i][j]); + } + free(images[i]); + } + free(images); + free(labels); + free(shuffle_indices); free(train_parameters); // On libère les espaces mémoire utilisés spécialement sur le CPU diff --git a/src/mnist/neural_network.c b/src/mnist/neural_network.c index 6e40ccd..b5b070e 100644 --- a/src/mnist/neural_network.c +++ b/src/mnist/neural_network.c @@ -84,14 +84,15 @@ void deletion_of_network(Network* network) { for (int i=0; i < network->nb_layers; i++) { layer = network->layers[i]; - if (i != network->nb_layers-1) { // On exclut la dernière couche dont les neurones ne contiennent pas de poids sortants - for (int j=0; j < network->layers[i]->nb_neurons; j++) { - neuron = layer->neurons[j]; + + for (int j=0; j < network->layers[i]->nb_neurons; j++) { + neuron = layer->neurons[j]; + if (i != network->nb_layers-1) { // On exclut la dernière couche dont les neurones ne contiennent pas de poids sortants free(neuron->weights); free(neuron->back_weights); free(neuron->last_back_weights); - free(neuron); } + free(neuron); } free(layer->neurons); free(network->layers[i]); diff --git a/src/mnist/neuron_io.c b/src/mnist/neuron_io.c index e49758a..1d90031 100644 --- a/src/mnist/neuron_io.c +++ b/src/mnist/neuron_io.c @@ -24,15 +24,17 @@ Neuron* read_neuron(uint32_t nb_weights, FILE *ptr) { neuron->last_back_bias = 0.0; neuron->back_bias = 0.0; - neuron->last_back_weights = (float*)malloc(sizeof(float)*nb_weights); - neuron->back_weights = (float*)malloc(sizeof(float)*nb_weights); - neuron->weights = (float*)malloc(sizeof(float)*nb_weights); + if (nb_weights != 0) { + neuron->last_back_weights = (float*)malloc(sizeof(float)*nb_weights); + neuron->back_weights = (float*)malloc(sizeof(float)*nb_weights); + neuron->weights = (float*)malloc(sizeof(float)*nb_weights); - for (int i=0; i < (int)nb_weights; i++) { - fread(&tmp, sizeof(float), 1, ptr); - neuron->weights[i] = tmp; - neuron->back_weights[i] = 0.0; - neuron->last_back_weights[i] = 0.0; + for (int i=0; i < (int)nb_weights; i++) { + fread(&tmp, sizeof(float), 1, ptr); + neuron->weights[i] = tmp; + neuron->back_weights[i] = 0.0; + neuron->last_back_weights[i] = 0.0; + } } return neuron; diff --git a/src/mnist/utils.c b/src/mnist/utils.c index f9ea07d..2477679 100644 --- a/src/mnist/utils.c +++ b/src/mnist/utils.c @@ -101,13 +101,15 @@ void create_network(char* filename, int sortie) { neuron->back_bias = 0.; neuron->last_back_bias = 0.; - neuron->weights = (float*)malloc(sizeof(float)*neurons_per_layer[i+1]); - neuron->back_weights = (float*)malloc(sizeof(float)*neurons_per_layer[i+1]); - neuron->last_back_weights = (float*)malloc(sizeof(float)*neurons_per_layer[i+1]); - for (int k=0; k < neurons_per_layer[i+1]; k++) { - neuron->weights[k] = 0.; - neuron->back_weights[k] = 0.; - neuron->last_back_weights[k] = 0.; + if (i != network->nb_layers-1) { + neuron->weights = (float*)malloc(sizeof(float)*neurons_per_layer[i+1]); + neuron->back_weights = (float*)malloc(sizeof(float)*neurons_per_layer[i+1]); + neuron->last_back_weights = (float*)malloc(sizeof(float)*neurons_per_layer[i+1]); + for (int k=0; k < neurons_per_layer[i+1]; k++) { + neuron->weights[k] = 0.; + neuron->back_weights[k] = 0.; + neuron->last_back_weights[k] = 0.; + } } layer->neurons[j] = neuron; } diff --git a/test/mnist_neuron_io.c b/test/mnist_neuron_io.c index fee7dfe..6763e30 100644 --- a/test/mnist_neuron_io.c +++ b/test/mnist_neuron_io.c @@ -11,19 +11,21 @@ Neuron* creer_neuron(int nb_sortants) { Neuron* neuron = (Neuron*)malloc(sizeof(Neuron)); - neuron->weights = (float*)malloc(sizeof(float)*nb_sortants); - neuron->back_weights = (float*)malloc(sizeof(float)*nb_sortants); - neuron->last_back_weights = (float*)malloc(sizeof(float)*nb_sortants); + if (nb_sortants != 0) { + neuron->weights = (float*)malloc(sizeof(float)*nb_sortants); + neuron->back_weights = (float*)malloc(sizeof(float)*nb_sortants); + neuron->last_back_weights = (float*)malloc(sizeof(float)*nb_sortants); - for (int i=0; i < nb_sortants; i++) { - neuron->weights[i] = 0.5; - neuron->back_weights[i] = 0.0; - neuron->last_back_weights[i] = 0.0; + for (int i=0; i < nb_sortants; i++) { + neuron->weights[i] = 0.5; + neuron->back_weights[i] = 0.0; + neuron->last_back_weights[i] = 0.0; + } + neuron->z = 0.0; + neuron->bias = 0.0; + neuron->back_bias = 0.0; + neuron->last_back_bias = 0.0; } - neuron->z = 0.0; - neuron->bias = 0.0; - neuron->back_bias = 0.0; - neuron->last_back_bias = 0.0; return neuron; }