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