深度学习 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你并不需要这么复杂的特性,加入会降低运算效率)。