# network **Repository Path**: xiao_peipei/network ## Basic Information - **Project Name**: network - **Description**: 二维的神经网络框架,支持内存静态分配,可迁移嵌入式中,并提供一个手写数字识别例程。 - **Primary Language**: C - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-12 - **Last Updated**: 2026-03-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # C语言手搓神经网络框架,简洁易懂,十分容易上手 ### 前言: *如果你专注于神经网络框架,了解 nn.c,layer.c,loss.c,optimizer.c 即可; 但如果你想要移植到嵌入式芯片中,需要深入了解底层的内存和矩阵代码。* ### 简介: **这是一个二维的神经网络框架,支持内存静态分配,可迁移嵌入式中。 提供一个手写数字识别例程,可以直接运行 ./mnist_example.exe。** ### 内存说明: 通过定义长数组作为内存池,定义三种内存,分别为静态内存,动态内存,外部内存 静态内存:默认创建矩阵是静态内存,一旦创建,内存分配固定,不能释放空间,但能复用 动态内存:创建临时矩阵,通过 pop弹出,用完就要弹出(否则函数嵌套出问题) 外部内存:创建一个数组,指定这个数组的内容作为一个矩阵 静态内存是给神经网络参数使用, 动态内存则是矩阵计算过程中的临时矩阵,用完需要手动释放。 外部内存,用来加载外部数据,将外部数组转换为矩阵 矩阵删除: 外部内存矩阵可以删除,静态内存矩阵不能删除,可以复用, 动态内存矩阵通过 pop 操作释放 ![alt text](./pic/image.png) ### 网络架构: 第4层 (网络层) nn.h, nn.c nn_config.h (配置第3、4层) ↓ 第3层 (层/损失/优化器) layer.h, layer.c loss.h, loss.c optimizer.h, optimizer.c ↓ 第2层 (矩阵操作) matrix.h, matrix.c ↓ 第1层 (内存管理) matrix_memory.h, matrix_memory.c (含调试宏,配置第1、2层) ### 使用: 1、调用 nn.h , 并初始化内存。 matrix_memory.h 宏定义配置内存大小,释放开启矩阵计算的调试模式 nn_config.h 宏定义指定开启神经网络调试模式 (调试成熟后,可关闭调试模式) 2、加载数据,指定为外部内存矩阵 (矩阵 行:数据数量,列:特征向量数量) 3、搭建神经网络,添加层是有顺序的,必须按顺序添加 可以调用如下函数查看网络框架和内存信息 network_summary(net); // 查看网络框架 network_layer_memory_info(net); // 查看内存信息 4、训练并保存参数 5、释放空间 ### 二次开发注意事项: layer.c 中 backward 和 forward 中必须设置输出矩阵的维度 loss.c 中 backward 中必须设置输出矩阵的维度 动态内存采用堆栈结构,用完需要pop,弹出有先后顺序 ### 例程编译: gcc -o mnist_example nn.c layer.c loss.c optimizer.c matrix.c matrix_memory.c mnist_example.c -lm -I. 生成 mnist_example.exe 文件后 ./mnist_example.exe 执行 ### 搭建网络示意 Optimizer *opt = sgd_create(0.01); // 创建优化器 NeuralNetwork *net = network_create(opt); // 创建网络 // 添加层(按顺序) network_add_layer(net, dense_create(784, 128, 0.0, 0.0)); network_add_layer(net, relu_create()); network_add_layer(net, dense_create(128, 64, 0.0, 0.0)); network_add_layer(net, relu_create()); network_add_layer(net, dense_create(64, 10, 0.0, 0.0)); network_add_layer(net, logsoftmax_create()); // 查看网络结构 network_summary(net); network_layer_memory_info(net); // 查看内存占用预估 // 训练 LossFunction *loss_fn = nll_loss_create(); // 选择损失函数 train(net, X, Y, loss_fn, epochs, batch_size, verbose); // 参数保存与加载 save_parameters(net, "model.bin"); load_parameters(net, "model.bin"); cmd 输出示意: ![alt text](./pic/image1.png)