Skip to content
A homemade CNNs model
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
MNIST_DB
OldVersion
pic
src
.gitignore
Makefile
Pretrained_Data
README.md

README.md

simple_cnn

这是一个简单的卷积神经网络框架, 包括一些常见网络结构.

此项目的GitHub页面为: https://github.com/hiaoxui/simple_cnn

下面是对源码的简单介绍, 更详细的介绍可以查看注释.

node

该文件夹中存有对每个结点的定义. 每个结点可以选择自己的非线性函数. 非线性函数定义在math_tools中, 仿照我已有的三个函数的接口, 可以定义更多非线性函数.

另外一个文件是连接函数, 每层都构造完成之后, 需要把各层连接起来.

edge

文件夹中定义了一个边类, 边是传递信号的单位. 可以正向传递计算值, 也可以逆向传递误差来调整网络参数.

另外一个文件是卷积核, 在卷积层中会用到.

layer

文件夹中定义了一个基类layer和它的五个子类, 分别定义了五种网络结构. 按照接口可以定义更多的网络结构并接入.

network

网络类, 负责生成和管理一个网络. 代码量不大, 主要工作由layer完成.

exception

此文件夹中定义了很多异常类. 由于程序设计很不完善, 很多工作必须由使用网络的用户来完成, 可能会产生各种bug. 当网络遇到异常情况的时候, 程序会抛出异常. 可以catch并输出what()来查看异常情况.

math_tools

文件夹中定义了很多数学函数, 包括非线性函数, 池化层函数和其他一些常用数学函数.

池化层函数和非线性函数抽象为一个函数类, 以便随时扩充. 如果需要更多的数学函数, 可以按照接口再定义一些.

file_op

文件夹中定义了文件操作, 可以把网络保存到文件中, 或者从文件中读取网络. 文件格式是我自己定义的一种二进制文件, 可以保存网络的结构和连接权重.

MNIST_DB

文件夹中定义了MNIST数据库的接口函数.

util

工具箱, 定义了一些类型别名和其他一些常用的枚举类, 编译常量等.

trainer

训练器, 会从文件中调取网络并训练, 然后保存到文件中. 默认数据库为MNIST, 也可以自己修改.

trainer中同时定义了测试函数, 可以在测试集中集中和单独测试图片.

使用方法

文件夹中含有Makefile, 命令行中输入make可以生成连接文件, 输入make install可以生成可执行文件(在linux中测试通过). 默认编译器是g++, 如果机器没有g++编译器, 可以在makefile中更改CXX变量. 输入make uninstall可以删除连接文件和可执行文件.

默认进入的函数是测试函数, 输入0到10000的数字, 可以测试相应序号的图片. 程序有一个已经训练好的网络, 该网络在10000样本量的测试集中可以识别9462张图片.

必须强调的是, 此程序只是卷积神经网络一个拙劣的模仿品. 由于网络结构和算法非常简单, 所以其学习能力非常差. 而且由于大量使用智能指针, 即使训练完成, 其运行效率也很低. 由于设计不是很完善, 在连接网络中很容易出现连接异常, 用户界面很不友好. 由于我对神经网络训练缺乏经验, 实践过程中最高只达到了95%的识别率.

希望我以后能写出更好的神经网络和c++代码 :) .

Reference

这里可以看到一些简单的算法介绍:

https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/

翻译版本:

http://www.hackcv.com/index.php/archives/104/

这里可以看到关于MNIST数据库的介绍:

http://yann.lecun.com/exdb/mnist/

我参考了以下blog:

cs231n.github.io/convolutional-networks/

http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

这里有一个非常有趣的可视化版本, 我的网络结构模仿了此结构(然而识别率远低于它):

http://scs.ryerson.ca/~aharley/vis/conv/

我的代码结构参考了下面这个项目:

https://github.com/tiny-dnn/tiny-dnn

You can’t perform that action at this time.