mirror of
https://github.com/augustin64/projet-tipe
synced 2025-01-23 15:16:26 +01:00
Add cross_entropy backpropagation
This commit is contained in:
parent
b89c651174
commit
b7b90f9cab
@ -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) */
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user