im trying
This commit is contained in:
parent
3bdd4c4807
commit
07a40fdb01
85
cnn.c
Normal file
85
cnn.c
Normal file
@ -0,0 +1,85 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
typedef enum {
|
||||
input,
|
||||
conv,
|
||||
max_pool,
|
||||
fully_connected,
|
||||
output
|
||||
} ltype;
|
||||
|
||||
typedef enum {
|
||||
relu,
|
||||
softmax,
|
||||
sigmoid,
|
||||
tanh
|
||||
} activation;
|
||||
|
||||
typedef struct {
|
||||
int filters;
|
||||
int filter_h;
|
||||
int filter_w;
|
||||
int stride;
|
||||
int zeropadding; // amount of zeropadding (1 = one layer... etc.)
|
||||
} convparams;
|
||||
|
||||
typedef struct {
|
||||
int pool_height; // height and width of the pooling window
|
||||
int pool_width;
|
||||
} poolparams;
|
||||
|
||||
typedef struct {
|
||||
ltype type;
|
||||
activation atype;
|
||||
|
||||
int input_height;
|
||||
int input_width;
|
||||
int input_channels;
|
||||
|
||||
int output_height;
|
||||
int output_width;
|
||||
int output_channels;
|
||||
|
||||
union {
|
||||
convparams layerconv;
|
||||
poolparams layerpool;
|
||||
} params;
|
||||
|
||||
float* weights;
|
||||
float* biases;
|
||||
} Layer;
|
||||
|
||||
Layer* createlayer(ltype type, int height, int width, int channels, void* params) {
|
||||
Layer* layer = (Layer*)malloc(sizeof(Layer));
|
||||
layer->type = type;
|
||||
layer->input_height = height;
|
||||
layer->input_width = width;
|
||||
layer->input_channels = channels;
|
||||
|
||||
layer->weights = NULL;
|
||||
layer->biases = NULL;
|
||||
|
||||
switch(type) {
|
||||
case input: {
|
||||
layer->output_height = input_height;
|
||||
layer->output_width = input_width;
|
||||
layer->output_channels = input_channels;
|
||||
layer->activation = relu;
|
||||
break;
|
||||
}
|
||||
case conv: {
|
||||
convparams* cparams = (convparams*)params;
|
||||
layer->params.layerconv = *cparams;
|
||||
layer->activation = relu;
|
||||
|
||||
// https://cs231n.github.io/convolutional-networks/#pool - formula to find dimensions
|
||||
layer->output_height = ((input_height + 2*conv_params->zero_padding - conv_params->filter_height) / conv_params->stride_height) + 1;
|
||||
layer->output_width = ((input_width + 2*conv_params->zero_padding - conv_params->filter_width) / conv_params->stride_width) + 1;
|
||||
|
||||
layer->output_channels = convparams->filters;
|
||||
|
||||
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user