卷积神经网络(CNN)的一些简单思考

上篇CNN入门在宏观上介绍了CNN的卷积和运算。但是由于我不是数学专业的,所以对卷积的理解还是不是很深刻。因为想到为什么对图像进行卷积操作可以学习到图像的特征,这其中到底什么原因。Pooling的作用是什么,还有CNN的网络结构必须要是像 Yann LeCun提出的那样。Convolutions,Pooling,Full Connection这样交替吗?还有卷积网络有那些改进。所以我才有了这篇文章。由于卷积是图像处理里的相关知识。所以先对图像处理进行复习了。
图像的滤波基础
空间滤波:领域原点从一个像素向另一个像素移动,对领域的像素应用算子T,并在该位置产生输出。这样,对于任意指定的位置(x,y),输出图像g在这些这些坐标的值就等于对f中以(x,y)为原点的领域应用算子T的结果。领域与预定义的操作在一起称为空间滤波器。
空间滤波器由(1)一个领域(典型地是一个较小的矩形),(2)对该领域周围的像素执行的预定义操作组成。。滤波产生一个新像素,新像素的坐标等于领域中心的坐标,像素的值的滤波操作的结果。滤波器的中心访问输入图像中的每个像素,就生成了处理(滤波)后的图像。如果在像素上执行的是线性操作,则该滤波器称为线性空间滤波器。否则,滤波器就称为非线性空间的滤波。
在执行线性空间滤波时,有两种操作,第一是相关,第二是卷积。相关是滤波模版移过图像并计算每个位置乘积之和的处理。这个和卷积的操作类似,但是卷积7滤波器首先要旋转180。总结一下。一个大小为m*n的滤波器w(x,y)与一副图像f(x,y)做相关操作,可以表示为

w(x,y)f(x,y)=s=aat=bbw(s,t)f(x+s,y+t) w ( x , y ) ⋅ f ( x , y ) = ∑ s = − a a ∑ t = − b b w ( s , t ) f ( x + s , y + t )

这一等式对所有位移量x和y求值,以便w的所有元素访问f的每一个像素,其中我们假设f已被适当的填充。正如早些时候解释的那样,a=(m-1)/2, b=(n-1)/2.同时,为了表示方便,我们假设m和n是奇整数。类似地
w(x,y)和f(x,y)的卷积表示为 ,它由下式给出
w(x,y)f(x,y)=s=aat=bbw(s,t)f(xs,yt) w ( x , y ) ⋅ f ( x , y ) = ∑ s = − a a ∑ t = − b b w ( s , t ) f ( x − s , y − t )

其中等式右侧的减号表示翻转f(即旋转180)。为了简化符号表示,我们遵循惯例,翻转和移位w而不是f.
上面介绍了图像处理中的滤波。那么下面正式介绍一下卷积的概念
图像卷积(模版)
(1)使用模版处理图像的相关概念
模版:矩阵方块,其数学含义是一种卷积运算。
卷积运算:可看作是加权求和的过程,使用到的图像区域中每个像素分别于卷积核(权矩阵)的每个元素相对应相乘,所有乘积之和作为区域中心像素的新值。
卷积核:卷积时使用到的权用一个矩阵表示,该矩阵是一个权矩阵。
(2)使用模版处理图像问题(越界问题)
边界问题:当处理图像边界像素时卷积核与图像使用区域不能匹配,卷积核的中心与边界像素点对应,卷积运算将出现问题。
处理办法:A.忽略边界像素,即处理后的图像将丢掉这些像素。
B.保留原边界像素,即copy边界像素到处理后的图像

