mirror of
https://github.com/augustin64/projet-tipe
synced 2025-01-24 07:36:24 +01:00
First results in backprop ?
This commit is contained in:
parent
c73d4d5b90
commit
d94f61bb77
@ -10,7 +10,6 @@ void make_average_pooling(float*** input, float*** output, int size, int output_
|
|||||||
// output[output_depth][output_dim][output_dim]
|
// output[output_depth][output_dim][output_dim]
|
||||||
float average;
|
float average;
|
||||||
int n = size*size;
|
int n = size*size;
|
||||||
|
|
||||||
for (int i=0; i < output_depth; i++) {
|
for (int i=0; i < output_depth; i++) {
|
||||||
for (int j=0; j < output_dim; j++) {
|
for (int j=0; j < output_dim; j++) {
|
||||||
for (int k=0; k < output_dim; k++) {
|
for (int k=0; k < output_dim; k++) {
|
||||||
@ -20,7 +19,7 @@ void make_average_pooling(float*** input, float*** output, int size, int output_
|
|||||||
average += input[i][size*j +a][size*k +b];
|
average += input[i][size*j +a][size*k +b];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
output[i][j][k] = average/n;
|
output[i][j][k] = average/(float)n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "../include/colors.h"
|
#include "../include/colors.h"
|
||||||
#include "include/function.h"
|
#include "include/function.h"
|
||||||
#include "include/creation.h"
|
#include "include/creation.h"
|
||||||
|
#include "include/update.h"
|
||||||
#include "include/utils.h"
|
#include "include/utils.h"
|
||||||
#include "include/free.h"
|
#include "include/free.h"
|
||||||
#include "include/cnn.h"
|
#include "include/cnn.h"
|
||||||
@ -45,14 +46,20 @@ void* train_thread(void* parameters) {
|
|||||||
int start = param->start;
|
int start = param->start;
|
||||||
int nb_images = param->nb_images;
|
int nb_images = param->nb_images;
|
||||||
float accuracy = 0.;
|
float accuracy = 0.;
|
||||||
|
int cpt=1;
|
||||||
for (int i=start; i < start+nb_images; i++) {
|
for (int i=start; i < start+nb_images; i++) {
|
||||||
if (dataset_type == 0) {
|
if (dataset_type == 0) {
|
||||||
write_image_in_network_32(images[i], height, width, network->input[0][0]);
|
write_image_in_network_32(images[i], height, width, network->input[0][0]);
|
||||||
forward_propagation(network);
|
forward_propagation(network);
|
||||||
|
maxi = indice_max(network, 10);
|
||||||
backward_propagation(network, labels[i]);
|
backward_propagation(network, labels[i]);
|
||||||
|
if (cpt==16) { // Update the network
|
||||||
maxi = indice_max(network->input[network->size-1][0][0], network->width[network->size-1]);
|
printf("a\n");
|
||||||
|
update_weights(network);
|
||||||
|
update_bias(network);
|
||||||
|
cpt = 0;
|
||||||
|
}
|
||||||
|
cpt++;
|
||||||
if (maxi == labels[i]) {
|
if (maxi == labels[i]) {
|
||||||
accuracy += 1.;
|
accuracy += 1.;
|
||||||
}
|
}
|
||||||
|
@ -2,22 +2,25 @@
|
|||||||
#include "include/update.h"
|
#include "include/update.h"
|
||||||
#include "include/struct.h"
|
#include "include/struct.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void update_weights(Network* network) {
|
void update_weights(Network* network) {
|
||||||
int n = network->size;
|
int n = network->size;
|
||||||
int input_depth, input_width, output_depth, output_width;
|
int input_depth, input_width, output_depth, output_width, k_size;
|
||||||
Kernel* k_i;
|
Kernel* k_i;
|
||||||
Kernel* k_i_1;
|
|
||||||
for (int i=0; i<(n-1); i++) {
|
for (int i=0; i<(n-1); i++) {
|
||||||
k_i = network->kernel[i];
|
k_i = network->kernel[i];
|
||||||
k_i_1 = network->kernel[i+1];
|
|
||||||
input_depth = network->depth[i];
|
input_depth = network->depth[i];
|
||||||
input_width = network->width[i];
|
input_width = network->width[i];
|
||||||
output_depth = network->depth[i+1];
|
output_depth = network->depth[i+1];
|
||||||
output_width = network->width[i+1];
|
output_width = network->width[i+1];
|
||||||
|
|
||||||
if (k_i->cnn) { // Convolution
|
if (k_i->cnn) { // Convolution
|
||||||
Kernel_cnn* cnn = k_i_1->cnn;
|
Kernel_cnn* cnn = k_i->cnn; // ERRORS
|
||||||
int k_size = cnn->k_size;
|
k_size = cnn->k_size;
|
||||||
for (int a=0; a<input_depth; a++) {
|
for (int a=0; a<input_depth; a++) {
|
||||||
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++) {
|
||||||
@ -30,7 +33,7 @@ void update_weights(Network* network) {
|
|||||||
}
|
}
|
||||||
} else if (k_i->nn) { // Full connection
|
} else if (k_i->nn) { // Full connection
|
||||||
if (input_depth==1) { // Vecteur -> Vecteur
|
if (input_depth==1) { // Vecteur -> Vecteur
|
||||||
Kernel_nn* nn = k_i_1->nn;
|
Kernel_nn* nn = k_i->nn;
|
||||||
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++) {
|
||||||
nn->weights[a][b] += network->learning_rate * nn->d_weights[a][b];
|
nn->weights[a][b] += network->learning_rate * nn->d_weights[a][b];
|
||||||
@ -38,7 +41,7 @@ void update_weights(Network* network) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else { // Matrice -> vecteur
|
} else { // Matrice -> vecteur
|
||||||
Kernel_nn* nn = k_i_1->nn;
|
Kernel_nn* nn = k_i->nn;
|
||||||
int input_size = input_width*input_width*input_depth;
|
int input_size = input_width*input_width*input_depth;
|
||||||
for (int a=0; a<input_size; a++) {
|
for (int a=0; a<input_size; a++) {
|
||||||
for (int b=0; b<output_width; b++) {
|
for (int b=0; b<output_width; b++) {
|
||||||
@ -57,15 +60,13 @@ void update_bias(Network* network) {
|
|||||||
int n = network->size;
|
int n = network->size;
|
||||||
int output_width, output_depth;
|
int output_width, output_depth;
|
||||||
Kernel* k_i;
|
Kernel* k_i;
|
||||||
Kernel* k_i_1;
|
|
||||||
for (int i=0; i<(n-1); i++) {
|
for (int i=0; i<(n-1); i++) {
|
||||||
k_i = network->kernel[i];
|
k_i = network->kernel[i];
|
||||||
k_i_1 = network->kernel[i+1];
|
|
||||||
output_width = network->width[i+1];
|
output_width = network->width[i+1];
|
||||||
output_depth = network->depth[i+1];
|
output_depth = network->depth[i+1];
|
||||||
|
|
||||||
if (k_i->cnn) { // Convolution
|
if (k_i->cnn) { // Convolution
|
||||||
Kernel_cnn* cnn = k_i_1->cnn;
|
Kernel_cnn* cnn = k_i->cnn;
|
||||||
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++) {
|
||||||
@ -75,7 +76,7 @@ void update_bias(Network* network) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (k_i->nn) { // Full connection
|
} else if (k_i->nn) { // Full connection
|
||||||
Kernel_nn* nn = k_i_1->nn;
|
Kernel_nn* nn = k_i->nn;
|
||||||
for (int a=0; a<output_width; a++) {
|
for (int a=0; a<output_width; a++) {
|
||||||
nn->bias[a] += network->learning_rate * nn->d_bias[a];
|
nn->bias[a] += network->learning_rate * nn->d_bias[a];
|
||||||
nn->d_bias[a] = 0;
|
nn->d_bias[a] = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user