DL:Convolutional Deep Belief Networks(CDBN) 代码(matlab)理解

本文详细解析了CDBN的代码实现,介绍了代码配置、编译步骤及数据处理方法。对比了不同计算方式下的实验效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近看了论文CDBN 的论文和代码,现将对代码的理解稍作整理。

有关论文的一些网址:

[1] CRBM http://qipeng.me/software/convolutional-rbm.html 

[2] CRBM 论文笔记 http://www.cnblogs.com/lijingcong/p/4113143.html

[3] CDBN paper http://ai.stanford.edu/~ang/papers/icml09-ConvolutionalDeepBeliefNetworks.pdf

[4] CDBN matlab 代码 http://www.adv-ci.com/blog/source/cdbn/


相关代码的配置,编译


相关介绍


本代码支持both binary and Gaussian visible types

在介绍网站上,只在Ubuntu 10.0464-bit)上测试过,所用的编译器是GNU C/C++ MatlabCUDA 5.0 or above

本实验机33 CentOS6.5CUDA 6.5 


Build 


(1)打开terminal 将路径定位到 CDBN/toolbox/CDBNLIB/mex 

(2)打开 Makefile 文件,修改 MATLAB_DIR= &CUDA_DIR

MATLAB_DIR = /usr/local/MATLAB/R2011a

CUDA_DIR = /usr/local/cuda-6.5

(3)Make

 

经查该错误,发现是由于make里面的target已经存在,所以make什么都没做,只需将mex文件夹中的.mexa64 .o文件都删除,然后再makeOK了。


Run


1)运行 ‘setup_toolbox.m

2)运行‘DemoCDBN_Binary_2D.m’ 

如果前面make不成功,提示nothing to be done for target’,后面用mexcuda计算,都会提示错误



我对代码的理解


关于作者所使用的数据

1)数据

CDBN代码里面有两种数据mnistSmall.mat 9幅 MITcoast图像

2)作者如何使用

作者在做实验的时候对binary dataGaussian data做了不同的处理,认为mnistSmall databinary dataMITcoast dataGaussian dataGaussian data会经过一步whiten


(3)用Binary data 和 Gaussian data做了什么实验

对于Binary data,包括训练model+softmax分类,测试集进行预测

对于Gaussian data,由于原始的是coast图,且只有9幅,所以仅仅是对其进行训练,并没有进行分类。


关于pooling层不能正好整除的问题


从代码来看作者将卷积层和池化层关联在一起,共同作为一个layer。在训练某一layer的时候,首先需要对input data 做一下预处理。第一项就是对于pooling层不能整除的问题,代码上来看会是去除掉多余的行数,具体的做法如下code


[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function [layer] = preprocess_train_data2D(layer)  
  2.   
  3. %%  
  4.   
  5. % Here you should preprocess your code for pooling layer  
  6.   
  7.   
  8. mod_1 = mod((size(layer.inputdata,1)-layer.s_filter(1))/layer.stride(1)+1,layer.s_pool(1));  
  9.   
  10. if mod_1~=0  
  11.   
  12.    layer.inputdata(1:floor(mod_1/2),:,:,:) =[];  
  13.    layer.inputdata(end-ceil(mod_1/2)+1:end,:,:,:) =[];  
  14.   
  15. end  
  16.   
  17.   
  18. mod_2 = mod((size(layer.inputdata,2)-layer.s_filter(2))/layer.stride(2)+1,layer.s_pool(2));  
  19.   
  20. if mod_2~=0  
  21.   
  22.    layer.inputdata(:,1:floor(mod_2/2),:,:) =[];  
  23.    layer.inputdata(:,end-ceil(mod_2/2)+1:end,:,:) =[];  
  24.   
  25. end  
  26.   
  27.   
  28.   
  29. if layer.whiten  
  30. if strcmp(layer.type_input, 'Gaussian')  
  31.   
  32.     m = size(layer.inputdata,4);  
  33.     n = size(layer.inputdata,3);  
  34.   
  35.     for i = 1 : m  
  36.         for j =1 : n  
  37.             layer.inputdata(:,:,j,i) = crbm_whiten(layer.inputdata(:,:,j,i));  
  38.         end  
  39.     end  
  40.       
  41. end  
  42.   
  43. end  

训练CRBM时(包含pooling层),使用的三种不同计算方式

可以选择不同的计算方法 matlab matrix computationMEXCUDA,可以在'CDBN/toolbox/CDBNLIB/default_layer2D.m'中修改计算方法

layer.matlab_use = 0; layer.mex_use = 1; layer.cuda_use = 0;

也可以在层次的定义的时候修改计算方法:如在'DemoCDBN_Binary_2D.m' 第一层的定义的之前加入一行 

layer{1}.matlab_use = 0; layer{1}.mex_use = 0; layer{1}.cuda_use = 1;

(1)matlab matrix 计算

卷积计算是用一个卷积核对前一层的所有的map进行卷积,然后将结果相加,得到新的feature map。再用第二个卷积核进行卷积求和

① 前向

卷积求和后的结果为h_input,(block的大小与h_input一样。S_pool = 2 2】,即block的 s_pool区域内的值为该区域h_input值的的和)

Binaryh_sample = exp(model.h_input)./(1+block);

Gaussianh_sample = exp(1.0/(model.start_gau^2).*model.h_input)./(1+block);

② 反向

H_state = 二值化(h_sample

V_input  = 卷积 h_state 求和

BinaryV_sample = sigmoidv_input

Gaussianv_sample = v_input

 

(2)Mex 计算

几个MEX调用C的函数库 

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. mxCreateCellArray  创建n维元胞mxArray  
  2. mxCreateCellMatrix  创建二维元胞mxArray  
  3. mxCreateCharArray  创建n维字符串mxArray  
  4. mxCreateCharMatrixFromStrings  创建二维字符串mxArray  
  5. mxCreateDoubleMatrix 创建二维双精度浮点mxArray  
  6. mxCreateDoubleScalar 创建指定值的二维精度浮点mxArray  
  7. mxCreateLogicalArray 创建n维逻辑mxArray,初值为false  
  8. mxCreateLogicalMatrix  创建二维逻辑mxArray,初值为false  
  9. mxCreateLogicalScalar  创建指定值的二维逻辑mxArray  
  10. mxCreateNumericArray  创建n维数值mxArray  
  11. mxCreateNumericMatrix  创建二维数值mxArray,初值为0  
  12. mxCreateScalarDouble 创建指定值的双精度mxArray  
  13. MxCreateSparse 创建二维稀疏mxArray  
  14. mxCreateSparseLogicalMatrix 创建二维稀疏逻辑mxArray  
  15. MxCreateString 创建指定字符串的1 n的串mxArray  
  16. mxCreateStructArray  创建n维架构mxArray  
  17. mxCreateStructMatrix  创建二维架构mxArray  
  18.    


 

(3)CUDA计算


mex计算和cuda计算,具体的计算方法是和matlab matrix的计算方法是一样的,只是用的不同的语言实现


问题

对于Binary data,用mex计算的结果会比cuda计算的结果好。

Mexaccuracy  94.45% sparsity value不为0finetune迭代 100

Cudaaccuracy 10.45%  且 sparsity 0finetune迭代5

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值