深度學習 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你並不需要這么復雜的特性,加入會降低運算效率)。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM