• 深度学习-使用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%)的 。

  • 相关阅读:
    优秀大整数
    洛谷—— P3908 异或之和
    洛谷—— P1869 愚蠢的组合数
    洛谷—— P1680 奇怪的分组
    洛谷—— P1609 最小回文数
    Something I like
    数学相关
    新博客测试中~
    P3369 【模板】普通平衡树
    2017 11.6 NOIP模拟赛
  • 原文地址:https://www.cnblogs.com/zhxfl/p/4134834.html
Copyright © 2020-2023  润新知