用C语言构建一个数字识别卷积神经网络

卷积神经网络的具体原理和对应的python例子参见末尾的参考资料2.3.

这里仅叙述卷积神经网络的配置, 其余部分不做赘述,构建和训练神经网络的具体步骤请参见上一篇: 用C语言构建一个手写数字识别神经网路

卷积网络同样采用简单的三层结构,包括输入层conv_layer,中间层maxpool_layer, 和输出层output_layer, 其中输出层为全连接层.

Input(28*28) |>>> CONV3X3 (26x26x8_out) >>>|<<< MAXPOOL2X2 (13x13x8_out) >>>|<<< NVCELLs (10_out) >>>|

输入层conv_layer:

为3x3的卷积层, 默认8个卷积核, 采用valid_padding(不填充),移动扫描步长为1,不考虑偏置项. 需要通过训练来确定各个卷积核参数. 3x3的卷积核相比5x5和7x7的卷积核其参数量更少,非线性度更高,同时可以提取更小的特征. (5x5和7x7的卷积可以用多层3x3卷积来表示, 当然,随着层数的增加可能会产生新的问题.) 卷积层的输入部分就是灰度值表示的28x28的手写数字图像,这里也预先进行了归一化处理,即除以255.0.

每个核对28x28数据进行卷积运算后输出26x26个数值. 每个卷积核只需要学习9个参数, 8个卷积核一共是72个参数. 如果是用20个全连接的神经元作为输入层的话,一共需要学习(28x28+1)x20=15700个参数.

中间层maxpool_layer:

采用2x2最大池化,步长也为2, 池化层没有参数, 不需要学习.MAXPOOL具有防止过拟合的作用,因其仅对最大值对应的节点进行反向传导,相当于断开了与其他节点的连接.在这里maxpool直接将conv_layer每个核的输出26x26下采样到13x13.

输出层output_layer:

一共10个神经元,分别对应0~9数字的可能性,与中间层的输出进行全连接,这里中间层的输出数据已展平成一维.假定中间层的输出是13x13x8, 那么展平后就是1352个节点.也就是说输出层的每一个神经元都需要与这1352个节点连接,每一个神经元需要学习1352(w)+1(b)个参数.

取5万条训练样本进行训练,训练后再进行测试,其准确率可超过94%.

与全连接的神经网络相比较,卷积神经网络的参数量大大降低,训练的所需要时间也相应减少.

源代码:

https://github.com/midaszhou/nnc

下载后编译:

make TEST_NAME=test_nnc3

参考资料:

  1. MNIST手写数字集 http://yann.lecun.com/exdb/mnist/

  2. CNNs, Part 1: An Introduction to Convolutional Neural Networks - victorzhou.com

  3. CNNs, Part 2: Training a Convolutional Neural Network - victorzhou.com

相关推荐
个入资料12 分钟前
阿里云ecs+飞书搭建openclaw
人工智能
CoovallyAIHub23 分钟前
OpenClaw一脚踩碎传统CV?机器终于不再只是看世界
深度学习·算法·计算机视觉
CoovallyAIHub39 分钟前
仅凭单目相机实现3D锥桶定位?UNet-RKNet破解自动驾驶锥桶检测难题
深度学习·算法·计算机视觉
孤烟1 小时前
【RAG 实战系列 02】检索精度翻倍!混合检索(稀疏 + 稠密)实战教程
人工智能·llm
明明如月学长2 小时前
OpenClaw 帮我睡后全自动完成了老板交代的任务
人工智能
uuware2 小时前
Lupine.Press + AI 助您分分钟搞定技术项目的文档网站
人工智能·前端框架
海上日出2 小时前
使用 QuantStats 进行投资组合绩效分析:Python 量化实战指南
人工智能
Qinana2 小时前
150行代码搞定私有知识库!Node.js + LangChain 打造最小化 RAG 系统全流程
人工智能·程序员·node.js
猿猿长成记2 小时前
AI专栏 | AI大法则之思维链、自洽性、思维树
人工智能
用户5191495848452 小时前
CrushFTP 条件竞争认证绕过漏洞利用工具 (CVE-2025-54309)
人工智能·aigc