Add finetuning option

This commit is contained in:
julienChemillier 2023-05-25 16:32:37 +02:00
parent ec138581c2
commit 5ec7bab488
5 changed files with 33 additions and 9 deletions

View File

@ -229,7 +229,7 @@ void forward_propagation(Network* network) {
} }
} }
void backward_propagation(Network* network, int wanted_number) { void backward_propagation(Network* network, int wanted_number, int finetuning) {
int n = network->size; // Nombre de couches du réseau int n = network->size; // Nombre de couches du réseau
// Backward sur la dernière couche qui utilise toujours SOFTMAX // Backward sur la dernière couche qui utilise toujours SOFTMAX
@ -264,12 +264,18 @@ void backward_propagation(Network* network, int wanted_number) {
if (k_i->cnn) { // Convolution if (k_i->cnn) { // Convolution
if (finetuning == NN_AND_LINEARISATION || finetuning == NN_ONLY) {
return; // On arrête la backpropagation
}
int kernel_size = k_i->cnn->k_size; int kernel_size = k_i->cnn->k_size;
backward_convolution(k_i->cnn, input, input_z, output, input_depth, input_width, output_depth, output_width, -activation, is_last_layer, kernel_size, padding, stride); backward_convolution(k_i->cnn, input, input_z, output, input_depth, input_width, output_depth, output_width, -activation, is_last_layer, kernel_size, padding, stride);
} else if (k_i->nn) { // Full connection } else if (k_i->nn) { // Full connection
if (k_i->linearisation == DOESNT_LINEARISE) { // Vecteur -> Vecteur if (k_i->linearisation == DOESNT_LINEARISE) { // Vecteur -> Vecteur
backward_dense(k_i->nn, input[0][0], input_z[0][0], output[0][0], input_width, output_width, -activation, is_last_layer); backward_dense(k_i->nn, input[0][0], input_z[0][0], output[0][0], input_width, output_width, -activation, is_last_layer);
} else { // Matrice -> vecteur } else { // Matrice -> vecteur
if (finetuning == NN_ONLY) {
return; // On arrête la backpropagation
}
backward_linearisation(k_i->nn, input, input_z, output[0][0], input_depth, input_width, output_width, -activation); backward_linearisation(k_i->nn, input, input_z, output[0][0], input_depth, input_width, output_width, -activation);
} }
} else { // Pooling } else { // Pooling

View File

@ -5,6 +5,10 @@
#ifndef DEF_MAIN_H #ifndef DEF_MAIN_H
#define DEF_MAIN_H #define DEF_MAIN_H
#define EVERYTHING 0
#define NN_ONLY 1
#define NN_AND_LINEARISATION 2
/* /*
* Renvoie l'indice de l'élément de valeur maximale dans un tableau de flottants * Renvoie l'indice de l'élément de valeur maximale dans un tableau de flottants
* Utilisé pour trouver le neurone le plus activé de la dernière couche (résultat de la classification) * Utilisé pour trouver le neurone le plus activé de la dernière couche (résultat de la classification)
@ -38,7 +42,7 @@ void forward_propagation(Network* network);
/* /*
* Propage en arrière le cnn * Propage en arrière le cnn
*/ */
void backward_propagation(Network* network, int wanted_number); void backward_propagation(Network* network, int wanted_number, int finetuning);
/* /*
* Implémente le dropout durant l'apprentissage en suivant le papier de recherche suivant: * Implémente le dropout durant l'apprentissage en suivant le papier de recherche suivant:

View File

@ -23,6 +23,7 @@ typedef struct TrainParameters {
int nb_images; // Nombre d'images à traiter int nb_images; // Nombre d'images à traiter
float accuracy; // Accuracy (à renvoyer) float accuracy; // Accuracy (à renvoyer)
float loss; // Loss (à renvoyer) float loss; // Loss (à renvoyer)
int finetuning; // Distance de parcours de la backpropagation
bool offset; // Décalage aléatoire de l'image bool offset; // Décalage aléatoire de l'image
} TrainParameters; } TrainParameters;
@ -54,6 +55,6 @@ void* train_thread(void* parameters);
/* /*
* Fonction principale d'entraînement du réseau neuronal convolutif * Fonction principale d'entraînement du réseau neuronal convolutif
*/ */
void train(int dataset_type, char* images_file, char* labels_file, char* data_dir, int epochs, char* out, char* recover, bool with_offset); void train(int dataset_type, char* images_file, char* labels_file, char* data_dir, int epochs, char* out, char* recover, bool with_offset, int finetuning);
#endif #endif

View File

@ -28,6 +28,7 @@ void help(char* call) {
printf("\t (jpg) \t--datadir | -dd [FOLDER]\tDossier contenant les images.\n"); printf("\t (jpg) \t--datadir | -dd [FOLDER]\tDossier contenant les images.\n");
printf("\t\t--recover | -r [FILENAME]\tRécupérer depuis un modèle existant.\n"); printf("\t\t--recover | -r [FILENAME]\tRécupérer depuis un modèle existant.\n");
printf("\t\t--epochs | -e [int]\t\tNombre d'époques.\n"); printf("\t\t--epochs | -e [int]\t\tNombre d'époques.\n");
printf("\t\t--finetuning | -f [int]\t\tDistance de backpropagation (0: tout; 1: dense et linéarisation; 2:dense).\n");
printf("\t\t--out | -o [FILENAME]\tFichier où écrire le réseau de neurones.\n"); printf("\t\t--out | -o [FILENAME]\tFichier où écrire le réseau de neurones.\n");
printf("\trecognize:\n"); printf("\trecognize:\n");
printf("\t\t--dataset | -d (mnist|jpg)\tFormat de l'image à reconnaître.\n"); printf("\t\t--dataset | -d (mnist|jpg)\tFormat de l'image à reconnaître.\n");
@ -58,6 +59,7 @@ int main(int argc, char* argv[]) {
char* labels_file = NULL; char* labels_file = NULL;
char* data_dir = NULL; char* data_dir = NULL;
int epochs = EPOCHS; int epochs = EPOCHS;
int finetuning = 0;
int dataset_type = 0; int dataset_type = 0;
char* out = NULL; char* out = NULL;
char* recover = NULL; char* recover = NULL;
@ -84,7 +86,10 @@ int main(int argc, char* argv[]) {
epochs = strtol(argv[i+1], NULL, 10); epochs = strtol(argv[i+1], NULL, 10);
i += 2; i += 2;
} }
else if ((! strcmp(argv[i], "--out"))||(! strcmp(argv[i], "-o"))) { else if ((! strcmp(argv[i], "--finetuning"))||(! strcmp(argv[i], "-f"))) {
finetuning = strtol(argv[i+1], NULL, 10);
i += 2;
} else if ((! strcmp(argv[i], "--out"))||(! strcmp(argv[i], "-o"))) {
out = argv[i+1]; out = argv[i+1];
i += 2; i += 2;
} else if ((! strcmp(argv[i], "--recover"))||(! strcmp(argv[i], "-r"))) { } else if ((! strcmp(argv[i], "--recover"))||(! strcmp(argv[i], "-r"))) {
@ -125,7 +130,12 @@ int main(int argc, char* argv[]) {
printf("Pas de fichier de sortie spécifié, défaut: out.bin\n"); printf("Pas de fichier de sortie spécifié, défaut: out.bin\n");
out = "out.bin"; out = "out.bin";
} }
train(dataset_type, images_file, labels_file, data_dir, epochs, out, recover, offset);
if (finetuning < 0 || finetuning > 2) {
printf_error("Mauvais paramètre pour '--finetuning'\n");
return 1;
}
train(dataset_type, images_file, labels_file, data_dir, epochs, out, recover, offset, finetuning);
return 0; return 0;
} }
if (! strcmp(argv[1], "test")) { if (! strcmp(argv[1], "test")) {

View File

@ -57,6 +57,7 @@ void* train_thread(void* parameters) {
int dataset_type = param->dataset_type; int dataset_type = param->dataset_type;
int start = param->start; int start = param->start;
int nb_images = param->nb_images; int nb_images = param->nb_images;
int finetuning = param->finetuning;
float* wanted_output; float* wanted_output;
float accuracy = 0.; float accuracy = 0.;
@ -103,7 +104,7 @@ void* train_thread(void* parameters) {
loss += compute_mean_squared_error(network->input[network->size-1][0][0], wanted_output, 10); loss += compute_mean_squared_error(network->input[network->size-1][0][0], wanted_output, 10);
gree(wanted_output, false); gree(wanted_output, false);
backward_propagation(network, labels[index[i]]); backward_propagation(network, labels[index[i]], finetuning);
#ifdef DETAILED_TRAIN_TIMINGS #ifdef DETAILED_TRAIN_TIMINGS
printf("Temps de backward: "); printf("Temps de backward: ");
@ -143,7 +144,7 @@ void* train_thread(void* parameters) {
#endif #endif
maxi = indice_max(network->input[network->size-1][0][0], param->dataset->numCategories); maxi = indice_max(network->input[network->size-1][0][0], param->dataset->numCategories);
backward_propagation(network, param->dataset->labels[index[i]]); backward_propagation(network, param->dataset->labels[index[i]], finetuning);
#ifdef DETAILED_TRAIN_TIMINGS #ifdef DETAILED_TRAIN_TIMINGS
printf("Temps de backward: "); printf("Temps de backward: ");
@ -170,7 +171,7 @@ void* train_thread(void* parameters) {
} }
void train(int dataset_type, char* images_file, char* labels_file, char* data_dir, int epochs, char* out, char* recover, bool offset) { void train(int dataset_type, char* images_file, char* labels_file, char* data_dir, int epochs, char* out, char* recover, bool offset, int finetuning) {
#ifdef USE_CUDA #ifdef USE_CUDA
bool compatibility = cuda_setup(true); bool compatibility = cuda_setup(true);
if (!compatibility) { if (!compatibility) {
@ -289,6 +290,7 @@ void train(int dataset_type, char* images_file, char* labels_file, char* data_di
param->index = shuffle_index; param->index = shuffle_index;
param->network = copy_network(network); param->network = copy_network(network);
param->offset = offset; param->offset = offset;
param->finetuning = finetuning;
} }
#else #else
// Création des paramètres donnés à l'unique // Création des paramètres donnés à l'unique
@ -315,6 +317,7 @@ void train(int dataset_type, char* images_file, char* labels_file, char* data_di
train_params->nb_images = BATCHES; train_params->nb_images = BATCHES;
train_params->index = shuffle_index; train_params->index = shuffle_index;
train_params->offset = offset; train_params->offset = offset;
train_params->finetuning = finetuning;
#endif #endif
end_time = omp_get_wtime(); end_time = omp_get_wtime();
@ -485,4 +488,4 @@ void train(int dataset_type, char* images_file, char* labels_file, char* data_di
printf("\nTemps total: "); printf("\nTemps total: ");
printf_time(elapsed_time); printf_time(elapsed_time);
printf("\n"); printf("\n");
} }