mirror of
https://github.com/augustin64/projet-tipe
synced 2025-01-23 15:16:26 +01:00
Compare commits
2 Commits
677de892e7
...
57954a27c0
Author | SHA1 | Date | |
---|---|---|---|
57954a27c0 | |||
|
5f684d9f91 |
@ -165,31 +165,67 @@ void add_convolution(Network* network, int depth_output, int dim_output, int act
|
|||||||
cnn->columns = depth_output;
|
cnn->columns = depth_output;
|
||||||
cnn->weights = (float****)nalloc(depth_input, sizeof(float***));
|
cnn->weights = (float****)nalloc(depth_input, sizeof(float***));
|
||||||
cnn->d_weights = (float****)nalloc(depth_input, sizeof(float***));
|
cnn->d_weights = (float****)nalloc(depth_input, sizeof(float***));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights = (float****)nalloc(depth_input, sizeof(float***));
|
||||||
|
cnn->v_d_weights = (float****)nalloc(depth_input, sizeof(float***));
|
||||||
|
#endif
|
||||||
for (int i=0; i < depth_input; i++) {
|
for (int i=0; i < depth_input; i++) {
|
||||||
cnn->weights[i] = (float***)nalloc(depth_output, sizeof(float**));
|
cnn->weights[i] = (float***)nalloc(depth_output, sizeof(float**));
|
||||||
cnn->d_weights[i] = (float***)nalloc(depth_output, sizeof(float**));
|
cnn->d_weights[i] = (float***)nalloc(depth_output, sizeof(float**));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights[i] = (float***)nalloc(depth_output, sizeof(float**));
|
||||||
|
cnn->v_d_weights[i] = (float***)nalloc(depth_output, sizeof(float**));
|
||||||
|
#endif
|
||||||
for (int j=0; j < depth_output; j++) {
|
for (int j=0; j < depth_output; j++) {
|
||||||
cnn->weights[i][j] = (float**)nalloc(kernel_size, sizeof(float*));
|
cnn->weights[i][j] = (float**)nalloc(kernel_size, sizeof(float*));
|
||||||
cnn->d_weights[i][j] = (float**)nalloc(kernel_size, sizeof(float*));
|
cnn->d_weights[i][j] = (float**)nalloc(kernel_size, sizeof(float*));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights[i][j] = (float**)nalloc(kernel_size, sizeof(float*));
|
||||||
|
cnn->v_d_weights[i][j] = (float**)nalloc(kernel_size, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int k=0; k < kernel_size; k++) {
|
for (int k=0; k < kernel_size; k++) {
|
||||||
cnn->weights[i][j][k] = (float*)nalloc(kernel_size, sizeof(float));
|
cnn->weights[i][j][k] = (float*)nalloc(kernel_size, sizeof(float));
|
||||||
cnn->d_weights[i][j][k] = (float*)nalloc(kernel_size, sizeof(float));
|
cnn->d_weights[i][j][k] = (float*)nalloc(kernel_size, sizeof(float));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights[i][j][k] = (float*)nalloc(kernel_size, sizeof(float));
|
||||||
|
cnn->v_d_weights[i][j][k] = (float*)nalloc(kernel_size, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int l=0; l < kernel_size; l++) {
|
for (int l=0; l < kernel_size; l++) {
|
||||||
cnn->d_weights[i][j][k][l] = 0.;
|
cnn->d_weights[i][j][k][l] = 0.;
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights[i][j][k][l] = 0.;
|
||||||
|
cnn->v_d_weights[i][j][k][l] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cnn->bias = (float***)nalloc(depth_output, sizeof(float**));
|
cnn->bias = (float***)nalloc(depth_output, sizeof(float**));
|
||||||
cnn->d_bias = (float***)nalloc(depth_output, sizeof(float**));
|
cnn->d_bias = (float***)nalloc(depth_output, sizeof(float**));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
cnn->s_d_bias = (float***)nalloc(depth_output, sizeof(float**));
|
||||||
|
cnn->v_d_bias = (float***)nalloc(depth_output, sizeof(float**));
|
||||||
|
#endif
|
||||||
for (int i=0; i < depth_output; i++) {
|
for (int i=0; i < depth_output; i++) {
|
||||||
cnn->bias[i] = (float**)nalloc(bias_size, sizeof(float*));
|
cnn->bias[i] = (float**)nalloc(bias_size, sizeof(float*));
|
||||||
cnn->d_bias[i] = (float**)nalloc(bias_size, sizeof(float*));
|
cnn->d_bias[i] = (float**)nalloc(bias_size, sizeof(float*));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
cnn->s_d_bias[i] = (float**)nalloc(bias_size, sizeof(float*));
|
||||||
|
cnn->v_d_bias[i] = (float**)nalloc(bias_size, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int j=0; j < bias_size; j++) {
|
for (int j=0; j < bias_size; j++) {
|
||||||
cnn->bias[i][j] = (float*)nalloc(bias_size, sizeof(float));
|
cnn->bias[i][j] = (float*)nalloc(bias_size, sizeof(float));
|
||||||
cnn->d_bias[i][j] = (float*)nalloc(bias_size, sizeof(float));
|
cnn->d_bias[i][j] = (float*)nalloc(bias_size, sizeof(float));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
cnn->s_d_bias[i][j] = (float*)nalloc(bias_size, sizeof(float));
|
||||||
|
cnn->v_d_bias[i][j] = (float*)nalloc(bias_size, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int k=0; k < bias_size; k++) {
|
for (int k=0; k < bias_size; k++) {
|
||||||
cnn->d_bias[i][j][k] = 0.;
|
cnn->d_bias[i][j][k] = 0.;
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
cnn->s_d_bias[i][j][k] = 0.;
|
||||||
|
cnn->v_d_bias[i][j][k] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -220,17 +256,37 @@ void add_dense(Network* network, int size_output, int activation) {
|
|||||||
nn->size_output = size_output;
|
nn->size_output = size_output;
|
||||||
nn->bias = (float*)nalloc(size_output, sizeof(float));
|
nn->bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
nn->d_bias = (float*)nalloc(size_output, sizeof(float));
|
nn->d_bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
nn->s_d_bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
nn->v_d_bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int i=0; i < size_output; i++) {
|
for (int i=0; i < size_output; i++) {
|
||||||
nn->d_bias[i] = 0.;
|
nn->d_bias[i] = 0.;
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
nn->s_d_bias[i] = 0.;
|
||||||
|
nn->v_d_bias[i] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
nn->weights = (float**)nalloc(size_input, sizeof(float*));
|
nn->weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
nn->d_weights = (float**)nalloc(size_input, sizeof(float*));
|
nn->d_weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
nn->s_d_weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
|
nn->v_d_weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int i=0; i < size_input; i++) {
|
for (int i=0; i < size_input; i++) {
|
||||||
nn->weights[i] = (float*)nalloc(size_output, sizeof(float));
|
nn->weights[i] = (float*)nalloc(size_output, sizeof(float));
|
||||||
nn->d_weights[i] = (float*)nalloc(size_output, sizeof(float));
|
nn->d_weights[i] = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
nn->s_d_weights[i] = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
nn->v_d_weights[i] = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int j=0; j < size_output; j++) {
|
for (int j=0; j < size_output; j++) {
|
||||||
nn->d_weights[i][j] = 0.;
|
nn->d_weights[i][j] = 0.;
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
nn->s_d_weights[i][j] = 0.;
|
||||||
|
nn->v_d_weights[i][j] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,16 +318,36 @@ void add_dense_linearisation(Network* network, int size_output, int activation)
|
|||||||
|
|
||||||
nn->bias = (float*)nalloc(size_output, sizeof(float));
|
nn->bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
nn->d_bias = (float*)nalloc(size_output, sizeof(float));
|
nn->d_bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
nn->s_d_bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
nn->v_d_bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int i=0; i < size_output; i++) {
|
for (int i=0; i < size_output; i++) {
|
||||||
nn->d_bias[i] = 0.;
|
nn->d_bias[i] = 0.;
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
nn->s_d_bias[i] = 0.;
|
||||||
|
nn->v_d_bias[i] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
nn->weights = (float**)nalloc(size_input, sizeof(float*));
|
nn->weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
nn->d_weights = (float**)nalloc(size_input, sizeof(float*));
|
nn->d_weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
nn->s_d_weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
|
nn->v_d_weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int i=0; i < size_input; i++) {
|
for (int i=0; i < size_input; i++) {
|
||||||
nn->weights[i] = (float*)nalloc(size_output, sizeof(float));
|
nn->weights[i] = (float*)nalloc(size_output, sizeof(float));
|
||||||
nn->d_weights[i] = (float*)nalloc(size_output, sizeof(float));
|
nn->d_weights[i] = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
nn->s_d_weights[i] = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
nn->v_d_weights[i] = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int j=0; j < size_output; j++) {
|
for (int j=0; j < size_output; j++) {
|
||||||
nn->d_weights[i][j] = 0.;
|
nn->d_weights[i][j] = 0.;
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
nn->s_d_weights[i][j] = 0.;
|
||||||
|
nn->v_d_weights[i][j] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
initialisation_1d_matrix(network->initialisation, nn->bias, size_output, size_input, size_output);
|
initialisation_1d_matrix(network->initialisation, nn->bias, size_output, size_input, size_output);
|
||||||
|
@ -42,27 +42,55 @@ void free_convolution(Network* network, int pos) {
|
|||||||
for (int j=0; j < bias_size; j++) {
|
for (int j=0; j < bias_size; j++) {
|
||||||
gree(k_pos->bias[i][j]);
|
gree(k_pos->bias[i][j]);
|
||||||
gree(k_pos->d_bias[i][j]);
|
gree(k_pos->d_bias[i][j]);
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
gree(k_pos->s_d_bias[i][j]);
|
||||||
|
gree(k_pos->v_d_bias[i][j]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
gree(k_pos->bias[i]);
|
gree(k_pos->bias[i]);
|
||||||
gree(k_pos->d_bias[i]);
|
gree(k_pos->d_bias[i]);
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
gree(k_pos->s_d_bias[i]);
|
||||||
|
gree(k_pos->v_d_bias[i]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
gree(k_pos->bias);
|
gree(k_pos->bias);
|
||||||
gree(k_pos->d_bias);
|
gree(k_pos->d_bias);
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
gree(k_pos->s_d_bias);
|
||||||
|
gree(k_pos->v_d_bias);
|
||||||
|
#endif
|
||||||
|
|
||||||
for (int i=0; i < r; i++) {
|
for (int i=0; i < r; i++) {
|
||||||
for (int j=0; j < c; j++) {
|
for (int j=0; j < c; j++) {
|
||||||
for (int k=0; k < k_size; k++) {
|
for (int k=0; k < k_size; k++) {
|
||||||
gree(k_pos->weights[i][j][k]);
|
gree(k_pos->weights[i][j][k]);
|
||||||
gree(k_pos->d_weights[i][j][k]);
|
gree(k_pos->d_weights[i][j][k]);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
gree(k_pos->s_d_weights[i][j][k]);
|
||||||
|
gree(k_pos->v_d_weights[i][j][k]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
gree(k_pos->weights[i][j]);
|
gree(k_pos->weights[i][j]);
|
||||||
gree(k_pos->d_weights[i][j]);
|
gree(k_pos->d_weights[i][j]);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
gree(k_pos->s_d_weights[i][j]);
|
||||||
|
gree(k_pos->v_d_weights[i][j]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
gree(k_pos->weights[i]);
|
gree(k_pos->weights[i]);
|
||||||
gree(k_pos->d_weights[i]);
|
gree(k_pos->d_weights[i]);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
gree(k_pos->s_d_weights[i]);
|
||||||
|
gree(k_pos->v_d_weights[i]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
gree(k_pos->weights);
|
gree(k_pos->weights);
|
||||||
gree(k_pos->d_weights);
|
gree(k_pos->d_weights);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
gree(k_pos->s_d_weights);
|
||||||
|
gree(k_pos->v_d_weights);
|
||||||
|
#endif
|
||||||
|
|
||||||
gree(k_pos);
|
gree(k_pos);
|
||||||
}
|
}
|
||||||
@ -74,12 +102,24 @@ void free_dense(Network* network, int pos) {
|
|||||||
for (int i=0; i < dim; i++) {
|
for (int i=0; i < dim; i++) {
|
||||||
gree(k_pos->weights[i]);
|
gree(k_pos->weights[i]);
|
||||||
gree(k_pos->d_weights[i]);
|
gree(k_pos->d_weights[i]);
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
gree(k_pos->s_d_weights[i]);
|
||||||
|
gree(k_pos->v_d_weights[i]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
gree(k_pos->weights);
|
gree(k_pos->weights);
|
||||||
gree(k_pos->d_weights);
|
gree(k_pos->d_weights);
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
gree(k_pos->s_d_weights);
|
||||||
|
gree(k_pos->v_d_weights);
|
||||||
|
#endif
|
||||||
|
|
||||||
gree(k_pos->bias);
|
gree(k_pos->bias);
|
||||||
gree(k_pos->d_bias);
|
gree(k_pos->d_bias);
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
gree(k_pos->s_d_bias);
|
||||||
|
gree(k_pos->v_d_bias);
|
||||||
|
#endif
|
||||||
|
|
||||||
gree(k_pos);
|
gree(k_pos);
|
||||||
}
|
}
|
||||||
@ -91,12 +131,24 @@ void free_dense_linearisation(Network* network, int pos) {
|
|||||||
for (int i=0; i < dim; i++) {
|
for (int i=0; i < dim; i++) {
|
||||||
gree(k_pos->weights[i]);
|
gree(k_pos->weights[i]);
|
||||||
gree(k_pos->d_weights[i]);
|
gree(k_pos->d_weights[i]);
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
gree(k_pos->s_d_weights[i]);
|
||||||
|
gree(k_pos->v_d_weights[i]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
gree(k_pos->weights);
|
gree(k_pos->weights);
|
||||||
gree(k_pos->d_weights);
|
gree(k_pos->d_weights);
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
gree(k_pos->s_d_weights);
|
||||||
|
gree(k_pos->v_d_weights);
|
||||||
|
#endif
|
||||||
|
|
||||||
gree(k_pos->bias);
|
gree(k_pos->bias);
|
||||||
gree(k_pos->d_bias);
|
gree(k_pos->d_bias);
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
gree(k_pos->s_d_bias);
|
||||||
|
gree(k_pos->v_d_bias);
|
||||||
|
#endif
|
||||||
|
|
||||||
gree(k_pos);
|
gree(k_pos);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,27 @@
|
|||||||
#ifndef DEF_CONFIG_H
|
#ifndef DEF_CONFIG_H
|
||||||
#define DEF_CONFIG_H
|
#define DEF_CONFIG_H
|
||||||
|
|
||||||
|
|
||||||
//* Paramètres d'entraînement
|
//* Paramètres d'entraînement
|
||||||
#define EPOCHS 10 // Nombre d'époques par défaut (itérations sur toutes les images)
|
#define EPOCHS 10 // Nombre d'époques par défaut (itérations sur toutes les images)
|
||||||
#define BATCHES 32 // Nombre d'images à voir avant de mettre le réseau à jour
|
#define BATCHES 32 // Nombre d'images à voir avant de mettre le réseau à jour
|
||||||
#define LEARNING_RATE 3e-4 // Taux d'apprentissage
|
#define LEARNING_RATE 3e-4 // Taux d'apprentissage
|
||||||
#define USE_MULTITHREADING // Commenter pour utiliser un seul coeur durant l'apprentissage (meilleur pour des tailles de batchs traités rapidement)
|
#define USE_MULTITHREADING // Commenter pour utiliser un seul coeur durant l'apprentissage (meilleur pour des tailles de batchs traités rapidement)
|
||||||
|
|
||||||
|
//* Paramètres d'ADAM optimizer
|
||||||
|
#define ALPHA 3e-4
|
||||||
|
#define BETA_1 0.9
|
||||||
|
#define BETA_2 0.999
|
||||||
|
#define Epsilon 1e-7
|
||||||
|
|
||||||
|
//* Options d'ADAM optimizer
|
||||||
|
//* Activer ou désactiver Adam sur les couches dense
|
||||||
|
//#define ADAM_DENSE_WEIGHTS
|
||||||
|
//#define ADAM_DENSE_BIAS
|
||||||
|
//* Activer ou désactiver Adam sur les couches convolutives
|
||||||
|
//#define ADAM_CNN_WEIGHTS
|
||||||
|
//#define ADAM_CNN_BIAS
|
||||||
|
|
||||||
|
|
||||||
//* Paramètre d'optimisation pour un dataset Jpeg
|
//* Paramètre d'optimisation pour un dataset Jpeg
|
||||||
// keep images in ram e.g re-read and decompress each time
|
// keep images in ram e.g re-read and decompress each time
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef DEF_STRUCT_H
|
#ifndef DEF_STRUCT_H
|
||||||
#define DEF_STRUCT_H
|
#define DEF_STRUCT_H
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#define NO_POOLING 0
|
#define NO_POOLING 0
|
||||||
#define AVG_POOLING 1
|
#define AVG_POOLING 1
|
||||||
#define MAX_POOLING 2
|
#define MAX_POOLING 2
|
||||||
@ -15,8 +17,16 @@ typedef struct Kernel_cnn {
|
|||||||
int columns; // Depth de l'output
|
int columns; // Depth de l'output
|
||||||
float*** bias; // bias[columns][dim_output][dim_output]
|
float*** bias; // bias[columns][dim_output][dim_output]
|
||||||
float*** d_bias; // d_bias[columns][dim_output][dim_output]
|
float*** d_bias; // d_bias[columns][dim_output][dim_output]
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
float*** s_d_bias; // s_d_bias[columns][dim_output][dim_output]
|
||||||
|
float*** v_d_bias; // v_d_bias[columns][dim_output][dim_output]
|
||||||
|
#endif
|
||||||
float**** weights; // weights[rows][columns][k_size][k_size]
|
float**** weights; // weights[rows][columns][k_size][k_size]
|
||||||
float**** d_weights; // d_weights[rows][columns][k_size][k_size]
|
float**** d_weights; // d_weights[rows][columns][k_size][k_size]
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
float**** s_d_weights; // s_d_weights[rows][columns][k_size][k_size]
|
||||||
|
float**** v_d_weights; // v_d_weights[rows][columns][k_size][k_size]
|
||||||
|
#endif
|
||||||
} Kernel_cnn;
|
} Kernel_cnn;
|
||||||
|
|
||||||
typedef struct Kernel_nn {
|
typedef struct Kernel_nn {
|
||||||
@ -25,8 +35,16 @@ typedef struct Kernel_nn {
|
|||||||
int size_output; // Nombre d'éléments en sortie
|
int size_output; // Nombre d'éléments en sortie
|
||||||
float* bias; // bias[size_output]
|
float* bias; // bias[size_output]
|
||||||
float* d_bias; // d_bias[size_output]
|
float* d_bias; // d_bias[size_output]
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
float* s_d_bias; // s_d_bias[size_output]
|
||||||
|
float* v_d_bias; // v_d_bias[size_output]
|
||||||
|
#endif
|
||||||
float** weights; // weight[size_input][size_output]
|
float** weights; // weight[size_input][size_output]
|
||||||
float** d_weights; // d_weights[size_input][size_output]
|
float** d_weights; // d_weights[size_input][size_output]
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
float** s_d_weights; // s_d_weights[size_input][size_output]
|
||||||
|
float** v_d_weights; // v_d_weights[size_input][size_output]
|
||||||
|
#endif
|
||||||
} Kernel_nn;
|
} Kernel_nn;
|
||||||
|
|
||||||
typedef struct Kernel {
|
typedef struct Kernel {
|
||||||
|
@ -249,35 +249,71 @@ Kernel* read_kernel(int type_couche, int output_dim, FILE* ptr) {
|
|||||||
|
|
||||||
cnn->bias = (float***)nalloc(cnn->columns, sizeof(float**));
|
cnn->bias = (float***)nalloc(cnn->columns, sizeof(float**));
|
||||||
cnn->d_bias = (float***)nalloc(cnn->columns, sizeof(float**));
|
cnn->d_bias = (float***)nalloc(cnn->columns, sizeof(float**));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
cnn->s_d_bias = (float***)nalloc(cnn->columns, sizeof(float**));
|
||||||
|
cnn->v_d_bias = (float***)nalloc(cnn->columns, sizeof(float**));
|
||||||
|
#endif
|
||||||
for (int i=0; i < cnn->columns; i++) {
|
for (int i=0; i < cnn->columns; i++) {
|
||||||
cnn->bias[i] = (float**)nalloc(output_dim, sizeof(float*));
|
cnn->bias[i] = (float**)nalloc(output_dim, sizeof(float*));
|
||||||
cnn->d_bias[i] = (float**)nalloc(output_dim, sizeof(float*));
|
cnn->d_bias[i] = (float**)nalloc(output_dim, sizeof(float*));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
cnn->s_d_bias[i] = (float**)nalloc(output_dim, sizeof(float*));
|
||||||
|
cnn->v_d_bias[i] = (float**)nalloc(output_dim, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int j=0; j < output_dim; j++) {
|
for (int j=0; j < output_dim; j++) {
|
||||||
cnn->bias[i][j] = (float*)nalloc(output_dim, sizeof(float));
|
cnn->bias[i][j] = (float*)nalloc(output_dim, sizeof(float));
|
||||||
cnn->d_bias[i][j] = (float*)nalloc(output_dim, sizeof(float));
|
cnn->d_bias[i][j] = (float*)nalloc(output_dim, sizeof(float));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
cnn->s_d_bias[i][j] = (float*)nalloc(output_dim, sizeof(float));
|
||||||
|
cnn->v_d_bias[i][j] = (float*)nalloc(output_dim, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int k=0; k < output_dim; k++) {
|
for (int k=0; k < output_dim; k++) {
|
||||||
(void) !fread(&tmp, sizeof(tmp), 1, ptr);
|
(void) !fread(&tmp, sizeof(tmp), 1, ptr);
|
||||||
cnn->bias[i][j][k] = tmp;
|
cnn->bias[i][j][k] = tmp;
|
||||||
cnn->d_bias[i][j][k] = 0.;
|
cnn->d_bias[i][j][k] = 0.;
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
cnn->s_d_bias[i][j][k] = 0.;
|
||||||
|
cnn->v_d_bias[i][j][k] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cnn->weights = (float****)nalloc(cnn->rows, sizeof(float***));
|
cnn->weights = (float****)nalloc(cnn->rows, sizeof(float***));
|
||||||
cnn->d_weights = (float****)nalloc(cnn->rows, sizeof(float***));
|
cnn->d_weights = (float****)nalloc(cnn->rows, sizeof(float***));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights = (float****)nalloc(cnn->rows, sizeof(float***));
|
||||||
|
cnn->v_d_weights = (float****)nalloc(cnn->rows, sizeof(float***));
|
||||||
|
#endif
|
||||||
for (int i=0; i < cnn->rows; i++) {
|
for (int i=0; i < cnn->rows; i++) {
|
||||||
cnn->weights[i] = (float***)nalloc(cnn->columns, sizeof(float**));
|
cnn->weights[i] = (float***)nalloc(cnn->columns, sizeof(float**));
|
||||||
cnn->d_weights[i] = (float***)nalloc(cnn->columns, sizeof(float**));
|
cnn->d_weights[i] = (float***)nalloc(cnn->columns, sizeof(float**));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights[i] = (float***)nalloc(cnn->columns, sizeof(float**));
|
||||||
|
cnn->v_d_weights[i] = (float***)nalloc(cnn->columns, sizeof(float**));
|
||||||
|
#endif
|
||||||
for (int j=0; j < cnn->columns; j++) {
|
for (int j=0; j < cnn->columns; j++) {
|
||||||
cnn->weights[i][j] = (float**)nalloc(cnn->k_size, sizeof(float*));
|
cnn->weights[i][j] = (float**)nalloc(cnn->k_size, sizeof(float*));
|
||||||
cnn->d_weights[i][j] = (float**)nalloc(cnn->k_size, sizeof(float*));
|
cnn->d_weights[i][j] = (float**)nalloc(cnn->k_size, sizeof(float*));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights[i][j] = (float**)nalloc(cnn->k_size, sizeof(float*));
|
||||||
|
cnn->v_d_weights[i][j] = (float**)nalloc(cnn->k_size, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int k=0; k < cnn->k_size; k++) {
|
for (int k=0; k < cnn->k_size; k++) {
|
||||||
cnn->weights[i][j][k] = (float*)nalloc(cnn->k_size, sizeof(float));
|
cnn->weights[i][j][k] = (float*)nalloc(cnn->k_size, sizeof(float));
|
||||||
cnn->d_weights[i][j][k] = (float*)nalloc(cnn->k_size, sizeof(float));
|
cnn->d_weights[i][j][k] = (float*)nalloc(cnn->k_size, sizeof(float));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights[i][j][k] = (float*)nalloc(cnn->k_size, sizeof(float));
|
||||||
|
cnn->v_d_weights[i][j][k] = (float*)nalloc(cnn->k_size, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int l=0; l < cnn->k_size; l++) {
|
for (int l=0; l < cnn->k_size; l++) {
|
||||||
(void) !fread(&tmp, sizeof(tmp), 1, ptr);
|
(void) !fread(&tmp, sizeof(tmp), 1, ptr);
|
||||||
cnn->weights[i][j][k][l] = tmp;
|
cnn->weights[i][j][k][l] = tmp;
|
||||||
cnn->d_weights[i][j][k][l] = 0.;
|
cnn->d_weights[i][j][k][l] = 0.;
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
cnn->s_d_weights[i][j][k][l] = 0.;
|
||||||
|
cnn->v_d_weights[i][j][k][l] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -300,21 +336,41 @@ Kernel* read_kernel(int type_couche, int output_dim, FILE* ptr) {
|
|||||||
|
|
||||||
nn->bias = (float*)nalloc(nn->size_output, sizeof(float));
|
nn->bias = (float*)nalloc(nn->size_output, sizeof(float));
|
||||||
nn->d_bias = (float*)nalloc(nn->size_output, sizeof(float));
|
nn->d_bias = (float*)nalloc(nn->size_output, sizeof(float));
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
nn->s_d_bias = (float*)nalloc(nn->size_output, sizeof(float));
|
||||||
|
nn->v_d_bias = (float*)nalloc(nn->size_output, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int i=0; i < nn->size_output; i++) {
|
for (int i=0; i < nn->size_output; i++) {
|
||||||
(void) !fread(&tmp, sizeof(tmp), 1, ptr);
|
(void) !fread(&tmp, sizeof(tmp), 1, ptr);
|
||||||
nn->bias[i] = tmp;
|
nn->bias[i] = tmp;
|
||||||
nn->d_bias[i] = 0.;
|
nn->d_bias[i] = 0.;
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
nn->s_d_bias[i] = 0.;
|
||||||
|
nn->v_d_bias[i] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
nn->weights = (float**)nalloc(nn->size_input, sizeof(float*));
|
nn->weights = (float**)nalloc(nn->size_input, sizeof(float*));
|
||||||
nn->d_weights = (float**)nalloc(nn->size_input, sizeof(float*));
|
nn->d_weights = (float**)nalloc(nn->size_input, sizeof(float*));
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
nn->s_d_weights = (float**)nalloc(nn->size_input, sizeof(float*));
|
||||||
|
nn->v_d_weights = (float**)nalloc(nn->size_input, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int i=0; i < nn->size_input; i++) {
|
for (int i=0; i < nn->size_input; i++) {
|
||||||
nn->weights[i] = (float*)nalloc(nn->size_output, sizeof(float));
|
nn->weights[i] = (float*)nalloc(nn->size_output, sizeof(float));
|
||||||
nn->d_weights[i] = (float*)nalloc(nn->size_output, sizeof(float));
|
nn->d_weights[i] = (float*)nalloc(nn->size_output, sizeof(float));
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
nn->s_d_weights[i] = (float*)nalloc(nn->size_output, sizeof(float));
|
||||||
|
nn->v_d_weights[i] = (float*)nalloc(nn->size_output, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int j=0; j < nn->size_output; j++) {
|
for (int j=0; j < nn->size_output; j++) {
|
||||||
(void) !fread(&tmp, sizeof(tmp), 1, ptr);
|
(void) !fread(&tmp, sizeof(tmp), 1, ptr);
|
||||||
nn->weights[i][j] = tmp;
|
nn->weights[i][j] = tmp;
|
||||||
nn->d_weights[i][j] = 0.;
|
nn->d_weights[i][j] = 0.;
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
nn->s_d_weights[i][j] = 0.;
|
||||||
|
nn->v_d_weights[i][j] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (type_couche == POOLING) { // Cas du Pooling Layer
|
} else if (type_couche == POOLING) { // Cas du Pooling Layer
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
#include "include/update.h"
|
#include "include/update.h"
|
||||||
#include "include/struct.h"
|
#include "include/struct.h"
|
||||||
|
|
||||||
|
#include "include/config.h"
|
||||||
|
|
||||||
float clip(float a) {
|
float clip(float a) {
|
||||||
if (a > NETWORK_CLIP_VALUE) {
|
if (a > NETWORK_CLIP_VALUE) {
|
||||||
return NETWORK_CLIP_VALUE;
|
return NETWORK_CLIP_VALUE;
|
||||||
@ -34,7 +38,13 @@ void update_weights(Network* network, Network* d_network) {
|
|||||||
for (int b=0; b < output_depth; b++) {
|
for (int b=0; b < output_depth; b++) {
|
||||||
for (int c=0; c < k_size; c++) {
|
for (int c=0; c < k_size; c++) {
|
||||||
for (int d=0; d < k_size; d++) {
|
for (int d=0; d < k_size; d++) {
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
d_cnn->v_d_weights[a][b][c][d] = BETA_1*d_cnn->v_d_weights[a][b][c][d] + (1-BETA_1)*d_cnn->d_weights[a][b][c][d];
|
||||||
|
d_cnn->s_d_weights[a][b][c][d] = BETA_2*d_cnn->s_d_weights[a][b][c][d] + (1-BETA_2)*d_cnn->d_weights[a][b][c][d]*d_cnn->d_weights[a][b][c][d];
|
||||||
|
cnn->weights[a][b][c][d] -= ALPHA*(d_cnn->v_d_weights[a][b][c][d]/sqrt(d_cnn->s_d_weights[a][b][c][d]+Epsilon));
|
||||||
|
#else
|
||||||
cnn->weights[a][b][c][d] -= network->learning_rate * d_cnn->d_weights[a][b][c][d];
|
cnn->weights[a][b][c][d] -= network->learning_rate * d_cnn->d_weights[a][b][c][d];
|
||||||
|
#endif
|
||||||
d_cnn->d_weights[a][b][c][d] = 0;
|
d_cnn->d_weights[a][b][c][d] = 0;
|
||||||
|
|
||||||
cnn->weights[a][b][c][d] = clip(cnn->weights[a][b][c][d]);
|
cnn->weights[a][b][c][d] = clip(cnn->weights[a][b][c][d]);
|
||||||
@ -49,7 +59,13 @@ void update_weights(Network* network, Network* d_network) {
|
|||||||
|
|
||||||
for (int a=0; a < input_width; a++) {
|
for (int a=0; a < input_width; a++) {
|
||||||
for (int b=0; b < output_width; b++) {
|
for (int b=0; b < output_width; b++) {
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
d_nn->v_d_weights[a][b] = BETA_1*d_nn->v_d_weights[a][b] + (1-BETA_1)*d_nn->d_weights[a][b];
|
||||||
|
d_nn->s_d_weights[a][b] = BETA_2*d_nn->s_d_weights[a][b] + (1-BETA_2)*d_nn->d_weights[a][b]*d_nn->d_weights[a][b];
|
||||||
|
nn->weights[a][b] -= ALPHA*(d_nn->v_d_weights[a][b]/sqrt(d_nn->s_d_weights[a][b]+Epsilon));
|
||||||
|
#else
|
||||||
nn->weights[a][b] -= network->learning_rate * d_nn->d_weights[a][b];
|
nn->weights[a][b] -= network->learning_rate * d_nn->d_weights[a][b];
|
||||||
|
#endif
|
||||||
d_nn->d_weights[a][b] = 0;
|
d_nn->d_weights[a][b] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -61,7 +77,13 @@ void update_weights(Network* network, Network* d_network) {
|
|||||||
|
|
||||||
for (int a=0; a < size_input; a++) {
|
for (int a=0; a < size_input; a++) {
|
||||||
for (int b=0; b < output_width; b++) {
|
for (int b=0; b < output_width; b++) {
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
d_nn->v_d_weights[a][b] = BETA_1*d_nn->v_d_weights[a][b] + (1-BETA_1)*d_nn->d_weights[a][b];
|
||||||
|
d_nn->s_d_weights[a][b] = BETA_2*d_nn->s_d_weights[a][b] + (1-BETA_2)*d_nn->d_weights[a][b]*d_nn->d_weights[a][b];
|
||||||
|
nn->weights[a][b] -= ALPHA*(d_nn->d_weights[a][b]/sqrt(d_nn->s_d_weights[a][b]+Epsilon));
|
||||||
|
#else
|
||||||
nn->weights[a][b] -= network->learning_rate * d_nn->d_weights[a][b];
|
nn->weights[a][b] -= network->learning_rate * d_nn->d_weights[a][b];
|
||||||
|
#endif
|
||||||
d_nn->d_weights[a][b] = 0;
|
d_nn->d_weights[a][b] = 0;
|
||||||
|
|
||||||
nn->weights[a][b] = clip(nn->weights[a][b]);
|
nn->weights[a][b] = clip(nn->weights[a][b]);
|
||||||
@ -89,7 +111,12 @@ void update_bias(Network* network, Network* d_network) {
|
|||||||
for (int a=0; a < output_depth; a++) {
|
for (int a=0; a < output_depth; a++) {
|
||||||
for (int b=0; b < output_width; b++) {
|
for (int b=0; b < output_width; b++) {
|
||||||
for (int c=0; c < output_width; c++) {
|
for (int c=0; c < output_width; c++) {
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
d_cnn->s_d_bias[a][b][c] = BETA_2*d_cnn->s_d_bias[a][b][c] + (1-BETA_2)*d_cnn->d_bias[a][b][c]*d_cnn->d_bias[a][b][c];
|
||||||
|
cnn->bias[a][b][c] -= ALPHA*(d_cnn->d_bias[a][b][c]/sqrt(d_cnn->s_d_bias[a][b][c]+Epsilon));
|
||||||
|
#else
|
||||||
cnn->bias[a][b][c] -= network->learning_rate * d_cnn->d_bias[a][b][c];
|
cnn->bias[a][b][c] -= network->learning_rate * d_cnn->d_bias[a][b][c];
|
||||||
|
#endif
|
||||||
d_cnn->d_bias[a][b][c] = 0;
|
d_cnn->d_bias[a][b][c] = 0;
|
||||||
|
|
||||||
cnn->bias[a][b][c] = clip(cnn->bias[a][b][c]);
|
cnn->bias[a][b][c] = clip(cnn->bias[a][b][c]);
|
||||||
@ -101,7 +128,12 @@ void update_bias(Network* network, Network* d_network) {
|
|||||||
Kernel_nn* d_nn = dk_i->nn;
|
Kernel_nn* d_nn = dk_i->nn;
|
||||||
|
|
||||||
for (int a=0; a < output_width; a++) {
|
for (int a=0; a < output_width; a++) {
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
d_nn->s_d_bias[a] = BETA_2*d_nn->s_d_bias[a] + (1-BETA_2)*d_nn->d_bias[a]*d_nn->d_bias[a];
|
||||||
|
nn->bias[a] -= ALPHA*(d_nn->d_bias[a]/sqrt(d_nn->s_d_bias[a]+Epsilon));
|
||||||
|
#else
|
||||||
nn->bias[a] -= network->learning_rate * d_nn->d_bias[a];
|
nn->bias[a] -= network->learning_rate * d_nn->d_bias[a];
|
||||||
|
#endif
|
||||||
d_nn->d_bias[a] = 0;
|
d_nn->d_bias[a] = 0;
|
||||||
|
|
||||||
nn->bias[a] = clip(nn->bias[a]);
|
nn->bias[a] = clip(nn->bias[a]);
|
||||||
|
@ -148,19 +148,39 @@ Network* copy_network(Network* network) {
|
|||||||
|
|
||||||
network_cp->kernel[i]->nn->bias = (float*)nalloc(size_output, sizeof(float));
|
network_cp->kernel[i]->nn->bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
network_cp->kernel[i]->nn->d_bias = (float*)nalloc(size_output, sizeof(float));
|
network_cp->kernel[i]->nn->d_bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
network_cp->kernel[i]->nn->s_d_bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
network_cp->kernel[i]->nn->v_d_bias = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int j=0; j < size_output; j++) {
|
for (int j=0; j < size_output; j++) {
|
||||||
copyVar(kernel[i]->nn->bias[j]);
|
copyVar(kernel[i]->nn->bias[j]);
|
||||||
network_cp->kernel[i]->nn->d_bias[j] = 0.;
|
network_cp->kernel[i]->nn->d_bias[j] = 0.;
|
||||||
|
#ifdef ADAM_DENSE_BIAS
|
||||||
|
network_cp->kernel[i]->nn->s_d_bias[j] = 0.;
|
||||||
|
network_cp->kernel[i]->nn->v_d_bias[j] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
network_cp->kernel[i]->nn->weights = (float**)nalloc(size_input, sizeof(float*));
|
network_cp->kernel[i]->nn->weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
network_cp->kernel[i]->nn->d_weights = (float**)nalloc(size_input, sizeof(float*));
|
network_cp->kernel[i]->nn->d_weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
network_cp->kernel[i]->nn->s_d_weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
|
network_cp->kernel[i]->nn->v_d_weights = (float**)nalloc(size_input, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int j=0; j < size_input; j++) {
|
for (int j=0; j < size_input; j++) {
|
||||||
network_cp->kernel[i]->nn->weights[j] = (float*)nalloc(size_output, sizeof(float));
|
network_cp->kernel[i]->nn->weights[j] = (float*)nalloc(size_output, sizeof(float));
|
||||||
network_cp->kernel[i]->nn->d_weights[j] = (float*)nalloc(size_output, sizeof(float));
|
network_cp->kernel[i]->nn->d_weights[j] = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
network_cp->kernel[i]->nn->s_d_weights[j] = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
network_cp->kernel[i]->nn->v_d_weights[j] = (float*)nalloc(size_output, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int k=0; k < size_output; k++) {
|
for (int k=0; k < size_output; k++) {
|
||||||
copyVar(kernel[i]->nn->weights[j][k]);
|
copyVar(kernel[i]->nn->weights[j][k]);
|
||||||
network_cp->kernel[i]->nn->d_weights[j][k] = 0.;
|
network_cp->kernel[i]->nn->d_weights[j][k] = 0.;
|
||||||
|
#ifdef ADAM_DENSE_WEIGHTS
|
||||||
|
network_cp->kernel[i]->nn->s_d_weights[j][k] = 0.;
|
||||||
|
network_cp->kernel[i]->nn->v_d_weights[j][k] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -184,33 +204,69 @@ Network* copy_network(Network* network) {
|
|||||||
|
|
||||||
network_cp->kernel[i]->cnn->bias = (float***)nalloc(columns, sizeof(float**));
|
network_cp->kernel[i]->cnn->bias = (float***)nalloc(columns, sizeof(float**));
|
||||||
network_cp->kernel[i]->cnn->d_bias = (float***)nalloc(columns, sizeof(float**));
|
network_cp->kernel[i]->cnn->d_bias = (float***)nalloc(columns, sizeof(float**));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
network_cp->kernel[i]->cnn->s_d_bias = (float***)nalloc(columns, sizeof(float**));
|
||||||
|
network_cp->kernel[i]->cnn->v_d_bias = (float***)nalloc(columns, sizeof(float**));
|
||||||
|
#endif
|
||||||
for (int j=0; j < columns; j++) {
|
for (int j=0; j < columns; j++) {
|
||||||
network_cp->kernel[i]->cnn->bias[j] = (float**)nalloc(output_dim, sizeof(float*));
|
network_cp->kernel[i]->cnn->bias[j] = (float**)nalloc(output_dim, sizeof(float*));
|
||||||
network_cp->kernel[i]->cnn->d_bias[j] = (float**)nalloc(output_dim, sizeof(float*));
|
network_cp->kernel[i]->cnn->d_bias[j] = (float**)nalloc(output_dim, sizeof(float*));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
network_cp->kernel[i]->cnn->s_d_bias[j] = (float**)nalloc(output_dim, sizeof(float*));
|
||||||
|
network_cp->kernel[i]->cnn->v_d_bias[j] = (float**)nalloc(output_dim, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int k=0; k < output_dim; k++) {
|
for (int k=0; k < output_dim; k++) {
|
||||||
network_cp->kernel[i]->cnn->bias[j][k] = (float*)nalloc(output_dim, sizeof(float));
|
network_cp->kernel[i]->cnn->bias[j][k] = (float*)nalloc(output_dim, sizeof(float));
|
||||||
network_cp->kernel[i]->cnn->d_bias[j][k] = (float*)nalloc(output_dim, sizeof(float));
|
network_cp->kernel[i]->cnn->d_bias[j][k] = (float*)nalloc(output_dim, sizeof(float));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
network_cp->kernel[i]->cnn->s_d_bias[j][k] = (float*)nalloc(output_dim, sizeof(float));
|
||||||
|
network_cp->kernel[i]->cnn->v_d_bias[j][k] = (float*)nalloc(output_dim, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int l=0; l < output_dim; l++) {
|
for (int l=0; l < output_dim; l++) {
|
||||||
copyVar(kernel[i]->cnn->bias[j][k][l]);
|
copyVar(kernel[i]->cnn->bias[j][k][l]);
|
||||||
network_cp->kernel[i]->cnn->d_bias[j][k][l] = 0.;
|
network_cp->kernel[i]->cnn->d_bias[j][k][l] = 0.;
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
network_cp->kernel[i]->cnn->s_d_bias[j][k][l] = 0.;
|
||||||
|
network_cp->kernel[i]->cnn->v_d_bias[j][k][l] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
network_cp->kernel[i]->cnn->weights = (float****)nalloc(rows, sizeof(float***));
|
network_cp->kernel[i]->cnn->weights = (float****)nalloc(rows, sizeof(float***));
|
||||||
network_cp->kernel[i]->cnn->d_weights = (float****)nalloc(rows, sizeof(float***));
|
network_cp->kernel[i]->cnn->d_weights = (float****)nalloc(rows, sizeof(float***));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
network_cp->kernel[i]->cnn->s_d_weights = (float****)nalloc(rows, sizeof(float***));
|
||||||
|
network_cp->kernel[i]->cnn->v_d_weights = (float****)nalloc(rows, sizeof(float***));
|
||||||
|
#endif
|
||||||
for (int j=0; j < rows; j++) {
|
for (int j=0; j < rows; j++) {
|
||||||
network_cp->kernel[i]->cnn->weights[j] = (float***)nalloc(columns, sizeof(float**));
|
network_cp->kernel[i]->cnn->weights[j] = (float***)nalloc(columns, sizeof(float**));
|
||||||
network_cp->kernel[i]->cnn->d_weights[j] = (float***)nalloc(columns, sizeof(float**));
|
network_cp->kernel[i]->cnn->d_weights[j] = (float***)nalloc(columns, sizeof(float**));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
network_cp->kernel[i]->cnn->s_d_weights[j] = (float***)nalloc(columns, sizeof(float**));
|
||||||
|
network_cp->kernel[i]->cnn->v_d_weights[j] = (float***)nalloc(columns, sizeof(float**));
|
||||||
|
#endif
|
||||||
for (int k=0; k < columns; k++) {
|
for (int k=0; k < columns; k++) {
|
||||||
network_cp->kernel[i]->cnn->weights[j][k] = (float**)nalloc(k_size, sizeof(float*));
|
network_cp->kernel[i]->cnn->weights[j][k] = (float**)nalloc(k_size, sizeof(float*));
|
||||||
network_cp->kernel[i]->cnn->d_weights[j][k] = (float**)nalloc(k_size, sizeof(float*));
|
network_cp->kernel[i]->cnn->d_weights[j][k] = (float**)nalloc(k_size, sizeof(float*));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
network_cp->kernel[i]->cnn->s_d_weights[j][k] = (float**)nalloc(k_size, sizeof(float*));
|
||||||
|
network_cp->kernel[i]->cnn->v_d_weights[j][k] = (float**)nalloc(k_size, sizeof(float*));
|
||||||
|
#endif
|
||||||
for (int l=0; l < k_size; l++) {
|
for (int l=0; l < k_size; l++) {
|
||||||
network_cp->kernel[i]->cnn->weights[j][k][l] = (float*)nalloc(k_size, sizeof(float));
|
network_cp->kernel[i]->cnn->weights[j][k][l] = (float*)nalloc(k_size, sizeof(float));
|
||||||
network_cp->kernel[i]->cnn->d_weights[j][k][l] = (float*)nalloc(k_size, sizeof(float));
|
network_cp->kernel[i]->cnn->d_weights[j][k][l] = (float*)nalloc(k_size, sizeof(float));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
network_cp->kernel[i]->cnn->s_d_weights[j][k][l] = (float*)nalloc(k_size, sizeof(float));
|
||||||
|
network_cp->kernel[i]->cnn->v_d_weights[j][k][l] = (float*)nalloc(k_size, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int m=0; m < k_size; m++) {
|
for (int m=0; m < k_size; m++) {
|
||||||
copyVar(kernel[i]->cnn->weights[j][k][l][m]);
|
copyVar(kernel[i]->cnn->weights[j][k][l][m]);
|
||||||
network_cp->kernel[i]->cnn->d_weights[j][k][l][m] = 0.;
|
network_cp->kernel[i]->cnn->d_weights[j][k][l][m] = 0.;
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
network_cp->kernel[i]->cnn->s_d_weights[j][k][l][m] = 0.;
|
||||||
|
network_cp->kernel[i]->cnn->v_d_weights[j][k][l][m] = 0.;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
//! This file uses an old implementation of convolution which uses linearised matrices
|
||||||
|
//! It is therefore not compatible nor compilable now.
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@ -114,17 +116,33 @@ void run_convolution_test(int input_dim, int output_dim, int rows, int columns)
|
|||||||
// bias[kernel->columns]
|
// bias[kernel->columns]
|
||||||
kernel->bias = (float*)malloc(kernel->columns, sizeof(float));
|
kernel->bias = (float*)malloc(kernel->columns, sizeof(float));
|
||||||
kernel->d_bias = (float*)malloc(kernel->columns, sizeof(float));
|
kernel->d_bias = (float*)malloc(kernel->columns, sizeof(float));
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
kernel->s_d_bias = (float*)malloc(kernel->columns, sizeof(float));
|
||||||
|
kernel->v_d_bias = (float*)malloc(kernel->columns, sizeof(float));
|
||||||
|
#endif
|
||||||
for (int i=0; i<kernel->columns; i++) {
|
for (int i=0; i<kernel->columns; i++) {
|
||||||
kernel->bias[i] = random_float(0.0f, 15.0f);
|
kernel->bias[i] = random_float(0.0f, 15.0f);
|
||||||
kernel->d_bias[i] = random_float(0.0f, 1.5f);
|
kernel->d_bias[i] = random_float(0.0f, 1.5f);
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
kernel->s_d_bias[i] = random_float(0.0f, 1.5f);
|
||||||
|
kernel->v_d_bias[i] = random_float(0.0f, 1.5f);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// weights[rows][columns][k_size][k_size]
|
// weights[rows][columns][k_size][k_size]
|
||||||
kernel->weights = (float****)malloc(sizeof(float***)*kernel->rows);
|
kernel->weights = (float****)malloc(sizeof(float***)*kernel->rows);
|
||||||
kernel->d_weights = (float****)malloc(sizeof(float***)*kernel->rows);
|
kernel->d_weights = (float****)malloc(sizeof(float***)*kernel->rows);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
kernel->s_d_weights = (float****)malloc(sizeof(float***)*kernel->rows);
|
||||||
|
kernel->v_d_weights = (float****)malloc(sizeof(float***)*kernel->rows);
|
||||||
|
#endif
|
||||||
for (int i=0; i < kernel->rows; i++) {
|
for (int i=0; i < kernel->rows; i++) {
|
||||||
kernel->weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 15.0f);
|
kernel->weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 15.0f);
|
||||||
kernel->d_weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 1.5f);
|
kernel->d_weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 1.5f);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
kernel->s_d_weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 1.5f);
|
||||||
|
kernel->v_d_weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 1.5f);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
float*** input = create_matrix(kernel->rows, input_dim, input_dim, 5.0f);
|
float*** input = create_matrix(kernel->rows, input_dim, input_dim, 5.0f);
|
||||||
@ -162,13 +180,25 @@ void run_convolution_test(int input_dim, int output_dim, int rows, int columns)
|
|||||||
|
|
||||||
free(kernel->bias);
|
free(kernel->bias);
|
||||||
free(kernel->d_bias);
|
free(kernel->d_bias);
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
free(kernel->s_d_bias);
|
||||||
|
free(kernel->v_d_bias);
|
||||||
|
#endif
|
||||||
|
|
||||||
for (int i=0; i < kernel->rows; i++) {
|
for (int i=0; i < kernel->rows; i++) {
|
||||||
free_matrix(kernel->weights[i], kernel->columns, kernel->k_size);
|
free_matrix(kernel->weights[i], kernel->columns, kernel->k_size);
|
||||||
free_matrix(kernel->d_weights[i], kernel->columns, kernel->k_size);
|
free_matrix(kernel->d_weights[i], kernel->columns, kernel->k_size);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
free_matrix(kernel->s_d_weights[i], kernel->columns, kernel->k_size);
|
||||||
|
free_matrix(kernel->v_d_weights[i], kernel->columns, kernel->k_size);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
free(kernel->weights);
|
free(kernel->weights);
|
||||||
free(kernel->d_weights);
|
free(kernel->d_weights);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
free(kernel->s_d_weights);
|
||||||
|
free(kernel->v_d_weights);
|
||||||
|
#endif
|
||||||
|
|
||||||
free_matrix(input, kernel->rows, input_dim);
|
free_matrix(input, kernel->rows, input_dim);
|
||||||
free_matrix(output_cpu, kernel->columns, output_dim);
|
free_matrix(output_cpu, kernel->columns, output_dim);
|
||||||
|
@ -107,13 +107,25 @@ void run_convolution_test(int input_dim, int output_dim, int rows, int columns)
|
|||||||
// bias[kernel->columns][dim_output][dim_output]
|
// bias[kernel->columns][dim_output][dim_output]
|
||||||
kernel->bias = create_matrix(kernel->columns, output_dim, output_dim, 15.0f);
|
kernel->bias = create_matrix(kernel->columns, output_dim, output_dim, 15.0f);
|
||||||
kernel->d_bias = create_matrix(kernel->columns, output_dim, output_dim, 1.5f);
|
kernel->d_bias = create_matrix(kernel->columns, output_dim, output_dim, 1.5f);
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
kernel->s_d_bias = create_matrix(kernel->columns, output_dim, output_dim, 1.5f);
|
||||||
|
kernel->v_d_bias = create_matrix(kernel->columns, output_dim, output_dim, 1.5f);
|
||||||
|
#endif
|
||||||
|
|
||||||
// weights[rows][columns][k_size][k_size]
|
// weights[rows][columns][k_size][k_size]
|
||||||
kernel->weights = (float****)nalloc(kernel->rows, sizeof(float***));
|
kernel->weights = (float****)nalloc(kernel->rows, sizeof(float***));
|
||||||
kernel->d_weights = (float****)nalloc(kernel->rows, sizeof(float***));
|
kernel->d_weights = (float****)nalloc(kernel->rows, sizeof(float***));
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
kernel->s_d_weights = (float****)nalloc(kernel->rows, sizeof(float***));
|
||||||
|
kernel->v_d_weights = (float****)nalloc(kernel->rows, sizeof(float***));
|
||||||
|
#endif
|
||||||
for (int i=0; i < kernel->rows; i++) {
|
for (int i=0; i < kernel->rows; i++) {
|
||||||
kernel->weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 15.0f);
|
kernel->weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 15.0f);
|
||||||
kernel->d_weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 1.5f);
|
kernel->d_weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 1.5f);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
kernel->s_d_weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 1.5f);
|
||||||
|
kernel->v_d_weights[i] = create_matrix(kernel->columns, kernel->k_size, kernel->k_size, 1.5f);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
float*** input = create_matrix(kernel->rows, input_dim, input_dim, 5.0f);
|
float*** input = create_matrix(kernel->rows, input_dim, input_dim, 5.0f);
|
||||||
@ -152,13 +164,25 @@ void run_convolution_test(int input_dim, int output_dim, int rows, int columns)
|
|||||||
|
|
||||||
free_matrix(kernel->bias, kernel->columns, output_dim);
|
free_matrix(kernel->bias, kernel->columns, output_dim);
|
||||||
free_matrix(kernel->d_bias, kernel->columns, output_dim);
|
free_matrix(kernel->d_bias, kernel->columns, output_dim);
|
||||||
|
#ifdef ADAM_CNN_BIAS
|
||||||
|
free_matrix(kernel->s_d_bias, kernel->columns, output_dim);
|
||||||
|
free_matrix(kernel->v_d_bias, kernel->columns, output_dim);
|
||||||
|
#endif
|
||||||
|
|
||||||
for (int i=0; i < kernel->rows; i++) {
|
for (int i=0; i < kernel->rows; i++) {
|
||||||
free_matrix(kernel->weights[i], kernel->columns, kernel->k_size);
|
free_matrix(kernel->weights[i], kernel->columns, kernel->k_size);
|
||||||
free_matrix(kernel->d_weights[i], kernel->columns, kernel->k_size);
|
free_matrix(kernel->d_weights[i], kernel->columns, kernel->k_size);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
free_matrix(kernel->s_d_weights[i], kernel->columns, kernel->k_size);
|
||||||
|
free_matrix(kernel->v_d_weights[i], kernel->columns, kernel->k_size);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
gree(kernel->weights);
|
gree(kernel->weights);
|
||||||
gree(kernel->d_weights);
|
gree(kernel->d_weights);
|
||||||
|
#ifdef ADAM_CNN_WEIGHTS
|
||||||
|
gree(kernel->s_d_weights);
|
||||||
|
gree(kernel->v_d_weights);
|
||||||
|
#endif
|
||||||
|
|
||||||
free_matrix(input, kernel->rows, input_dim);
|
free_matrix(input, kernel->rows, input_dim);
|
||||||
free_matrix(output_cpu, kernel->columns, output_dim);
|
free_matrix(output_cpu, kernel->columns, output_dim);
|
||||||
|
@ -5,10 +5,19 @@
|
|||||||
#include "../src/include/memory_management.h"
|
#include "../src/include/memory_management.h"
|
||||||
#include "../src/cnn/include/function.h"
|
#include "../src/cnn/include/function.h"
|
||||||
#include "../src/include/colors.h"
|
#include "../src/include/colors.h"
|
||||||
|
#include "../src/include/utils.h"
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
printf("Initialisation\n");
|
printf("Checking CUDA compatibility.\n");
|
||||||
|
bool cuda_compatible = check_cuda_compatibility();
|
||||||
|
if (!cuda_compatible) {
|
||||||
|
printf(RED "CUDA not compatible, skipping tests.\n" RESET);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf(GREEN "OK\n" RESET);
|
||||||
|
|
||||||
|
printf("Initialisation OK\n");
|
||||||
// Initialise values
|
// Initialise values
|
||||||
int depth = 10;
|
int depth = 10;
|
||||||
int rows = 10;
|
int rows = 10;
|
||||||
|
@ -17,6 +17,14 @@ __global__ void check_access(int* array, int range) {
|
|||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
printf("Checking CUDA compatibility.\n");
|
||||||
|
bool cuda_compatible = check_cuda_compatibility();
|
||||||
|
if (!cuda_compatible) {
|
||||||
|
printf(RED "CUDA not compatible, skipping tests.\n" RESET);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
printf(GREEN "OK\n" RESET);
|
||||||
|
|
||||||
printf("Pollution de la mémoire\n");
|
printf("Pollution de la mémoire\n");
|
||||||
int mem_used;
|
int mem_used;
|
||||||
int blocks_used;
|
int blocks_used;
|
||||||
|
Loading…
Reference in New Issue
Block a user