experiments/nn/main.c
2024-05-27 21:30:27 +12:00

75 lines
2 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
typedef struct Layer {
int neuron_count;
float* neurons;
float* weights;
} Layer;
typedef struct Network {
struct Layer* layers;
int layer_count;
} Network;
Layer create_layer(int count, int next) {
Layer layer;
layer.neuron_count = count;
layer.neurons = calloc(sizeof(float), count);
layer.weights = calloc(sizeof(float), count * next);
return layer;
}
Network* create_network(int input, int hidden, int output) {
Network* network = calloc(sizeof(Network), 1);
network->layer_count = 3;
network->layers = calloc(sizeof(Layer), 3);
network->layers[0] = create_layer(input, hidden);
network->layers[1] = create_layer(hidden, output);
network->layers[2] = create_layer(output, 0);
return network;
}
float activation_func(float in) {
return 1.0f / (1.0f + powf(2.71828f, -in));
}
float randomf() {
return (rand() % 1000) / 1000.0f;
}
int main() {
srand(time(NULL));
Network* net = create_network(2, 3, 1);
for(int i = 0; i < net->layer_count - 1; i++) {
for(int j = 0; j < net->layers[i].neuron_count; j++) {
for(int m = 0; m < net->layers[i + 1].neuron_count; m++) {
net->layers[i].weights[j * net->layers[i + 1].neuron_count + m] = (randomf() - 0.5f) * 2.0f;
}
}
}
net->layers[0].neurons[0] = 1.0f;
net->layers[0].neurons[1] = 0.0f;
for(int layer = 1; layer < net->layer_count; layer++) {
for(int n = 0; n < net->layers[layer].neuron_count; n++) {
float sum = 0.0f;
Layer l_back = net->layers[layer - 1];
for(int n_back = 0; n_back < l_back.neuron_count; n_back++) {
sum += l_back.neurons[n_back] *
l_back.weights[n_back * l_back.neuron_count + n];
}
net->layers[layer].neurons[n] = activation_func(sum);
printf("layer[%d].neurons[%d] = %f\n", layer, n, net->layers[layer].neurons[n]);
}
}
}