用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

相关推荐
wfeqhfxz25887822 分钟前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
芝士爱知识a15 分钟前
2026年AI面试软件推荐
人工智能·面试·职场和发展·大模型·ai教育·考公·智蛙面试
Li emily32 分钟前
解决港股实时行情数据 API 接入难题
人工智能·python·fastapi
Aaron158834 分钟前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
J_Xiong01171 小时前
【Agents篇】04:Agent 的推理能力——思维链与自我反思
人工智能·ai agent·推理
星爷AG I1 小时前
9-26 主动视觉(AGI基础理论)
人工智能·计算机视觉·agi
爱吃泡芙的小白白1 小时前
CNN参数量计算全解析:从基础公式到前沿优化
人工智能·神经网络·cnn·参数量
爱编码的小八嘎1 小时前
C语言对话-21.模板特化,缺省参数和其他一些有趣的事情
c语言
拐爷1 小时前
vibe‑coding 九阳神功之喂:把链接喂成“本地知识”,AI 才能稳定干活(API / 设计 / 报道 / 截图)
人工智能
石去皿1 小时前
大模型面试通关指南:28道高频考题深度解析与实战要点
人工智能·python·面试·职场和发展