diff --git a/src/cnn/backpropagation.c b/src/cnn/backpropagation.c index 952c2eb..19ef443 100644 --- a/src/cnn/backpropagation.c +++ b/src/cnn/backpropagation.c @@ -11,16 +11,22 @@ int max(int a, int b) { return a > b ? a : b; } -void softmax_backward(float* input, float* input_z, float* output, int size) { - /* Input et output ont la même taille - On considère que la dernière couche a utilisée softmax - et que l'erreur est MSE */ +void softmax_backward_mse(float* input, float* input_z, float* output, int size) { + /* Input et output ont la même taille */ for (int i=0; i < size; i++){ input[i] = (output[i]-input[i])*input[i]*(1-input[i]); } } +void softmax_backward_cross_entropy(float* input, float* input_z, float* output, int size) { + /* Input et output ont la même taille */ + + for (int i=0; i < size; i++){ + input[i] = output[i] - input[i]; + } +} + void backward_2d_pooling(float*** input, float*** output, int input_width, int output_width, int depth) { /* Input et output ont la même profondeur (depth) */ diff --git a/src/cnn/cnn.c b/src/cnn/cnn.c index 8113d25..9a9be48 100644 --- a/src/cnn/cnn.c +++ b/src/cnn/cnn.c @@ -142,7 +142,8 @@ void backward_propagation(Network* network, int wanted_number) { float*** output; Kernel* k_i; - softmax_backward(network->input[n-1][0][0], network->input_z[n-1][0][0], wanted_output, network->width[n-1]); // Backward sur la dernière colonne + // Backward sur la dernière couche + softmax_backward_cross_entropy(network->input[n-1][0][0], network->input_z[n-1][0][0], wanted_output, network->width[n-1]); for (int i=n-2; i >= 0; i--) { // Modifie 'k_i' à partir d'une comparaison d'informations entre 'input' et 'output' @@ -219,7 +220,7 @@ float compute_cross_entropy_loss(float* output, float* wanted_output, int len) { } } } - return loss; + return loss/len; } float* generate_wanted_output(int wanted_number, int size_output) { diff --git a/src/cnn/include/backpropagation.h b/src/cnn/include/backpropagation.h index 461c061..7ace3f2 100644 --- a/src/cnn/include/backpropagation.h +++ b/src/cnn/include/backpropagation.h @@ -17,10 +17,17 @@ int max(int a, int b); /* * Transfert les informations d'erreur de la sortie voulue à la sortie réelle */ -void softmax_backward(float* input, float* input_z, float* output, int size); +void softmax_backward_mse(float* input, float* input_z, float* output, int size); + +/* +* Transfert les informations d'erreur de la sortie voulue à la sortie réelle +* en considérant MSE (Mean Squared Error) comme fonction d'erreur +*/ +void softmax_backward_cross_entropy(float* input, float* input_z, float* output, int size); /* * Transfert les informations d'erreur à travers une couche d'average pooling +* en considérant cross_entropy comme fonction d'erreur */ void backward_2d_pooling(float*** input, float*** output, int input_width, int output_width, int depth);