我们来看一下一维卷积的概念
连续空间的卷积定义:f(x)与g(x)的卷积是f(t-x)g(x)在t从负无穷到正无穷的积分值。t-x要在f(x定义域内,所以看上去很大的积分实际上还是在一定范围的。实际的过程就是f(x)先做一个Y轴的反转,然后再沿X轴平移t就是f(t-x),然后再把g(x)拿来,两者乘积的值再积分。想象一下。如果g(x)或者f(x)是个单位阶越函数。那么就是f(t-x)与g(x)相交部分的面积。这就是卷积了。把积分符号换成求和就是离散空间的卷积定义了,那么在图像中卷积是什么意思呢。就是图像是f(x),模版是g(x),然后g(x),然后将模版g(x)在图像中移动,每到一个位置,就把f(x)与g(x)的定义域相交的元素卷积。卷积的定义上是线性系统分析经常用到的。线性系统就是一个系统的输入和输出的关系的线性关系。就是说整个系统可以分解成N多的无关独立变化,整个系统就是这些这些变化累加。如果x1->y1,x2->y2;那么A*x1+B*x2->A*y1+B*y2.这就是线性系统。表示一个线性系统可以用积分的形式如 Y=f(t,x)g(x)dt Y = ∫ f ( t , x ) g ( x ) d t 。看上去很像卷积。如果f(t,x)=F(t-x)不就是了吗。从f(t,x)变成F(t-x)实际上是说明f(t,x)是线性位移不变,就是说变量的差不变化的时候,那么函数的值不变化。实际上说明一个事情就是说线性位移不变的系统可以通过输入和表示系统特性的函数的卷积得到。
看了滤波和卷积的知识那两个到底什么关系呢?
由上我们可以看出图像卷积是一种实现手段,不管是滤波还是别的什么,可以说是数学在图像处理的一种延申。当然卷积不光在图像中有使用。在物理,数学等都有十分广泛的使用。
而图像滤波是一种图像处理方法。即在尽量保留细节特征的条件下对目标图像的噪声进行抑制,是图象预处理中不可缺少的操作。其处理效果的好坏直接影响后续图像和分析的有效性和可靠性。
上面介绍了图像处理方面的卷积的特性。从上可以看出卷积是滤波中的一种操作。那么说了这么多图像处理的卷积知识,那么它到底和CNN的卷积有什么关系呢。
所以下面正式介绍我们的主角。
在稀疏自编码中我们把输入层和隐含层进行全连接的设计。从计算的角度来讲,,从整副图像中计算特征是可行的。但是如果从更大的图像通过这种全连接学习整幅图的特性就变的非常耗时了。为了解决这种问题我们对隐含层和输入单元的连接加以限制:每个隐含单元仅仅只能连接输入的一部分。例如,每个隐含单元仅仅连接输入图像的一小片相邻区域。这种部分联通的思想,也是受启发于生物学里的视觉系统结构。视觉皮层的神经元是局部接受信息的(即这些神经元只响应某些特定的区域的刺激)
自然图像有其固有的特性,也就是,图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特性也可以用在另一部分上,所以对于这个图像的所有位置,我们都能使用同样的学习特征。更恰当的解释是,当从一个大尺寸图像中随机选取一块,比如8*8作为样本,并且从这个小块样本中学习到了一学特征,这时我们可以把这个8*8样本中的特征作为探测器,应用到这个图像中的任意地方中去。特别是,我们可以从8*8样本中学习到的特征跟原本的大尺寸图像做卷积,从而对这个大尺寸图像上任一位置获得一个不同的激活值。下面给出一个具体的例子:假设你已经从一个96*96的图像中学习到了它的一个8*8的样本所具有的特征。假设这是由于有100个隐含单元的自编码完成为了得到。为了得到卷积特征,需要对96*96的图像的每个8*8的小块区域进行卷积运算。也就是说,抽取8*8的小区域,并且从起始坐标开始依次标记为(1,1),(1,2),……一直到(89,89),然后对抽取的区域逐个运行训练过的稀疏自编码得到特征的激活值。
假定给定了r*c 的大尺寸图像将其定义为 Xl X l 首先通过从大尺寸图像抽取的a*b的小尺寸样本 Xs X s
训练稀疏自编码,计算 f=σ(w1Xl+b1) f = σ ( w 1 X l + b 1 ) σ σ 是一个sigmoid型函数)得到了k个特征,其中 w1 w 1 b1 b 1 是可视层单元和隐含层单元之间的权重和偏差。对于每一个a*b大小的小图像 Xs X s ,计算出对应的值 fs=σ(w1Xl+b1) f s = σ ( w 1 X l + b 1 ) 对这些 fc f c 值做卷积,就可以得到 k×(ra+1)×(cb+1) k × ( r − a + 1 ) × ( c − b + 1 ) 个卷积后的特征的矩阵。
这里写图片描述

