C++实现lenet-5 总结

   最近自学了点神经网络深度学习,用C++写一个lenet-5做一个总结吧。lenet-5 的原理,卷积神经网络的原理就不说了,大家自己到网上查,只总结一下我这个外行再实现lenet-5遇到的问题:

     根据网上lenet-5资料实现以后,用MNIST验证,结果简直让我不敢直视,完全不对路。但是卷积层、下采样层、全连接网络层我都用相应的数据验证过,没有问题,真是让人很泄气。感谢现在的网络强大,我到网上下载了一个lenet-5 用C语言的实现,但是这个实现和标准实现有些差异,只写个五层,分别是:1.卷积层、2.下采样层、3.卷积层、4.下采用层,5.全连接层;而且第3层卷积层filter深度是1,而标准是6. 为了验证我的代码,也把我的代码改成一样,且权重也给一个固定值。 我的代码正确,很兴奋。我想把代码改的更接近标准,我把第3层的filter深度改成6,天哪,运行结果又不对了,难道我改的不对,反复研究那几行代码,看不出问题,难道标准的有问题?当然是不可能的。仔细研究filter深度的意义,如果每一层的权重一样,每一层算出的结果会一样,采用多层没有意思了。我试着把权重改成随机生成,结果真的好了!my god. 后来我发现不管是哪一层,权重的初始化都很重要,要不然收敛不到你想要的结果。原理嘛我想大概是这样,如一元三次方程有两个极点,初始化位置不对,找不到你想要的极点。怪不得网上流传着训练神经网络也是一种技术活。后来发现训练速率也很重要,设置不对也有可能收敛不到结果

        最后我也只实现了6层,最后一层没搞定,哪位知道怎么训练,不吝赐教。不过6层也可以用来实现图片识别了,可能准确率差一点吧。代码上传到这个地址,希望跟大家共同学习。 代码开发环境vs2015

               http://download.csdn.net/download/tangqinglin/10234936


LeNet-5神经网络 C源代码,这个写的比较好,可以用gcc编译去跑,结合理论可以对深度学习有更深刻的了解 介绍 根据YANN LECUN的论文《Gradient-based Learning Applied To Document Recognition》设计的LeNet-5神经网络,C语言写成,不依赖任何第三方库。 MNIST手写字符集初代训练识别率97%,多代训练识别率98%。 DEMO main.c文件为MNIST数据集的识别DEMO,直接编译即可运行,训练集60000张,测试集10000张。 项目环境 该项目为VISUAL STUDIO 2015项目,用VISUAL STUDIO 2015 UPDATE1及以上直接打开即可编译。采用ANSI C编写,因此源码无须修改即可在其它平台上编译。 如果因缺少openmp无法编译,请将lenet.c中的#include和#pragma omp parallel for删除掉即可。 API #####批量训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 inputs: 要训练的多个图片对应unsigned char二维数组的数组,指向的二维数组的batchSize倍大小内存空间指针。在MNIST测试DEMO中二维数组为28x28,每个二维数组数值分别为对应位置图像像素灰度值 resMat:结果向量矩阵 labels:要训练的多个图片分别对应的标签数组。大小为batchSize batchSize:批量训练输入图像(二维数组)的数量 void TrainBatch(LeNet5 *lenet, image *inputs, const char(*resMat)[OUTPUT],uint8 *labels, int batchSize); #####单个训练 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 要训练的图片对应二维数组 resMat:结果向量矩阵 label: 要训练的图片对应的标签 void Train(LeNet5 *lenet, image input, const char(*resMat)[OUTPUT],uint8 label); #####预测 lenet: LeNet5的权值的指针,LeNet5神经网络的核心 input: 输入的图像的数据 labels: 结果向量矩阵指针 count: 结果向量个数 return 返回值为预测的结果 int Predict(LeNet5 *lenet, image input, const char(*labels)[LAYER6], int count); #####初始化 lenet: LeNet5的权值的指针,LeNet5神经网络的核心
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值