用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

相关推荐
盼小辉丶4 分钟前
Double DQN(DDQN)详解与实现
深度学习·keras·强化学习
himobrinehacken7 分钟前
c语言宏注意事项
c语言·开发语言
IT_陈寒10 分钟前
Vue 3性能优化实战:这5个Composition API技巧让你的应用快30%
前端·人工智能·后端
YF云飞18 分钟前
拟人AI GoCap:用机器学习打造真实玩家体验
人工智能·机器学习
IT_陈寒19 分钟前
Vue3性能翻倍的5个秘密:从Composition API到Tree Shaking实战指南
前端·人工智能·后端
粟悟饭&龟波功28 分钟前
【论文精读】DeepSeek-OCR:探索视觉 - 文本压缩的新范式
人工智能
机器之心31 分钟前
刚刚,Kimi开源新架构,开始押注线性注意力
人工智能·openai
IT_陈寒32 分钟前
JavaScript 性能优化:3个V8引擎隐藏技巧让你的代码提速50%
前端·人工智能·后端
Molesidy39 分钟前
【Embedded System】嵌入式C语言基础知识
c语言·开发语言
故事挺秃然1 小时前
NLP模型优化
人工智能·自然语言处理·nlp