CRBM_demo
2016-08-25 15:35:05 0 举报
AI智能生成
CRBM_demo
作者其他创作
大纲/内容
参数定义
dataname:输入数据
ws:卷积核大小,方形的
num_bases:核的个数
pbias:偏置初始值
pbias_lb:好像没用
pbias_lambda:作用于权重,用处待定
spacing:修剪图像大小,以免池化的时候除不尽
epsilon:学习率
l2reg:作用于权重,用处待定
batch_size:批处理大小,即每批数据大小
读取图像sample_images_all
转化灰度图,裁剪512*512大小
白化处理
零均值处理,后面还有一堆不清楚是什么预处理
训练:第一个for循环,总共pars.num_trials次
随机打乱样本,十个样本变为随机五十个重复样本
第二个for循环,按次序训练五十个样本
取出一个样本
第三个for循环,分批处理,每批batch_size=2大小
在此样本图片中取随机范围的像素70*70,并零均值处理
trim_image_for_spacing_fixconv:修剪图像,使其为卷积层大小(size-ws+1)为偶数,因为后面池化层是2*2大小,免得除不尽。图像变为69*69大小
以一定概率旋转图像180°,为了使模型具有旋转不变性?
更新RBM,fobj_crbm_CD_LB_sparse
正向过程positive phase
crbm_inference:前向计算,也就是从输入层到卷积层的计算,结果为60*60*24大小poshidexp(matlab中有conv2函数进行二维卷积)
先得到卷积后隐藏层的单元值, conv2_mult(imdata(:,:,c), H, 'valid')代表对数据imdata(其实是69*69)用卷积核H(10*10*24)去卷积
然后将卷积得到的隐单元值加上对应偏置
crbm_sample_multrand2:下采样并激活,激活情况poshidstates为0或者1,大小60*60*24;poshidprobs为激活概率值
第一步求指数poshidprobs = exp(poshidexp)
定义池化层单元数(2*2+1)*(60*60*24)/(2*2)=5*21600,最后一行为全1,应该跟1*2对应的一个池化单元有关
下采样方法是一次去取2*2的对应四个角的元素值,作为池化层的单元,好像并没有用到论文提到的概率最大池化,继续看下一步
multrand2:这个函数貌似就是概率最大池化,对下采样得到的矩阵进行计算得到两个参数,S1为0或1,P1为除以均值以后的矩阵
P = P./repmat(sum(P,2), [1,size(P,2)]);将P均值化以后可以保证2*2的隐单元和对应的一个池化层单元的和为1
使用随机数激活这五个单元,得到结果temp,可以发现最后一个单元也就是偏置一直是激活状态,值为1,因为它本身经过cum加和以后值就是1
接下来计算对temp进行一阶梯度的计算,Sindx = diff(temp,1,2);发现很神奇的地方,这一步以后Sindx每一行4个单元至多有一个为1
得到的S矩阵,每一行至多只有一个激活单元1,这就算概率最大池化的地方
crbm_vishidprod_fixconv:利用v和h(非被激活后的二值value)求连接权重
squeeze:去掉维度为1的维度,如果不用squeeze,那么结果就是1*1*24的矩阵
反向过程negative phase
对比散度算法
crbm_reconstruct:反向重构可见层数据
crbm_inference:反向推出可见层预测数据以后,依据可见层数据进行前向计算
crbm_sample_multrand2:根据概率值激活单元
crbm_vishidprod_fixconv:利用新的v和h推导连接权重
squeeze:去掉维度为1的维度
计算重构误差均值:ferr = mean( (imdata(:)-negdata(:)).^2 )
权重以及偏置更新
权重梯度:dW_total=(posprods-negprods)/numcases1 - l2reg*W- pars.pbias_lambda*dW;
隐藏层偏置梯度:dh_total = (poshidact-neghidact)/numcases1 - pars.pbias_lambda*dhbias
可见层偏置:一直为0
根据梯度更新模型参数,与RBM类似
根据dw求更新后的权重W
根据dh求更新后的偏置hbias_vec
可见层偏置一直为0
0 条评论
下一页