mirror of
https://github.com/augustin64/projet-tipe
synced 2025-01-24 07:36:24 +01:00
Update main.c
This commit is contained in:
parent
bea5eafab7
commit
c39e9bab4f
@ -12,6 +12,10 @@
|
|||||||
#define EPOCHS 10
|
#define EPOCHS 10
|
||||||
#define BATCHES 100
|
#define BATCHES 100
|
||||||
|
|
||||||
|
#ifdef __CUDACC__
|
||||||
|
# include "cuda_utils.cu"
|
||||||
|
# define MAX_CUDA_THREADS 1024 // from NVIDIA documentation
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct TrainParameters {
|
typedef struct TrainParameters {
|
||||||
Network* network;
|
Network* network;
|
||||||
@ -119,6 +123,8 @@ void* train_images(void* parameters) {
|
|||||||
}
|
}
|
||||||
free(sortie);
|
free(sortie);
|
||||||
param->accuracy = accuracy;
|
param->accuracy = accuracy;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -129,13 +135,18 @@ void train(int epochs, int layers, int neurons, char* recovery, char* image_file
|
|||||||
|
|
||||||
//int* repartition = malloc(sizeof(int)*layers);
|
//int* repartition = malloc(sizeof(int)*layers);
|
||||||
int nb_neurons_last_layer = 10;
|
int nb_neurons_last_layer = 10;
|
||||||
int repartition[2] = {784, nb_neurons_last_layer};
|
int repartition[2] = {neurons, nb_neurons_last_layer};
|
||||||
|
|
||||||
float accuracy;
|
float accuracy;
|
||||||
|
|
||||||
|
#ifdef __CUDACC__
|
||||||
|
printf("Utilisation du GPU\n");
|
||||||
|
int nb_threads = MAX_CUDA_THREADS;
|
||||||
|
#else
|
||||||
|
printf("Pas d'utilisation du GPU\n");
|
||||||
int nb_threads = get_nprocs();
|
int nb_threads = get_nprocs();
|
||||||
pthread_t *tid = (pthread_t *)malloc(nb_threads * sizeof(pthread_t));
|
pthread_t *tid = (pthread_t *)malloc(nb_threads * sizeof(pthread_t));
|
||||||
//generer_repartition(layers, repartition);
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On repart d'un réseau déjà créée stocké dans un fichier
|
* On repart d'un réseau déjà créée stocké dans un fichier
|
||||||
@ -174,6 +185,11 @@ void train(int epochs, int layers, int neurons, char* recovery, char* image_file
|
|||||||
int*** images = read_mnist_images(image_file);
|
int*** images = read_mnist_images(image_file);
|
||||||
unsigned int* labels = read_mnist_labels(label_file);
|
unsigned int* labels = read_mnist_labels(label_file);
|
||||||
|
|
||||||
|
#ifdef __CUDACC__
|
||||||
|
int*** images_cuda = copy_images_cuda(images, nb_images_total, width, height);
|
||||||
|
unsigned int* labels_cuda = copy_labels_cuda(labels);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (nb_images_to_process != -1) {
|
if (nb_images_to_process != -1) {
|
||||||
nb_images_total = nb_images_to_process;
|
nb_images_total = nb_images_to_process;
|
||||||
}
|
}
|
||||||
@ -199,10 +215,20 @@ void train(int epochs, int layers, int neurons, char* recovery, char* image_file
|
|||||||
}
|
}
|
||||||
nb_remaining_images -= train_parameters[j]->nb_images;
|
nb_remaining_images -= train_parameters[j]->nb_images;
|
||||||
|
|
||||||
|
#ifdef __CUDACC__
|
||||||
|
// Création des threads sur le GPU
|
||||||
|
#else
|
||||||
|
// Création des threads sur le CPU
|
||||||
pthread_create( &tid[j], NULL, train_images, (void*) train_parameters[j]);
|
pthread_create( &tid[j], NULL, train_images, (void*) train_parameters[j]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
for(int j=0; j < nb_threads; j++ ) {
|
for(int j=0; j < nb_threads; j++ ) {
|
||||||
|
#ifdef __CUDACC__
|
||||||
|
// On join les threads créés sur le GPU
|
||||||
|
#else
|
||||||
|
// On join les threads créés sur le CPU
|
||||||
pthread_join( tid[j], NULL );
|
pthread_join( tid[j], NULL );
|
||||||
|
#endif
|
||||||
accuracy += train_parameters[j]->accuracy / (float) nb_images_total;
|
accuracy += train_parameters[j]->accuracy / (float) nb_images_total;
|
||||||
if (delta != NULL)
|
if (delta != NULL)
|
||||||
patch_delta(delta_network, train_parameters[j]->network, train_parameters[j]->nb_images);
|
patch_delta(delta_network, train_parameters[j]->network, train_parameters[j]->nb_images);
|
||||||
@ -223,12 +249,17 @@ void train(int epochs, int layers, int neurons, char* recovery, char* image_file
|
|||||||
}
|
}
|
||||||
deletion_of_network(network);
|
deletion_of_network(network);
|
||||||
free(train_parameters);
|
free(train_parameters);
|
||||||
|
#ifdef __CUDACC__
|
||||||
|
// On libère les espaces mémoires utilisés sur le GPU
|
||||||
|
#else
|
||||||
|
// On libère les espaces mémoire utilisés spécialement sur le CPU
|
||||||
free(tid);
|
free(tid);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
float** recognize(char* modele, char* entree) {
|
float** recognize(char* modele, char* entree) {
|
||||||
Network* network = read_network(modele);
|
Network* network = read_network(modele);
|
||||||
Layer* derniere_layer = network->layers[network->nb_layers-1];
|
Layer* last_layer = network->layers[network->nb_layers-1];
|
||||||
|
|
||||||
int* parameters = read_mnist_images_parameters(entree);
|
int* parameters = read_mnist_images_parameters(entree);
|
||||||
int nb_images = parameters[0];
|
int nb_images = parameters[0];
|
||||||
@ -239,13 +270,13 @@ float** recognize(char* modele, char* entree) {
|
|||||||
float** results = (float**)malloc(sizeof(float*)*nb_images);
|
float** results = (float**)malloc(sizeof(float*)*nb_images);
|
||||||
|
|
||||||
for (int i=0; i < nb_images; i++) {
|
for (int i=0; i < nb_images; i++) {
|
||||||
results[i] = (float*)malloc(sizeof(float)*derniere_layer->nb_neurons);
|
results[i] = (float*)malloc(sizeof(float)*last_layer->nb_neurons);
|
||||||
|
|
||||||
write_image_in_network(images[i], network, height, width);
|
write_image_in_network(images[i], network, height, width);
|
||||||
forward_propagation(network);
|
forward_propagation(network);
|
||||||
|
|
||||||
for (int j=0; j < derniere_layer->nb_neurons; j++) {
|
for (int j=0; j < last_layer->nb_neurons; j++) {
|
||||||
results[i][j] = derniere_layer->neurons[j]->z;
|
results[i][j] = last_layer->neurons[j]->z;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
deletion_of_network(network);
|
deletion_of_network(network);
|
||||||
@ -262,7 +293,7 @@ void print_recognize(char* modele, char* entree, char* sortie) {
|
|||||||
int* parameters = read_mnist_images_parameters(entree);
|
int* parameters = read_mnist_images_parameters(entree);
|
||||||
int nb_images = parameters[0];
|
int nb_images = parameters[0];
|
||||||
|
|
||||||
float** resultats = recognize(modele, entree);
|
float** results = recognize(modele, entree);
|
||||||
|
|
||||||
if (! strcmp(sortie, "json")) {
|
if (! strcmp(sortie, "json")) {
|
||||||
printf("{\n");
|
printf("{\n");
|
||||||
@ -275,15 +306,15 @@ void print_recognize(char* modele, char* entree, char* sortie) {
|
|||||||
|
|
||||||
for (int j=0; j < nb_last_layer; j++) {
|
for (int j=0; j < nb_last_layer; j++) {
|
||||||
if (! strcmp(sortie, "json")) {
|
if (! strcmp(sortie, "json")) {
|
||||||
printf("%f", resultats[i][j]);
|
printf("%f", results[i][j]);
|
||||||
|
|
||||||
if (j+1 < nb_last_layer) {
|
if (j+1 < nb_last_layer) {
|
||||||
printf(", ");
|
printf(", ");
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
printf("Probabilité %d: %f\n", j, resultats[i][j]);
|
printf("Probabilité %d: %f\n", j, results[i][j]);
|
||||||
}
|
}
|
||||||
free(resultats[i]);
|
free(results[i]);
|
||||||
if (! strcmp(sortie, "json")) {
|
if (! strcmp(sortie, "json")) {
|
||||||
if (i+1 < nb_images) {
|
if (i+1 < nb_images) {
|
||||||
printf("],\n");
|
printf("],\n");
|
||||||
@ -292,7 +323,7 @@ void print_recognize(char* modele, char* entree, char* sortie) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(resultats);
|
free(results);
|
||||||
free(parameters);
|
free(parameters);
|
||||||
if (! strcmp(sortie, "json")) {
|
if (! strcmp(sortie, "json")) {
|
||||||
printf("}\n");
|
printf("}\n");
|
||||||
@ -311,22 +342,22 @@ void test(char* modele, char* fichier_images, char* fichier_labels, bool preview
|
|||||||
int height = parameters[2];
|
int height = parameters[2];
|
||||||
int*** images = read_mnist_images(fichier_images);
|
int*** images = read_mnist_images(fichier_images);
|
||||||
|
|
||||||
float** resultats = recognize(modele, fichier_images);
|
float** results = recognize(modele, fichier_images);
|
||||||
unsigned int* labels = read_mnist_labels(fichier_labels);
|
unsigned int* labels = read_mnist_labels(fichier_labels);
|
||||||
float accuracy = 0.;
|
float accuracy = 0.;
|
||||||
|
|
||||||
for (int i=0; i < nb_images; i++) {
|
for (int i=0; i < nb_images; i++) {
|
||||||
if (indice_max(resultats[i], nb_last_layer) == (int)labels[i]) {
|
if (indice_max(results[i], nb_last_layer) == (int)labels[i]) {
|
||||||
accuracy += 1. / (float)nb_images;
|
accuracy += 1. / (float)nb_images;
|
||||||
} else if (preview_fails) {
|
} else if (preview_fails) {
|
||||||
printf("--- Image %d, %d --- Prévision: %d ---\n", i, labels[i], indice_max(resultats[i], nb_last_layer));
|
printf("--- Image %d, %d --- Prévision: %d ---\n", i, labels[i], indice_max(results[i], nb_last_layer));
|
||||||
print_image(width, height, images[i], resultats[i]);
|
print_image(width, height, images[i], results[i]);
|
||||||
}
|
}
|
||||||
free(resultats[i]);
|
free(results[i]);
|
||||||
}
|
}
|
||||||
printf("%d Images\tAccuracy: %0.1f%%\n", nb_images, accuracy*100);
|
printf("%d Images\tAccuracy: %0.1f%%\n", nb_images, accuracy*100);
|
||||||
free(parameters);
|
free(parameters);
|
||||||
free(resultats);
|
free(results);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user