75 lines
2 KiB
C
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]);
|
|
}
|
|
}
|
|
}
|