neural_network.h changes

This commit is contained in:
Thomas 2023-09-23 12:32:34 +02:00
parent 4682ec6c97
commit 26dc807a07
2 changed files with 23 additions and 61 deletions

9
main.c
View file

@ -7,14 +7,11 @@ int main() {
Image** images = import_images("../data/train-images.idx3-ubyte", "../data/train-labels.idx1-ubyte", NULL, 60000); Image** images = import_images("../data/train-images.idx3-ubyte", "../data/train-labels.idx1-ubyte", NULL, 60000);
// img_visualize(images[0]); // img_visualize(images[0]);
Neural_Network* nn = new_network(28*28, 2, 10, 0.01); Neural_Network* nn = new_network(28*28, 3, 1, 10, 0.01);
randomize_network(nn, 1); randomize_network(nn, 1);
// save_network(nn); // save_network(nn);
// Neural_Network* nn = load_network("../networks/test1.txt");
// Neural_Network* nn = load_network("../networks/test1.txt");
matrix_print(nn->weights_1);
return 0;
// for (int i = 0; i < 20000; ++i) { // for (int i = 0; i < 20000; ++i) {

View file

@ -29,30 +29,16 @@ Neural_Network* new_network(int input_size, int hidden_size, int output_size, do
} }
void randomize_network(Neural_Network* network, int scope){ void randomize_network(Neural_Network* network, int scope){
matrix_randomize(network->weights_1, scope); for (int i = 0; i < network->hidden_amount + 1; i++) {
matrix_randomize(network->weights_2, scope); matrix_randomize(network->weights[i], scope);
matrix_randomize(network->weights_3, scope); }
matrix_randomize(network->weights_output, scope);
// matrix_randomize(network->bias_1, scope);
// matrix_randomize(network->bias_2, scope);
// matrix_randomize(network->bias_3, scope);
// matrix_randomize(network->bias_output, scope);
matrix_fill(network->bias_1, 1);
matrix_fill(network->bias_2, 1);
matrix_fill(network->bias_3, 1);
matrix_fill(network->bias_output, 1);
} }
void free_network(Neural_Network* network){ void free_network(Neural_Network* network){
matrix_free(network->weights_1); for (int i = 0; i < network->hidden_amount + 1; i++) {
matrix_free(network->weights_2); matrix_free(network->weights[i]);
matrix_free(network->weights_3); }
matrix_free(network->weights_output); free(network->weights);
matrix_free(network->bias_1);
matrix_free(network->bias_2);
matrix_free(network->bias_3);
matrix_free(network->bias_output);
free(network); free(network);
} }
@ -72,26 +58,15 @@ void save_network(Neural_Network* network) {
// save network size to first line of the file // save network size to first line of the file
fprintf(save_file, "%d\n", network->input_size); fprintf(save_file, "%d\n", network->input_size);
fprintf(save_file, "%d\n", network->hidden_size); fprintf(save_file, "%d\n", network->hidden_size);
fprintf(save_file, "%d\n", network->hidden_amount);
fprintf(save_file, "%d\n", network->output_size); fprintf(save_file, "%d\n", network->output_size);
// close the file // close the file
fclose(save_file); fclose(save_file);
// save first layer for (int i = 0; i < network->hidden_amount + 1; ++i) {
matrix_save(network->bias_1, file_name); matrix_save(network->weights[i], file_name);
matrix_save(network->weights_1, file_name); }
// save second layer
matrix_save(network->bias_2, file_name);
matrix_save(network->weights_2, file_name);
// save third layer
matrix_save(network->bias_3, file_name);
matrix_save(network->weights_3, file_name);
// save output weights
matrix_save(network->bias_output, file_name);
matrix_save(network->weights_output, file_name);
printf("Network Saved!"); printf("Network Saved!");
} }
@ -114,20 +89,16 @@ Neural_Network* load_network(char* file) {
fgets(buffer, MAX_BYTES, save_file); fgets(buffer, MAX_BYTES, save_file);
int hidden_size = (int) strtol(buffer, NULL, 10); int hidden_size = (int) strtol(buffer, NULL, 10);
fgets(buffer, MAX_BYTES, save_file); fgets(buffer, MAX_BYTES, save_file);
int hidden_amount = (int) strtol(buffer, NULL, 10);
fgets(buffer, MAX_BYTES, save_file);
int output_size = (int) strtol(buffer, NULL, 10); int output_size = (int) strtol(buffer, NULL, 10);
// create a new network to fill with the saved data // create a new network to fill with the saved data
Neural_Network* saved_network = new_network(input_size, hidden_size, output_size, 0); Neural_Network* saved_network = new_network(input_size, hidden_size, hidden_amount, output_size, 0);
// load matrices from file into struct for (int i = 0; i < saved_network->hidden_amount + 1; ++i) {
saved_network->bias_1 = load_next_matrix(save_file); saved_network->weights[i] = load_next_matrix(save_file);
saved_network->weights_1 = load_next_matrix(save_file); }
saved_network->bias_2 = load_next_matrix(save_file);
saved_network->weights_2 = load_next_matrix(save_file);
saved_network->bias_3 = load_next_matrix(save_file);
saved_network->weights_3 = load_next_matrix(save_file);
saved_network->bias_output = load_next_matrix(save_file);
saved_network->weights_output = load_next_matrix(save_file);
// return saved network // return saved network
fclose(save_file); fclose(save_file);
@ -135,15 +106,9 @@ Neural_Network* load_network(char* file) {
} }
void print_network(Neural_Network* network) { void print_network(Neural_Network* network) {
matrix_print(network->bias_1); for (int i = 0; i < network->hidden_amount; ++i) {
matrix_print(network->bias_2); matrix_print(network->weights[i]);
matrix_print(network->bias_3); }
matrix_print(network->bias_output);
matrix_print(network->weights_1);
matrix_print(network->weights_2);
matrix_print(network->weights_3);
matrix_print(network->weights_output);
} }
double measure_network_accuracy(Neural_Network* network, Image** images, int amount) { double measure_network_accuracy(Neural_Network* network, Image** images, int amount) {