CNN

我们先来说明为什么将CNN用在图像中,也即是介绍CNN的三大特性

1.局部感知

我们不用为了检测某个pattern而去一次性看整个图像,我们可以每次只看一个图像的局部,因为每个pattern一般不会占据整张图像,每次都看图像的一部分时可以减少参数的使用。

2.权值共享

我们要检测到图像中的某种pattern,但是我们不在乎这种pattern在图像的什么位置。不同位置有相同的pattern,他们共享相同的参数,此时可以减少参数的数量。

3.池化

我们可以通过下采样缩小图像的大小,但是不会影响我们识别图像,这样的话就可以减少参数

接下来我们认识一下CNN一般的结构是什么样的,如下图:

CNN的三大特性由其中不同的块来实现,如下图:

其中的convolution和max pooling可以重复使用。

对convolution做一个详细的说明,我们使用filter来寻找图像中的pattern,过滤器通常是小于图像大小,即局部感知,每一个过滤器捕捉图像的一个pattern,不同的filter捕捉不同的pattern,在filter遍历整个图像时,每次的stride(步长)也是由我们人为来决定。另外如果我们的图像是单通道的,那么filter的大小也是二维的,如果我们的图像是多通道的,那么filter的大小也就是多维的。首先我们来看看filter对图像的局部感知。

在上图中的步长是1,如下图所示是步长为2的

然后我们来分析当步长为1时,filter1捕捉的是图像的什么特性,看下图

filter1的对角线的数值都是1,然后它就捕捉到了在图像中对角线为1的pattern,并发现在图像中两个局部区域都存在该pattern。

如上图所示,一个filter产生一个feature map,有多少个filterji就会产生多少个feature map.

如上图所示,正如我们之前所说的,我们的图像有3个通道,所以我们的filter也有3维。

接下来我们来对CNN和全连接做个对比,为什么说CNN可以减少参数。如下图

我们将CNN映射到全连接,就是将图片展开,比如我们要得到第二层的神经元3,那我们就是将输入层的1,2,3,7,8,9,13,14,15这9个神经元连到第二层的神经元3,他们的权重就是filter中对应的值,也就是说我们在得到第二层的神经元3的时候我们没有使用输入层的所有神经元,我们只用了输入层的9个神经元,所以因为局部感知减少了参数的数量。我们再看第二层的神经元-1,也是输入层的9个神经元连接到该神经元,而且他们的权重仍然是filter中对应的值,也就是说在得到第二层神经元3和神经元-1的时候他们使用的参数是相同的,他们结果的不同是因为输入的神经元不同,所以此时又因为权值共享减少了参数数量。

接下来我们看maxpooling.maxpooling在自己选定的局部图像中选择局部中的最大值来代替这个局部图像,当然也可以使用averagepooling,使用局部图像的平均值来代替这个局部图像。通过使用maxpooling,我们的图像就会变小,因为我们使用一个值来代替了一个局部的图像。如下图所示

我们看右上角蓝色的filter,在这里设置maxpooling的局部图像大小维2*2,第一个2*2的局部图像中的值是-1,-1,-1,-1,我们选择他们中的最大值即-1作为maxpooling的结果,第二个2*2的局部图像中de的值是-1,-1,-2,1,我们选择他们中的最大值即1作为maxpooling的结果,依次类推我们就可以得到右下角的蓝色的pooling结果图。所以没经过convolution和maxpooling就产生了新的图像。

接下来我们看CNN结构中的Flatten,Flatten将图像展开成一个向量,方便与后面的全连接做运算。

这里还需要注意经过convolution之后图像尺寸的计算,如果padding设置为'same',当对原始图像扫描到边缘不够filter的大小时,它会做填充使其做卷积操作。当padding设置为'valid'时,不对原始图像填充,当到边缘时,该图像的边缘部分不够filter的大小时会直接舍弃,我们用下面的图形象解释:

valid模式如下

same的模式如下图:

在这两种情况下,其卷积之后图像大小的计算也不同。

我们先来定义一些变量。

我们分别从valid和same两个角度来做计算

另外一个地方需要注意的是在卷积中使用的参数个数,如下图所示:

使用了6个5*5*3的卷积核,我们只需要把每个filter的参数累加起来,当然,不要忘了加上bias:5x5x3x6 + 6 = 456。

我们最后分析CNN到底在干嘛,解释性都觉得很差。

第一个方向,可以去看第一个卷积之后的输出,因为第一卷积的输入我们是可以知道的,那我们就可以有对比性的来看第一个卷积之后的输出。

第二个方向,对图像做些处理,比如覆盖,去看图像中的哪一部分对卷积做出正确判断是重要的,那我们就可以知道CNN没有瞎做,它是有目标的,只是我们很难理解,比如下图。

下面蓝色部分对应的原始部分图被遮挡,CNN就做不出正确判断。

还有下面的图

下面的白色部分表示CNN做出正确判断贡献最大的部分。

最后的最后,我们来分析Why CNN for playing Go?

局部感知和权值共享在下棋中是合理的,也是有用的。

但是池化就不合理了,难道我们可以把原始棋盘的行中某些棋和列中某些棋删掉并且还不影响棋的结果吗,显然不是的,当然不能删。通过看go的网络结构,它并没有使用maxpooling.所以在写网络结构的时候,人家有认真的思考CNN的特性以及任务特性的吻合度,从而做出一定的调整,所以是有一定的依据可循的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值