tipe/src/cnn/free.c

120 lines
3.2 KiB
C
Raw Normal View History

2022-07-05 08:13:25 +02:00
#include <stdlib.h>
#include <stdio.h>
2022-09-16 14:53:35 +02:00
#include "include/free.h"
2022-07-05 08:13:25 +02:00
void free_a_cube_input_layer(Network* network, int pos, int depth, int dim) {
for (int i=0; i < depth; i++) {
for (int j=0; j < dim; j++) {
2022-07-05 08:13:25 +02:00
free(network->input[pos][i][j]);
}
free(network->input[pos][i]);
}
free(network->input[pos]);
}
void free_a_line_input_layer(Network* network, int pos) {
free(network->input[pos][0][0]);
free(network->input[pos][0]);
free(network->input[pos]);
}
2022-10-02 16:16:14 +02:00
void free_2d_average_pooling(Network* network, int pos) {
free_a_cube_input_layer(network, pos+1, network->depth[pos-1], network->width[pos-1]/2);
2022-07-05 08:13:25 +02:00
}
void free_convolution(Network* network, int pos) {
2022-10-02 16:16:14 +02:00
Kernel_cnn* k_pos = network->kernel[pos]->cnn;
int c = k_pos->columns;
int k_size = k_pos->k_size;
int r = k_pos->rows;
int bias_size = network->width[pos-1]-k_size+1; // Not sure of the value
free_a_cube_input_layer(network, pos+1, c, bias_size);
for (int i=0; i < c; i++) {
2022-10-02 16:16:14 +02:00
for (int j=0; j < bias_size; j++) {
free(k_pos->bias[i][j]);
free(k_pos->d_bias[i][j]);
2022-07-05 08:13:25 +02:00
}
2022-10-02 16:16:14 +02:00
free(k_pos->bias[i]);
free(k_pos->d_bias[i]);
2022-07-05 08:13:25 +02:00
}
2022-10-02 16:16:14 +02:00
free(k_pos->bias);
free(k_pos->d_bias);
2022-07-05 08:13:25 +02:00
for (int i=0; i < r; i++) {
for (int j=0; j < c; j++) {
for (int k=0; k < k_size; k++) {
2022-10-02 16:16:14 +02:00
free(k_pos->w[i][j][k]);
free(k_pos->d_w[i][j][k]);
2022-07-05 08:13:25 +02:00
}
2022-10-02 16:16:14 +02:00
free(k_pos->w[i][j]);
free(k_pos->d_w[i][j]);
2022-07-05 08:13:25 +02:00
}
2022-10-02 16:16:14 +02:00
free(k_pos->w[i]);
free(k_pos->d_w[i]);
2022-07-05 08:13:25 +02:00
}
2022-10-02 16:16:14 +02:00
free(k_pos->w);
free(k_pos->d_w);
2022-07-05 08:13:25 +02:00
2022-10-02 16:16:14 +02:00
free(k_pos);
2022-07-05 08:13:25 +02:00
}
void free_dense(Network* network, int pos) {
2022-10-02 16:16:14 +02:00
free_a_line_input_layer(network, pos+1);
Kernel_nn* k_pos = network->kernel[pos]->nn;
int dim = k_pos->input_units;
for (int i=0; i < dim; i++) {
2022-10-02 16:16:14 +02:00
free(k_pos->weights[i]);
free(k_pos->d_weights[i]);
2022-07-05 08:13:25 +02:00
}
2022-10-02 16:16:14 +02:00
free(k_pos->weights);
free(k_pos->d_weights);
2022-07-05 08:13:25 +02:00
2022-10-02 16:16:14 +02:00
free(k_pos->bias);
free(k_pos->d_bias);
2022-07-05 08:13:25 +02:00
2022-10-02 16:16:14 +02:00
free(k_pos);
}
void free_dense_linearisation(Network* network, int pos) {
free_a_line_input_layer(network, pos+1);
Kernel_nn* k_pos = network->kernel[pos]->nn;
int dim = k_pos->input_units;
for (int i=0; i < dim; i++) {
free(k_pos->weights[i]);
free(k_pos->d_weights[i]);
}
free(k_pos->weights);
free(k_pos->d_weights);
free(k_pos->bias);
free(k_pos->d_bias);
free(k_pos);
2022-07-05 08:13:25 +02:00
}
void free_network_creation(Network* network) {
2022-09-12 17:56:44 +02:00
free_a_cube_input_layer(network, 0, network->depth[0], network->width[0]);
2022-10-02 16:16:14 +02:00
for (int i=0; i<network->max_size; i++)
free(network->kernel[i]);
2022-09-28 10:14:20 +02:00
free(network->width);
free(network->depth);
2022-07-05 08:13:25 +02:00
free(network->kernel);
free(network->input);
free(network);
}
void free_network_lenet5(Network* network) {
free_dense(network, 6);
free_dense(network, 5);
2022-10-02 16:16:14 +02:00
free_dense_linearisation(network, 4);
free_average_pooling(network, 3);
2022-07-05 08:13:25 +02:00
free_convolution(network, 2);
free_average_pooling(network, 1);
free_convolution(network, 0);
free_network_creation(network);
if (network->size != network->max_size) {
2022-09-26 18:00:31 +02:00
printf("033[33;1m[WARNING]\033[0m Le réseau LeNet5 est incomplet");
2022-07-05 08:13:25 +02:00
}
}