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,这就算概率最大池化的地方