From 0c8b2c904411f9531fa4b946ef36d7da61656e52 Mon Sep 17 00:00:00 2001 From: Tocuro Date: Tue, 19 Sep 2023 14:46:40 +0200 Subject: [PATCH 1/2] i will nerma --- .gitignore | 4 +++- neuronal_network.c | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 868ec50..01adc20 100644 --- a/.gitignore +++ b/.gitignore @@ -53,4 +53,6 @@ Kernel Module Compile Results modules.order Module.symvers Mkfile.old -dkms.conf \ No newline at end of file +dkms.conf +/.idea/.name +/.idea/misc.xml diff --git a/neuronal_network.c b/neuronal_network.c index 9bb8b39..8f9c470 100644 --- a/neuronal_network.c +++ b/neuronal_network.c @@ -8,9 +8,38 @@ void free_network(Neural_Network* network); void save_network(Neural_Network* network, char* file); Neural_Network* load_network(char* file); -double predict_images(Neural_Network* network, Image** images, int amount); +double predict_images(Neural_Network* network, Image** images, int amount) { + int num_correct = 0; + for (int i = 0; i < amount; i++) { + Matrix* prediction = predict_image(network, images[i]); + if (matrix_argmax(prediction) == images[i]->image_label) { + num_correct++; + } + matrix_free(prediction); + } + return 1.0 * num_correct / amount; +} Matrix* predict_image(Neural_Network* network, Image*); -Matrix* predict(Neural_Network* network, Matrix* image_data); + +Matrix* predict(Neural_Network* network, Matrix* image_data) { + Matrix* hidden1_inputs = dot(network->weights_1, image_data); + Matrix* hidden1_outputs = apply(relu, hidden1_inputs); + + Matrix* hidden2_inputs = dot(network->weights_2, hidden1_outputs); + Matrix* hidden2_outputs = apply(relu, hidden2_inputs); + + + Matrix* final_inputs = dot(net->output_weights, hidden_outputs); + Matrix* final_outputs = apply(sigmoid, final_inputs); + Matrix* result = softmax(final_outputs); + + matrix_free(hidden_inputs); + matrix_free(hidden_outputs); + matrix_free(final_inputs); + matrix_free(final_outputs); + + return result; +} void train_network(Neural_Network* network, Matrix* input, Matrix* output); void batch_train_network(Neural_Network* network, Image** images, int size); \ No newline at end of file From b097f30d6473f1c58d0e99565c6f4067af8d635c Mon Sep 17 00:00:00 2001 From: Ghost_Element Date: Tue, 19 Sep 2023 14:47:18 +0200 Subject: [PATCH 2/2] neuroal_network.c new_network print_network - not needed free_network --- neuronal_network.c | 38 ++++++++++++++++++++++++++++++++++---- neuronal_network.h | 2 +- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/neuronal_network.c b/neuronal_network.c index 9bb8b39..1c58d21 100644 --- a/neuronal_network.c +++ b/neuronal_network.c @@ -1,9 +1,39 @@ - +#include #include "neuronal_network.h" -Neural_Network* new_network(int input_size, int hidden_size, int output_size, double learning_rate); -void print_network(Neural_Network* network); -void free_network(Neural_Network* network); +Neural_Network* new_network(int input_size, int hidden_size, int output_size, double learning_rate){ + Neural_Network network = malloc(sizeof(Neural_Network)); + // initialize networks variables + network.input_size = input_size; + network.hidden_size = hidden_size; + network.output_size = output_size; + network.learning_rate = learning_rate; + + network.weights_1 = matrix_randomize(matrix_create(hidden_size, input_size)); + network.weights_2 = matrix_randomize(matrix_create(hidden_size, hidden_size)); + network.weights_3 = matrix_randomize(matrix_create(hidden_size, hidden_size)); + network.weights_output = matrix_randomize(matrix_create(output_size, hidden_size)); + network.bias_1 = matrix_randomize(matrix_create(hidden_size, 1)); + network.bias_2 = matrix_randomize(matrix_create(hidden_size, 1)); + network.bias_3 = matrix_randomize(matrix_create(hidden_size, 1)); + //network.bias_output = matrix_create(output_size, 1); // do we need it? + + return network; +} + +//void print_network(Neural_Network* network){}; + +void free_network(Neural_Network* network){ + matrix_free(network->weights_1); + matrix_free(network->weights_2); + matrix_free(network->weights_3); + matrix_free(network->weights_output); + matrix_free(network->bias_1); + matrix_free(network->bias_2); + matrix_free(network->bias_3); + free(network); +} + void save_network(Neural_Network* network, char* file); Neural_Network* load_network(char* file); diff --git a/neuronal_network.h b/neuronal_network.h index 8b6ceb9..a21d553 100644 --- a/neuronal_network.h +++ b/neuronal_network.h @@ -26,7 +26,7 @@ typedef struct { } Neural_Network; Neural_Network* new_network(int input_size, int hidden_size, int output_size, double learning_rate); -void print_network(Neural_Network* network); +//void print_network(Neural_Network* network); void free_network(Neural_Network* network); void save_network(Neural_Network* network, char* file);