您的位置:首页 > 其它

deep learning toolbox学习4之CNN

2014-03-06 21:13 274 查看
看了论文和博客,对于CNN还是有些模糊,索性直接看代码,下面总结一下Toolbox中CNN的过程:

网络结构是采用1-6c-2s-12c-2s的结构,对于初始层,相当于只有一层特征层作为输入,然后是CNN中所特有的c层和s层,这里说一下c层和s层,c层就是convolutional层,将输入层通过不同的卷积核map到几个特征层上,这里面就涉及到卷积操作和CNN的一大卖点共享权重,这一层主要相当于特征提取;然后是s层,就是subsampling层,也就是需要进行pooling操作的层,这一层相当于特征压缩。对应到上述网络结构就是一层输入层->6个c层特征图(需要6个卷积核)->6个s层(这里的2s是指pooling的scale大小是2,即2*2的进行pooling)->12个c层(从6个s层作为输入,需要12个卷积核)->12个s层(pooling
scale size是2),最终的输出层再作为分类器的输入,进行结果的矫正。

1.数据初始化

将x的784维reshape成28*28的2D输入,依旧是做归一化处理;定义5层网络结构(i1-c2-s3-c4-s5):

对于c2和c4层定义mapsize,分别从28*28map到24*24以及12*12map到8*8,因为kernelsize=5。定义输入层的各个特征层到输出层(即输入的上一层)的各个特征层的卷积核,定义fan_out和fan_in用于卷积核部分,对于卷积核的定义,k_ij = (rand(n_l.kernelsize) - 0.5) * 2 * sqrt(6 / (fan_in + fan_out),直观上来看就是随机生成一个5*5的卷积核矩阵,k_ij是指输入层的第i个特征图到输出层的第j个特征图之间的卷积核。定义每个输出层的每个特征图的bias,即每个特征图对应一个b。

对于s3和s5两层,定义mapsize,显然在c层基础上减半,因为在s层没有做卷积运算,所以只需要定义各个特征图的bias即可

Q:在Notes on Convolutional Neural Networks这篇论文中,对于s层也涉及卷积,因为卷积运算对于ff和bp过程是有影响的,这里没有?

Q:定义隐藏层的大小fan_out,是一个(后层特征图数量)*(用来卷积的patch图的大小) ;定义fan_in对于每一个后层特征图,有多少个参数链到前层?

最后定义输出层和分类器层,显然最后输出神经元个数为4*4*12,定义b和w,w的定义和前面卷积核采用相同定义方式。

2.训练阶段

大体过程和NN过程类似,这里是50个作为一个batch,因此每次输入的数据为28*28*50

2.1feedforward pass阶段

在ff阶段,也是分为c层和s层的处理。

对于c层,对于每个特征层(注意区分c层是指五层网络中的,特征层是指该层分为的特征层),计算输入层的每个特征层到与该层的卷积,并求和作为权值和z,类似于NN中的W*x的结果,只不过这里使用的卷积操作来代替NN中的*,28*28的输入map与5*5的卷积map做卷积后便是24*24的,对于该map层的激活值a_lj(l表示层数,j表示特征层数)=sig(z+b_j),如此得到c层各个map层的激活值a,作为下层(s层)的输入

对于s层,对下层的每个map输入层,做pooling操作,将pooling操作结果作为该层各个特征层的激活值,对于pooling操作,原本的理解是将2*2块做平均或取最大操作即可,这里作者的处理还有点不理解,这里做的是mean pooling:

Q:作者是将下层a与2*2的值为0.25的卷积核做卷积,得到的矩阵横竖方向各隔1取值作为pooling 结果?

最后的分类器层,将每个的4*4*12的特征(50个一个batch)化为192,即将12个层次的2d图像化为1层的1d特征作为分类器输入,然后使用w和b用sigm函数分类,如此ff过程结束。

2.2back propagation阶段

这里的bp过程基本和NN类似,公式部分也很相似,大体思路一样计算顶层和下层的残差,根据残差得到梯度,根据梯度来更新w和b,这里的w是卷积核k。

首先计算顶层的残差,此时是192*50的,当计算下层的时候,需要reshape出各个map层,比如顶层需reshape出12*4*4*50的结构。

对于c层层数l的各个特征层j:

d_lj = a_lj.* (1 - a_lj) .* (expand(d_l+1_j,[2,2,1])/ net.layers{l + 1}.scale ^ 2);该式子前部分就是求f’,和NN中一样,后半部分将上一层残差d poolin的每个值变成2*2相同的值,再除以4,个人感觉这里相当于NN中的w_l'*d_l+1的部分,(NN中d_l = w_l' * d_l+1 * f')

Q:这里的原理?

对于s层层数l的各个特征层i:

如何求i层的残差d呢,需要将l+1层的各个map层j与 将第i层到j层的卷积核做rot180处理后 再做卷积运算,个人理解就是卷积的逆运算,

例如现在要将c412个map层8*8的残差传递到s3层6个map层12*12,定义z为12*12*50

for i = 1 to 6

for j = 1 to 12

z=z+conv(d_l+1_j,rot180(k_l+1_ij))

d_l_i = z

如此可以计算c和s层的残差,下面根据残差计算下降的梯度,由于只有c层用到了sigmoid函数,因此只需要对c层进行计算,对于b的下降梯度和NN一样直接使用残差即可,对于w也就是这里的k,NN中是d*a,这里是采用卷积操作,依然涉及到rot操作。

可以参考之前的NN部分的bp的过程,就知道此处d*a的含义。

最后便是根据梯度来更新k和b,依然有学习率的参与,NN中的其他防止过拟合的参数没有涉及目前。

如此完成训练阶段

3.测试

和NN一样,用训练好的各层k和b,再对testx进行一次卷积前向传播过程,与y比较,可以分析效果。

目前来看,感觉CNN很慢,原因?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: