2023-05-25 10:40:19 +02:00
|
|
|
#include <stdbool.h>
|
|
|
|
|
2022-07-05 08:13:25 +02:00
|
|
|
#include "struct.h"
|
2022-06-30 10:27:42 +02:00
|
|
|
|
2022-09-12 17:56:44 +02:00
|
|
|
#ifndef DEF_MAIN_H
|
|
|
|
#define DEF_MAIN_H
|
2022-06-30 10:27:42 +02:00
|
|
|
|
2023-05-25 16:32:37 +02:00
|
|
|
#define EVERYTHING 0
|
|
|
|
#define NN_ONLY 1
|
|
|
|
#define NN_AND_LINEARISATION 2
|
|
|
|
|
2022-11-25 15:17:47 +01:00
|
|
|
/*
|
|
|
|
* 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)
|
|
|
|
*/
|
|
|
|
int indice_max(float* tab, int n);
|
2022-06-30 10:27:42 +02:00
|
|
|
|
2022-07-05 08:13:25 +02:00
|
|
|
/*
|
|
|
|
* Renvoie si oui ou non (1 ou 0) le neurone va être abandonné
|
|
|
|
*/
|
2022-10-07 15:32:54 +02:00
|
|
|
int will_be_drop(int dropout_prob);
|
2022-07-05 08:13:25 +02:00
|
|
|
|
|
|
|
/*
|
2022-09-09 17:39:07 +02:00
|
|
|
* Écrit une image 28*28 au centre d'un tableau 32*32 et met à 0 le reste
|
2022-07-05 08:13:25 +02:00
|
|
|
*/
|
2023-03-22 13:03:19 +01:00
|
|
|
void write_image_in_network_32(int** image, int height, int width, float** input, bool random_offset);
|
2022-07-05 08:13:25 +02:00
|
|
|
|
2022-11-19 16:09:07 +01:00
|
|
|
/*
|
2023-05-15 11:34:23 +02:00
|
|
|
* Écrit une image linéarisée de img_width*img_width*img_depth pixels dans un tableau de taille size_input*size_input*3
|
|
|
|
* Les conditions suivantes doivent être respectées:
|
|
|
|
* - l'image est au plus de la même taille que input
|
|
|
|
* - la différence de taille entre input et l'image doit être un multiple de 2 (pour centrer l'image)
|
2022-11-19 16:09:07 +01:00
|
|
|
*/
|
2023-05-15 11:34:23 +02:00
|
|
|
void write_256_image_in_network(unsigned char* image, int img_width, int img_depth, int input_width, float*** input);
|
2022-11-19 16:09:07 +01:00
|
|
|
|
2022-07-05 08:13:25 +02:00
|
|
|
/*
|
2023-03-12 11:13:26 +01:00
|
|
|
* Propage en avant le cnn. Le dropout est actif que si le réseau est en phase d'apprentissage.
|
|
|
|
*
|
2022-07-05 08:13:25 +02:00
|
|
|
*/
|
2022-06-30 10:27:42 +02:00
|
|
|
void forward_propagation(Network* network);
|
2022-07-05 08:13:25 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Propage en arrière le cnn
|
|
|
|
*/
|
2023-05-25 16:32:37 +02:00
|
|
|
void backward_propagation(Network* network, int wanted_number, int finetuning);
|
2022-07-05 08:13:25 +02:00
|
|
|
|
2022-11-04 12:02:00 +01:00
|
|
|
/*
|
2023-03-03 21:58:05 +01:00
|
|
|
* Implémente le dropout durant l'apprentissage en suivant le papier de recherche suivant:
|
|
|
|
* https://www.jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf
|
|
|
|
* Cela se fait en mettant à 0 chaque valeur de l'input avec une probabilité de dropout%
|
2022-11-04 12:02:00 +01:00
|
|
|
*/
|
|
|
|
void drop_neurones(float*** input, int depth, int dim1, int dim2, int dropout);
|
|
|
|
|
2022-10-31 20:08:42 +01:00
|
|
|
/*
|
2023-03-03 21:58:05 +01:00
|
|
|
* Copie les données de output dans output_z (Sachant que les deux matrices ont les mêmes dimensions)
|
2022-10-31 20:08:42 +01:00
|
|
|
*/
|
2023-03-03 21:58:05 +01:00
|
|
|
void copy_input_to_input_z(float*** output, float*** output_z, int output_depth, int output_rows, int output_columns);
|
2022-10-31 20:08:42 +01:00
|
|
|
|
2022-07-05 08:13:25 +02:00
|
|
|
/*
|
2022-10-07 15:32:54 +02:00
|
|
|
* Renvoie l'erreur du réseau neuronal pour une sortie (RMS)
|
|
|
|
*/
|
|
|
|
float compute_mean_squared_error(float* output, float* wanted_output, int len);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Renvoie l'erreur du réseau neuronal pour une sortie (CEL)
|
2022-07-05 08:13:25 +02:00
|
|
|
*/
|
2022-06-30 10:27:42 +02:00
|
|
|
float compute_cross_entropy_loss(float* output, float* wanted_output, int len);
|
|
|
|
|
2022-07-05 08:13:25 +02:00
|
|
|
/*
|
|
|
|
* On considère que la sortie voulue comporte 10 éléments
|
|
|
|
*/
|
2023-01-18 10:25:46 +01:00
|
|
|
float* generate_wanted_output(int wanted_number, int size_output);
|
2022-06-30 10:27:42 +02:00
|
|
|
|
|
|
|
#endif
|