用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

相关推荐
天涯明月19933 分钟前
Ray 架构解析——以动态任务图统一 AI 计算的分布式框架
大数据·人工智能·分布式·架构·ray
无崖子08 分钟前
【强化学习论文解读】Expert Behavior Prior Reinforcement Learning
人工智能·深度学习·神经网络
clorinda9 分钟前
第一篇:OpenCV特征检测与SIFT特征匹配
人工智能·opencv·计算机视觉
老一岁9 分钟前
c问题总结(2)
c语言·开发语言
大熊背10 分钟前
ISP图像处理中大数乘法溢出处理(一)
人工智能·python·算法·溢出处理
精彩AI说16 分钟前
ChatGPT回答内容总是漏重点怎么办?需求拆分、检查清单与二次补充方法
人工智能·chatgpt
奶茶树20 分钟前
【C++】13. C++11新特性【上】
c语言·开发语言·c++·git·github
Alphapeople22 分钟前
3D算法推荐项目
人工智能
hhzz23 分钟前
智慧校园13类视频异常检测:数据集与预训练模型全攻略
人工智能·pytorch·python·深度学习·目标检测·机器学习
广西生活网26 分钟前
水晶光电发布 2026 半年报:归母净利润 5.24 亿元同比增长 4.73%
人工智能·能源