#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\n// 定义卷积层结构体\ntypedef struct {\n int input_shape[3];\n int filter_shape[4];\n float* weights;\n float* biases;\n float* output;\n} ConvLayer;\n\n// 定义全连接层结构体\ntypedef struct {\n int input_shape;\n int output_shape;\n float* weights;\n float* biases;\n float* output;\n} DenseLayer;\n\n// 定义激活函数\nfloat relu(float x) {\n return fmaxf(0, x);\n}\n\n// 定义卷积操作\nvoid conv2D(ConvLayer* layer, float* input) {\n int in_h = layer->input_shape[0];\n int in_w = layer->input_shape[1];\n int in_c = layer->input_shape[2];\n int out_c = layer->filter_shape[3];\n int filter_h = layer->filter_shape[0];\n int filter_w = layer->filter_shape[1];\n int stride = layer->filter_shape[2];\n \n int out_h = (in_h - filter_h) / stride + 1;\n int out_w = (in_w - filter_w) / stride + 1;\n \n layer->output = (float*)malloc(out_h * out_w * out_c * sizeof(float));\n \n for (int oc = 0; oc < out_c; oc++) {\n for (int oh = 0; oh < out_h; oh++) {\n for (int ow = 0; ow < out_w; ow++) {\n float sum = 0.0;\n for (int ic = 0; ic < in_c; ic++) {\n for (int fh = 0; fh < filter_h; fh++) {\n for (int fw = 0; fw < filter_w; fw++) {\n int ih = oh * stride + fh;\n int iw = ow * stride + fw;\n sum += input[(ih * in_w * in_c) + (iw * in_c) + ic] \n layer->weights[((fh * filter_w * in_c * out_c) +\n (fw * in_c * out_c) +\n (ic * out_c) +\n oc)];\n }\n }\n }\n layer->output[(oh * out_w * out_c) + (ow * out_c) + oc] = relu(sum + layer->biases[oc]);\n }\n }\n }\n}\n\n// 定义全连接操作\nvoid dense(DenseLayer layer, float* input) {\n int input_size = layer->input_shape;\n int output_size = layer->output_shape;\n \n layer->output = (float*)malloc(output_size * sizeof(float));\n \n for (int i = 0; i < output_size; i++) {\n float sum = 0.0;\n for (int j = 0; j < input_size; j++) {\n sum += input[j] * layer->weights[(j * output_size) + i];\n }\n layer->output[i] = relu(sum + layer->biases[i]);\n }\n}\n\nint main() {\n // 假设输入为28x28x1的图像\n int input_shape[3] = {28, 28, 1};\n \n // 定义卷积层\n ConvLayer conv1;\n conv1.input_shape = input_shape;\n conv1.filter_shape[0] = 3; // filter height\n conv1.filter_shape[1] = 3; // filter width\n conv1.filter_shape[2] = 1; // stride\n conv1.filter_shape[3] = 32; // output channels\n conv1.weights = (float*)malloc(conv1.filter_shape[0] \n conv1.filter_shape[1] \n conv1.filter_shape[2] \n conv1.filter_shape[3] \n sizeof(float));\n conv1.biases = (float)malloc(conv1.filter_shape[3] * sizeof(float));\n \n // 定义全连接层\n DenseLayer dense1;\n dense1.input_shape = 32 * 13 * 13; // 输入为conv1的输出\n dense1.output_shape = 128; // 输出为128维\n dense1.weights = (float)malloc(dense1.input_shape * dense1.output_shape * sizeof(float));\n dense1.biases = (float)malloc(dense1.output_shape * sizeof(float));\n \n // 加载权重和偏置等参数(省略)\n \n // 假设输入图像为input_image\n float input_image = (float*)malloc(input_shape[0] * input_shape[1] * input_shape[2] * sizeof(float));\n \n // 执行卷积操作\n conv2D(&conv1, input_image);\n \n // 执行全连接操作\n dense(&dense1, conv1.output);\n \n // 输出结果\n for (int i = 0; i < dense1.output_shape; i++) {\n printf("%f ", dense1.output[i]);\n }\n printf("\n");\n \n free(input_image);\n free(conv1.weights);\n free(conv1.biases);\n free(conv1.output);\n free(dense1.weights);\n free(dense1.biases);\n free(dense1.output);\n \n return 0;\n


原文地址: https://www.cveoy.top/t/topic/pBNL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录