• 深度学习 CNN CUDA 版本2


    作者:zhxfl

    邮箱:zhxfl##mail.ustc.edu.cn

    主页:http://www.cnblogs.com/zhxfl/p/4155236.html

    第1个版本blog在这里:http://www.cnblogs.com/zhxfl/p/4134834.html 

    第2个版本github:https://github.com/zhxfl/CUDA-CNN

    欢迎fork,在第一个版本的时候,我们只是针对手写数字,也就是黑白图片。在第二个版本中,我加入了很多东西。

    第二个版本的特性

    1、支持rgb图片格式和rgbd图片格式(带有深度信息的图片)训练,带有深度信息的图片可以来源于Kinect。

    参考论文Anddrew Y.Ng的论文:Convolutional-Recursive Deep Learning for 3D Object Classification,你可以找到对应的带有深度信息的数据集。

    4d的图片不是这个版本的主要目的,但是你确实可以用这个代码来训练4D的数据集。(我在不久的未来会让这个版本更好的支持4D数据的训练)

    2、第二个比较突出的特性是你可以看到配置文件的参数更加复杂了,我会对所有参数一一做说明。

     1 #Comment#
     2 
     3 IS_GRADIENT_CHECKING = false;   #is true when debug#
     4 BATCH_SIZE = 100;               #test image size should be divided with no remainder#
     5 NON_LINEARITY = NL_RELU;        #NON_LINEARITY CAN = NL_SIGMOID , NL_TANH , NL_RELU#
     6 CHANNELS = 3;                   #1, 3, 4#
     7 CROP = 0.0;                     #0<= crop <=imgSize#
     8 SCALE = 0.0;                    #ImgSize from -13.0 to 13.0#
     9 ROTATION = 0.0;                 #angle from -13.0 to 13.0#
    10 DISTORTION = 0.0;               #just for mnist#
    11 SHOWIMAGE = false;              #show the images after transformation#
    12 
    13 [
    14 LAYER = CONV;
    15 KERNEL_SIZE = 5;
    16 KERNEL_AMOUNT = 7;
    17 WEIGHT_DECAY = 1e-6;
    18 POOLING_DIM = 2;
    19 ]
    20 
    21 [
    22 LAYER = CONV;
    23 KERNEL_SIZE = 5;
    24 KERNEL_AMOUNT = 9;
    25 WEIGHT_DECAY = 1e-6;
    26 POOLING_DIM = 2;
    27 ]
    28 
    29 [
    30 LAYER = FC;
    31 NUM_HIDDEN_NEURONS = 256;
    32 WEIGHT_DECAY = 1e-6;
    33 DROPOUT_RATE = 0.5;
    34 ]
    35 
    36 [
    37 LAYER = FC;
    38 NUM_HIDDEN_NEURONS = 256;
    39 WEIGHT_DECAY = 1e-6;
    40 DROPOUT_RATE = 0.5;
    41 ]
    42 
    43 [
    44 LAYER = SOFTMAX;
    45 NUM_CLASSES = 10;
    46 WEIGHT_DECAY = 1e-6;
    47 ]
    1)IS_GRADIENT_CHECKING 这是一个debug选项(其原理可以参考斯坦福深度学习的教程)。如果你修改了代码,建议你设置为true。你必须确保(g(s + delta) - g(s - delta)) / 2 约等于g(s)。他可以辅助你判断目前的代码是否存在bug。
    2)BASH_SIZE,我们训练的方法是mini-batch,这个数值的设置对于收敛的结果和速度都是有影响的。建议可以尝试50,100,150,200等,你会得到不同的试验结果。

    接下来的几个参数都是用来克服overfitting的,对于深度学习而言,训练样本越多,效果会越好。所以我们对于训练数据必须加以扩展。

    3)CROP是裁剪参数,假设图像大小为ImgSize,那么是最终训练的数据应该是ImgSize-CROP,裁剪的窗口起点是随机的,也就是一张图片已经变成了CROP*CROP张图片了。
    4)ROTATION是旋转,这步操作对于手写数字非常有效,但是你必须确保旋转的角度不要过大,比如13度,那么最后代码训练的图片都会被随机的旋转角度[-13,13],这是一个区间。
    5)DISTORTION又称为畸变,这个也比较适合手写数字,参数越大,图片变化越大,从大量实验看,针对手写数据集,设置为3.4是比较合适的,原理参考论文Best Practices for Convolutional Neural Networks Applied to Visual Document Analysis
    6)SHOWIMAGE这是一个debug选项,3)-5)都是对图片做一些变化,如果你想知道变化的效果,那么可以把这个参数设置为true,这样你就可以看到变化之后的效果。方便你更好的调整3)-5)这些参数。

    目前试验结果
    1、对CIFAR-10数据集进行了比较短时间的训练(没有对数据进行变化),测试准确率是81.37%,接近于https://code.google.com/p/cuda-convnet/ 的初步结果,这样一个试验结果已经足够说明代码的正确性了。
    我最初的代码是参考http://eric-yuan.me/cnn3/,Eric加入了不少东西,但是针对CIFAR-10他只是得到了71%的正确率,我能够等到更高的正确率归功于CUDA加速,使得我可以设置规模更大的网络,仅此而已。
    当然,在我的第三个大版本中,我会确保针对cifar-10数据集,我能够得到接近于所有公开结果中最好的实验结果。
    2、针对mnist数据集,依然可以轻易的实现99%以上的正确率。

    第3个版本的主要任务。
    1、在实现第二个版本的时候,我fix了大量的bug,你要清楚,一个大型项目不可能没有bug的,只要他不影响工作,目前从试验效果看,第二个版本已经稳定了。
    2、目前我的网络结构依然太单一了,第3个版本的核心任务就是加入如下两个特性:
    1)参考Notes on Convolutional Neural Networks第3.3节,Learning Conbinations of Feature Maps。
    2)参考ImageNet Classification with Deep Convolutional Neural Networks第3.3节,Local Response Normalization。
    这两个特性是非常重要,可以非常显著提升数据集CIFAR-10的准确率,你会在第3个版本看到这两个特性,并且通过配置文件决定是否使用它们进行训练(因为针对mnist你并不需要这么复杂的特性,加入会降低运算效率)。





  • 相关阅读:
    Jenkins的安装及使用[转]
    JAVA服务巡检项
    Kafka小结
    网络是怎样连接的
    redis扩容手册
    [WinUI3] 如何自定义桌面应用标题栏
    winform代码生成器分享
    微信支付微信回调通知验签
    Sql创建数据和表
    使用 链接服务器执行SELECT、UPDATE、INSERT 或 DELETE 及其它命令
  • 原文地址:https://www.cnblogs.com/zhxfl/p/4155236.html
Copyright © 2020-2023  润新知