您的位置:首页 > 其它

Deep Learning 学习 Toolbox学习记录一 CNN例子的学习理解

2014-03-17 21:37 253 查看
Deep Learning 学习 Toolbox学习记录一 CNN例子的学习理解

结合《Note on convolutional neutral networks》

一、卷积层

0、CNN中卷积核k与普通神经网络权值W的关系

普通神经网络中的输入a与权值W的乘积,可以表示成a*W',向量a和W中对应元素乘积再求和。与普通神经网络不同的是,CNN中输入a和权值W都是以方阵形式表示,Toolbox中a和W是5x5方阵。要实现a和W中元素一 一对应相乘求和,可以将a和W展开成向量相乘,也可以应用卷积运算来实现。但是由于卷积运算会把乘数矩阵翻转180°,则必须将所需要的权值W元素翻转,构造成卷积核k,再将a与k卷积,这样就实现了a和W中元素一
一对应相乘。看似两个方法计算量差不多,但CNN输入图像远大于感受野大小时(与卷积核大小相同),向量乘积的运算会变的非常复杂(需要提取相同大小的块,reshape成向量相乘),而卷积运算不受原图大小限制,能够自动移位计算,得到了极大的简化。
CNN的权值共享概念就是针对同一幅图,神经网络的权值都是同一个卷积核,一个卷积核可以实现整幅图的一种特征提取。

理解:CNN要求实现神经网络的权值共享和感受野,就要把两个方阵(权值矩阵和图像的patch)各个元素对应相乘,并且乘数矩阵(即权值矩阵)可以自动平移和原图其他部分也相乘,最好办法就是使用卷积运算。只要在卷积运算之前,将乘数矩阵(权值矩阵)rot180°得到卷积核,例如[1,2;3,4]rot180后变成[4,3;2,1],然后去卷积原图,就相当与“扫描”过去似的。rot180相当于向量转置一样,把矩阵元素重新排列了。

1、CNN的卷积不是数学意义上的卷积,而是Matlab的conv2的valid型

5x5经过3x3的卷积kernel卷积后得到3x3



2、对于同一个输入map,它连接到不同输出map所采用的卷积核是不同的。

这里可以结合toolbox理解

原文:however for a particular output map, the input maps will be convolved with distinct

kernels. That is to say, if output mapj and mapkboth sum over input mapi, then the kernels

applied to mapiare different for output mapsjandk.

3、反向传播=卷积层的残差计算delta,进而求取梯度

卷积层C1的上一层是下采样层S2,如何根据采样层S2的残差d(2)计算卷积层C1的残差d(1)?

关键在于如何处理卷积层特征图大小(28x28)与下采样层特征图大小(14x14)不同的问题。

Note中采用了一种“上采样”的概念,将下采样层S2特征图扩展,使得其大小和卷积层C1特征图相同。原文:

To compute the sensitivities at layer `efficiently, we can upsamplethe downsampling layer’s sensitivity

map to make it the same size as the convolutional layer’s map.

接下来求残差δ的过程和神经网络差不多

①定义δ



②输出层δ



③反向传播其他各层δ



④CNN的卷积层的δ计算

由于C1层到S2层连接的神经网络只有一个单元及一条连接,(如下图Wx+1),即③中的权值W只是一维的常数。





β表示权值,up()表示上采样。toolbox中β=1。

⑤求卷积层C1参数卷积核k、偏移b的修正量Δk、Δb,W是权值=rot180(k),x是上一层的输出。

正如0点所述,卷积运算是将运算对象翻转180°再对应相乘,这里要根据C1层的残差δ来计算出修正量Δk、Δb。

首先,将δ矩阵rot180°,与x卷积得到δ与x元素一
一对应的乘积,即得到了权值修正量ΔW,要得到Δk需将ΔW翻转180°,实际运算如下。

原文Here we rotate theδimage in order to perform cross-correlation rather than convolution, and rotate

the output back so that when we perform convolution in the feed-forward pass, the kernel will have

the expected orientation.

二、采样层

1、采样层残差



2、采样层权值修正量





由于大小不同,需要将卷积层C的输出进行下采样再计算。

Toolbox 里边没有更新权值,这和它模型设置相关,其下采样层只是简单的将4像素求和平均,没有引入神经网络,也就没有参数更新的问题。

三、整个网络输出层

0、首先明确CNN输出层是一个12x(4x4)单元,而整个网络输出长度为10的向量(与标签y相同,向量的10个元素表示数字0~9)。

1、特征向量

Toolbox里边CNN网络最后一层输出有12个4x4的特征图,即CNN将原图28x28=784降维成12x4x4=192维。然而192维特征还是太大了,再设计一个简单神经网络,其输入层为192,输出层为10(这是因为标签是长为10的向量)。这样就得到了原图的特征向量,与标签y对比可以得到2中的残差od。

2、残差计算

最终输出长为10的向量,与标签向量y相减得到误差e,进而计算残差net.od = net.e .* (net.o .* (1 - net.o)); 这里可以根据普通神经网络计算方法得到。同样的根据普通神经网络的残差计算,得到该神经网络输入层向量化的残差net.fvd = (net.ffW' * net.od) *f'(*); 其中f'(*)是sigmoid激活函数的导数,f'(*)= net.fv
.* (1 - net.fv)。

关键在于必须将残差fvd反向传播到CNN各层中去,这就必须将残差fvd进行reshape,将该向量转换成12*{4x4}单元——即得到CNN输出层的残差d(n)。

这样就可以根据一、二中C层S层残差计算方法得出CNN各层的残差d(i)。

3、权值修正量

方法同普通神经网络。

四、分类器设计

Toolbox只是单纯的提取出CNN输出特征向量的最大值在向量里的位置,位置对应于10个数字0~9,如向量L1=[0 0.9 0.1 0.2 0 0 0 0 0 0 ],0.9最大,在第二个位置,分类到数字1的类中。

当然也可以进行其他分类器设计,CNN的主要任务是进行特征提取,对应分类器设计没有要求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: