深度学习-使用cuda加速卷积神经网络-手写数字识别准确率99.7%

源码和运行结果

cuda:https://github.com/zhxfl/CUDA-CNN

C语言版本参考自:http://eric-yuan.me/

针对著名手写数字识别的库mnist,准确率是99.7%,在几分钟内,CNN的训练就可以达到99.60%左右的准确率。

参数配置

网络的配置使用Config.txt进行配置##之间是注释,代码会自动过滤掉,其他格式参考如下:

#Comment#
#NON_LINEARITY CAN = NL_SIGMOID , NL_TANH , NL_RELU#
##
##
##
##


IS_GRADIENT_CHECKING = false;
BATCH_SIZE = 200;
NON_LINEARITY = NL_RELU;

[
LAYER = CONV;
KERNEL_SIZE = 5;
KERNEL_AMOUNT = 10;
WEIGHT_DECAY = 1e-6;
POOLING_DIM = 2;
]

[
LAYER = CONV;
KERNEL_SIZE = 5;
KERNEL_AMOUNT = 20;
WEIGHT_DECAY = 1e-6;
POOLING_DIM = 2;
]

[
LAYER = FC;
NUM_HIDDEN_NEURONS = 256;
WEIGHT_DECAY = 1e-6;
DROPOUT_RATE = 0.5;
]

[
LAYER = FC;
NUM_HIDDEN_NEURONS = 256;
WEIGHT_DECAY = 1e-6;
DROPOUT_RATE = 0.5;
]

[
LAYER = SOFTMAX;
NUM_CLASSES = 10;
WEIGHT_DECAY = 1e-6;
]

1)目前代码支持多个卷积层,多个全链接层。

2)卷积层默认带有池化层,池化算法目前只支持最大值池化。

3)卷积层的卷积核大小只支持奇数。

4)全链接层支持Dropconnect。(配置里面写的是dropout,后面会纠正这个的)

5)weight_decay这个参数如果你不知道是做什么,也可以先不理会,先用这个值就行了。

编译代码

1)代码目前依赖cuda-6.0以及opencv,如果你不想去装opencv,可以将util.cu和util.h所有有关opencv的代码都去掉,整个代码只有这里使用到opencv,而且只是由于我在开发过程中需要显示图片来调试而已。

2)代码直接可以导入nsight然后编译运行。同时也可以再vs2010里面编译运行。

代码特性

1)我们对数据做了处理,每次进行训练之前,都会随机的进行旋转、尺度变换、畸变和裁剪。下图是两个例子,实际上,这样做非常有效,使得我们的准确能够更高

2)整个代码采用cuda进行加速,其中我们用到了cublas.lib和curand.lib两个库,一个是矩阵运算一个是随机数的生成。我一次性申请了所有需要使用的内存,在程序开始运行之后,就不存在任何CPU和GPU之间的数据交换,事实证明这样非常有效。程序的性能比原来作者C语言版本快了数十倍左右(如果网络比较大,可以达到一百倍左右的加速比)。我们每个epos使用1600ms,处理了60000张图片,也就是训练一张图片大概是0.0266ms。

3)实际上,如果训练多个网络,然后进行投票,准确率可以达到99.82%,这个结果是目前为止所有公开发表结果中最好(99.79%)的 。

转载于:https://www.cnblogs.com/zhxfl/p/4134834.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于 KNN(k-最近邻)和 CNN(卷积神经网络)的手写数字识别算法可以达到99.7%的高识别率。这个算法结合了两种不同的机器学习技术,以提高准确性和鲁棒性。 KNN算法是一种简单有效的监督学习算法,它根据样本点的特征和它们最近邻的类别进行分类。在手写数字识别中,KNN算法使用训练集中的数字样本作为参考,并通过计算待识别数字与训练集中各个数字之间的距离来确定其类别。KNN算法的优点在于简单易懂、易于实现,但对于大规模数据集和高维度特征可能存在计算复杂度较高的问题。 而CNN算法是一种更为复杂的神经网络模型,特别适用于图像处理任务。通过卷积层、池化层和全连接层的组合,CNN能够有效地提取图像中的特征,并学习到不同数字的表示。在手写数字识别中,CNN可以学习到数字的形状、边缘信息和纹理等特征,从而实现高精度的识别。 基于KNN和CNN的手写数字识别算法相当于将KNN的特征选择与CNN的分类能力相结合。首先,利用CNN训练模型,获得高层次的特征表示。然后,使用KNN算法对这些特征进行分类,通过选择最近邻的方式来判断待识别数字的类别。这种算法的优势在于能够充分利用CNN模型提取的特征,并结合KNN的优势进行分类,从而实现较高的识别率。 总之,基于KNN和CNN的手写数字识别算法通过综合利用KNN和CNN的特点,能够获得高达99.7%的准确率,为手写数字识别问题提供了一种高效可行的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值