Fix softmax, dense and pooling backprops

This commit is contained in:
julienChemillier 2023-02-07 18:39:38 +01:00
parent 5bf3c2775b
commit 4547335ec0

View File

@ -3,8 +3,6 @@
#include "include/backpropagation.h" #include "include/backpropagation.h"
#include "include/struct.h" #include "include/struct.h"
// The first layer needs to be a convolution or a fully connected one
int min(int a, int b) { int min(int a, int b) {
return a<b?a:b; return a<b?a:b;
} }
@ -13,20 +11,21 @@ int max(int a, int b) {
return a > b ? a : b; return a > b ? a : b;
} }
// Euh..... tout peut être faux à cause de la source
void softmax_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 /* Input et output ont la même taille
On considère que la dernière couche a utilisée softmax */ On considère que la dernière couche a utilisée softmax
et que l'erreur est MSE */
for (int i=0; i < size; i++){ for (int i=0; i < size; i++){
input[i] = (output[i]-input[i])*input[i]; // ∂E/∂out_i * ∂out_i/∂net_i = 𝛿_i input[i] = (output[i]-input[i])*input[i]*(1-input[i]);
} }
} }
void backward_2d_pooling(float*** input, float*** output, int input_width, int output_width, int depth) { 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) */ /* Input et output ont la même profondeur (depth) */
// Inventé par moi-même (et que moi (vraiment que moi (lvdmm)))
int size = output_width - input_width + 1; // Taille du pooling //int size = output_width - input_width +1;
int size = input_width/output_width; // Taille du pooling
int n = size*size; // Nombre d'éléments dans le pooling int n = size*size; // Nombre d'éléments dans le pooling
for (int a=0; a < depth; a++) for (int a=0; a < depth; a++)
@ -82,12 +81,11 @@ void backward_linearisation(Kernel_nn* ker, float*** input, float*** input_z, fl
// Weights // Weights
int cpt = 0; int cpt = 0;
int nb_elem = depth_input*dim_input*dim_input*size_output;
for (int i=0; i < depth_input; i++) { for (int i=0; i < depth_input; i++) {
for (int k=0; k < dim_input; k++) { for (int k=0; k < dim_input; k++) {
for (int l=0; l < dim_input; l++) { for (int l=0; l < dim_input; l++) {
for (int j=0; j < size_output; j++) { for (int j=0; j < size_output; j++) {
ker->d_weights[cpt][j] += input[i][k][l]*output[j]/nb_elem; ker->d_weights[cpt][j] += input[i][k][l]*output[j];
} }
cpt++; cpt++;
} }