From c1283d8c4be6b010e6cfa934133478cd2cfc0fbd Mon Sep 17 00:00:00 2001 From: julienChemillier Date: Fri, 25 Nov 2022 14:49:21 +0100 Subject: [PATCH] Fix softmax_backward --- src/cnn/backpropagation.c | 9 ++------- src/cnn/cnn.c | 2 +- src/cnn/include/backpropagation.h | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/cnn/backpropagation.c b/src/cnn/backpropagation.c index 3ab7b59..ae4134a 100644 --- a/src/cnn/backpropagation.c +++ b/src/cnn/backpropagation.c @@ -14,16 +14,11 @@ int max(int a, int b) { } // Euh..... tout peut être faux à cause de la source -void rms_backward(float* input, float* input_z, float* output, int size) { +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 */ - float sum=0; - for (int i=0; i < size; i++) - sum += exp(input_z[i]); - float denom = sum*sum; for (int i=0; i < size; i++){ - float e_i = exp(input_z[i]); - input[i] = 2*(input[i]-output[i])*((e_i*(sum-e_i))/denom); // ∂E/∂out_i * ∂out_i/∂net_i = 𝛿_i + input[i] = (output[i]-input[i])*input[i]; // ∂E/∂out_i * ∂out_i/∂net_i = 𝛿_i } } diff --git a/src/cnn/cnn.c b/src/cnn/cnn.c index 5782757..5feb795 100644 --- a/src/cnn/cnn.c +++ b/src/cnn/cnn.c @@ -122,7 +122,7 @@ void backward_propagation(Network* network, float wanted_number) { float*** output; Kernel* k_i; - rms_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 + 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 for (int i=n-2; i >= 0; i--) { // Modifie 'k_i' à partir d'une comparaison d'informations entre 'input' et 'output' diff --git a/src/cnn/include/backpropagation.h b/src/cnn/include/backpropagation.h index 29e7671..1b008eb 100644 --- a/src/cnn/include/backpropagation.h +++ b/src/cnn/include/backpropagation.h @@ -17,7 +17,7 @@ int max(int a, int b); /* * Transfert les informations d'erreur de la sortie voulue à la sortie réelle */ -void rms_backward(float* input, float* input_z, float* output, int size); +void softmax_backward(float* input, float* input_z, float* output, int size); /* * Transfert les informations d'erreur à travers une couche d'average pooling