上面介绍了提到了卷积特征(convolved Feature)那到底这个卷积特征长什么样呢?是不是给一个人脸这特性能学习到一个鼻子?一个脸?那到底是什么呢。眼见为时耳听为虚。所以为了说明清楚我在网上随便找了二张美女的人脸图片。对这二张图片进行了简单的卷积操作。这里的特征是随机参数W,b。结果图2.在图中我们可以看到并不是我们想象的那样学习到一个鼻子或者一个眼睛的特征。而是学习到对计算机有用的特征。这个图片是用小尺寸的特征在大尺寸的图像上检索获得的激活值。才表现图2的样式。这激活函数有许多种一般使用的是sigmoid函数。当然可以使用别的。
这里写图片描述

小结一下。上面我列出了两种卷积方法。虽然都是用在图像处理方面。但是两个还是有些许的差别。在图像中进行卷积操作时对边缘进行了填充作用。最后得到和原始图片大小一样的卷积图片。而在DL 中如图1所示它没有对边缘进行扩充从而得到了(r-a+1)*(r-b+1)大小的特征图。当然后面进行反向传导求残差时也进行了扩充。当然这是后话了。这样我们可以理解卷积的操作和特征图的由来。还有为什么卷积会学习到特征了。
当然一个完整的CNN不可能就进行卷积操作。后面进行还有一个争议比较大的pooling操作。下面进入下面第二部分。Pooling操作
Pooling操作
这里先给出pooling操作的相关知识。
上面我们已经通过特征获得了特征(feature),下一步我们希望利用这些特征去做分类。理论上我们已经可以用提取到的特征去训练分类器(单独的分类器以后有机会我会单独介绍一下)了。比如用softmax分类器。但是这样的话将面临着大量的计算。也许你会说现在计算机计算能力这么强计算几张图片的需要多少计算量呀。现在假设对于一个96*96像素的图像,假设我们已经学习得到了400个定义在8*8输入上的特征,每一个特征和卷积操作得到一个(96-8+1)*(96-8+1)=7921维的卷积特征,由于有400个特征。所以每个样本(example)都会得到一个 维的卷积特征向量。当然这只是一个样本400个特征当成千上万时计算量可想而知。当然除了学习一个拥有3百多万的分类器十分不便以外,而且还容易出现过拟合。
为了解决这个问题。我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在这一个图像区域有用的特性极可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法是对不同位置的特性进行聚合统计。例如,人们可以计算图像一个区域上某个特定特征的平均值(或最大值)。这些概要统计特征不仅具有低得多的维度(相比使用所有特征提取的特征)。同时还会改善结果(不容易过拟合)。这种聚合操作就叫池化(pooling)有时也称平均池化或者最大池化。(取决于计算池化的方法)

这里写图片描述

池化还有一个好处是选择图像中的连续区域作为池化区域,并且只是池化相同(重复)的隐藏单元产生的特征,那么,这些池化单元就是具有平移不变性。这就意味着即使图像经过一个小的平移之后,依然会产生相同的(池化的)特征。
说了这么多的pooling的特性和好处。那到底要怎么进行池化呢?下面总结一下
1 一般池化(general Pooling)
这种池化操作最常见,池化作用于图中不重合的区域。具体操作如图3演示的。这里我们定义池化的大小为SizeX,即图4所示。定义两个相邻池化窗口的水平位移/竖直位移stride。一般池化由于每一窗口都是不重复的,所以sizeX=stride.
这里写图片描述
一般池化操作为平均池化mean pooling 和最大池化max pooling
平均池化:计算图像区域的平均值作为该区域池化后的值。
最大池化:选图像区域的最大值作为该区域池化后的值

2 重叠池化(overlappingPooling)
重叠池化正如名字所说的,相邻池化窗口之间会有重叠区域,此时sizeX>stride
在论文 Imagenet classification with deep convolution neural network 中krizhevsky就使用了重叠池化的操作。在其他的位置不变的情况下,top-1和top-5的错误率分别减少了0.4%和0.3%。
一般情况下作者发现训练有重叠池化的模型一般很少过拟合。这样这操作就和卷积类似了。
3 空间金字塔池化
空间金字塔池化思想来自金字塔匹配(spatial Pyramid Model)。空间金字塔池化可以把任何尺度的图像的卷积特征转化称相同的维度,这不仅可以让CNN处理任意尺度的图像,还可以避免cropping和warping操作,导致一些信息的丢失,具有非常重要的操作。
一般的CNN都需要输入图像的大小固定,这是因为全连接层的输入需要固定的输入维度,但在卷积操作是没有对图像尺度有限制,所以作者提出了空间金字塔池化

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值