原创文章
转载请注册来源http://blog.csdn.net/tostq
前言
卷积神经网络是深度学习的基础,但是学习CNN却不是那么简单,虽然网络上关于CNN的相关代码很多,比较经典的是tiny_cnn(C++)、DeepLearnToolbox(Matlab)等等,但通过C语言来编写CNN的却比较少,本人因为想在多核DSP下运行CNN,所以便尝试通过C语言来编写,主要参考的代码是DeepLearnToolbox的内容,DeepLearnToolbox是用Matlab脚本编写,是我看过的最为简单的CNN代码,代码清晰,阅读方便,非常适合新手入门学习。
本文的CNN代码是一个最基本的卷积网络,主要用于手写数字的识别,选择的训练测试是数据库是Minst手写数字库,主要是包括了一个基本的多层卷积网络框架、卷积层、Pooling层、及全连接的单层神经网络输出层,不过CNN其他重要的概念如Dropout、ReLu等暂时没有涉及,但是个人对于新手,学习卷积网络的基本结构及其误差反向传播方法是完全足够。
这里要注意的是,本文的方法并不是深度学习之父Yann. LeCun在1998年就已经提出的成熟算法LeNet-5卷积网络,而只是DeepLearnToolbox内的cnn代码的c语言实现,不过我们会比较二者之间的区别,因为二者的基本原理是相似的。另外,为了不使博客篇幅过长,所以博客中贴的代码并不完整,完整代码请见附件。
这篇博客总共分为四节:
第一节:前言,介绍项目结构及Minst数据集测试训练数据集
第二节:主要介绍CNN的网络结构、相关数据结构
第三节:重点介绍CNN学习训练过程的误差反向传播方法,采用的是在线训练方式
第四节:CNN的学习及测试结果的比较
论文参考文献:
Y. LeCun, L. Bottou, Y. Bengio and P. Haffner:Gradient-Based Learning Applied to Document Recognition, Proceedings of the IEEE, 86(11):2278-2324,
November 1998
一、代码结构
本文的CNN代码是通过标准C编写&