#include #include #include #include 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]); } } }