Add cross_entropy backpropagation

This commit is contained in:
julienChemillier 2023-02-24 11:01:59 +01:00
parent b89c651174
commit b7b90f9cab
3 changed files with 21 additions and 7 deletions

View File

@ -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) */

View File

@ -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) {

View File

@ -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);