CNN-卷积神经网络-network架构

CNN 是 network架构, 名 为 卷积神经网络。 它 专门用于 影像方面。

通过CNN 让大家明白:

        1、network架构设计有什么想法?

        2、为什么设计network架构,可以让我们的network结果做的更好

首先,我们以影像分类的例子(即我们给机器一张图片,它决定这张图片里面有什么东西)

举例:

将输入的图片大小固定为100x100 

ps:当就算是今天DeepLearning已经这麽的Popular,我们往往都还是需要假设说,一个模型输入的影像大小都是一样的。

图片可能有大有小,而且并不是所有的图片都是正方形,那应该怎么办呢?

今天常用的处理方式:把所有图片都先Rescale成同样的大小,然后再丢入影像的识别系统里

 那么,模型的输出是什么呢?--- 因为模型目标是分类,所以输出是一个向量,而向量的每个dimension代表一个类别。

假设我们现在类别是一个猫的话,那猫所对应的Dimension,它的数值就是1,其他的东西所对的Dimension的数值就是0

 那Dimension的数量就决定了 你现在的模型可以辨识出多少不同种类的东西。

模型的输出通过Softmax以后,输出是{y}' ,然后我们希望{y}'\hat{y}的Cross Entropy越小越好,

接下来的问题是怎麽把一张影像当做一个模型的输入:

对于一张彩色图片,他是有3个channer,这三个通道分别是颜色的RGB

而对于计算机来说,一张图片就一个 3维的 Tensor :

        一维代表图片的宽

        另外一维代表图片的高

        还有一维代表图片的Channel数目

一张彩色的图片,它每一个Pixel都是由RGB三个颜色所组成的,所以这三个Channel就代表了RGB三个颜色。

那长跟宽就代表了今天这张图片的解析度(即这张图片Pixel的数目)

 那么,怎么让图片作为network的输入呢?

因为一张图片是一个3-D Tensor,而一个3-D Tensor 还有 长度X宽度Xchannels 个数字,在这个例子中有100X100X3 个数字。

我们将这些数字统统拿来排成一排,形成一个向量,让这个向量作为network输入。

Ps:而这个向量里面,每一维它里面存的数值,其实就是某一个 Pixel某一个颜色的强度,而每一个 Pixel有RGB三个颜色所组成

在不使用network 架构时,我们只是将该向量放到全连接network中,你会发现我们需要非常多的weight参数。

 如果把向量当做Network的输入,我们Input这边Feature Vector,它的长度就是100×100×3;

如上图,假设当前第一层Neuron数目是1000个,那么这一层总共需要多少个weight参数呢?

3X100X100X1000 = 3x10^{7}(这个一个非常巨大的数目)

那么,参数数目越多,会造成什么样的问题呢?

虽然参数数目增加,但我们可以通过增加模型弹性,进而增加模型的能力。但 这样我们同样增加了Overfitting的风险。

那么,在做影像辨识的时候,我们怎样才能减少使用这么多的参数呢?

(考虑到影像辨识问题本身的特性),我们并不一定需要Fully Connected, 我们不需要每个Neuron跟输入的每个Dimension都有一个weight。

接下来就是对影像辨识这个问题,对影像本身的特性的一些观察,进而通过观察总结规律,进而找出解决问题的办法。

Observation 1

对于图片的识别,如果我们想知道一张图片里面到底是什么动物,我们会怎么做呢?

我们的大脑会捕捉图片中某些关键patterns,通过这写patterns来识别这个动物是猫还是鸟。不信?看如下图:

 我们咋一看 ,看到一个鸟嘴,有一只眼睛,大脑就认为他是一只乌鸦。(其实他是一只黑猫)

而这里所讲的鸟嘴、眼睛都是critical patterns

那么对一个影像辨识的系统而言,对一个影像辨识的Neuron,它要做的就是侦测现在这张图片里面,有没有出现一些特别重要的Pattern

 举例来说  如果现在

  • 有某一个Neuron,它看到鸟嘴这个Pattern
  • 有某个Neuron又说,它看到眼睛这个Pattern
  • 又有某个Neuron说,它看到鸟爪这个Pattern

也许看到这些Pattern综合起来就代表说,我们看到了一只鸟,类神经网路就可以告诉你说,因为看到了这些Pattern,所以它看到了一只鸟。

既然我们让Neuron所做的事情是判断是否有某种Pattern出现,那么我们其实不需要让每个Neuron都去看一张完整的图片

因为这一些重要的Pattern,比如说鸟嘴,比如说眼睛,比如说鸟爪,并不需要看整张完整的图片,才能够得到这些资讯。
所以这些Neuron也许根本就不需要把整张图片当作输入,它们只需要把图片的一小部分当作输入,就足以让它们侦测某些特别关键的Pattern有没有出现了。

Simplification1---在Network中将Observation1 实现

在CNN 里面有一个这样的做法:

我们设定一个区域叫做Receptive Field,每一个Neuron都只关心自己的Receptive Field里面发生的事情就好了

eg:

         如下图所示,举例来说,定义一个蓝色的Neuron,它的守备范围就是这一个Receptive Field。假设这个ReceptiveField里面有3x3x3个数值,对蓝色的Neuron 来说,它只需要关心这一个小范围就好了,不需要在意整张图片里面有什麽东西。

那么这个蓝色的Neuron做了那些事情呢?:

  • ·把这3x3x3的数值拉直,变成一个长度是3x3x3也就是27维的向量,再把这27维的向量作为这个蓝色Neuron的输入
  • 这个Neuron 会给27维的向量的每一个Dimension一个Weight,所以这个Neuron有27个weight
  • 加上Bias得到的输出,这个输出再送给下一层的Neuron当作输入。

那么Receptive Field要怎么决定呢?有那些误区呢? 

  •  你可以说这边有个蓝色的Neuron,它就看左上角这个范围,这是它的 Receptive Field
  • 另外又有另外一个黄色的Neuron,它是看右下角这个3×3×3的范围
  • Receptive Field彼此之间也可以是重叠的,比如说我现在画一个Receptive Field,那这个地方它是绿色的Neuron的守备范围,它跟蓝色的跟黄色的都有一些重叠的空间
  • 甚至可以两个不同的Neuron,它们守备看到的范围是一样的,也许一个范围使用一个Neuron来守备,你没有办法侦测所有的Pattern,所以同个范围可以有多个不同的Neuron,所以同个Receptive Field,它们可以有多个Neuron

下图是一些常见的误区:

 如果你说你要设计很奇怪的Receptive Field,去解决很特别的问题,那完全是可以的.这都是你自己决定的

但,最经典的Receptive Field的安排方式:

        看所有的Channels;stride;overlap;padding

我们描述一个Receptive Field的时候,只要讲它的高跟宽就好了,就不用讲它的深度,因为深度一定是考虑全部的Channel,而这个高跟宽合起来叫做Kernel Size 

举例来说在这个例子里面,我们的Kernel Size就是3×3

可能会有人疑问:如果Kernel Size都是3x3,那我们在做影像辨识的时候.重要的Pattern都只在3×3这麽小的范围内,就可以被侦测出来了吗?如果有些Pattern 也许很大啊,那么3×3的范围没办法侦测出来呀。

等一下再回答这个问题。

现在先告诉你,常见的Receptive Field 设定方式:就是设置Kernel Size 3×3,然后一般同一个Receptive Field,不会只有一个Neuron去关照它,往往会有一组一排Neuron去关照它。比如说64个或者是128个Neuron去守备一个Receptive Field的范围。

 stride:最左上角的这个Receptive Field,往右移一点然后制造出另外一个Receptive Field,这个移动的量叫做Stride。(这个Stride往往不用设太大,设1或2就行)

但stride太小,会使Receptive Field出现重叠,这样好吗?(overlap)

好!因为假设Receptive Field完全没有重叠,那有一个Pattern就正好出现在两个Receptive Field的交界上面,那就会变成没有任何Neuron去侦测它,那你也可能就会Miss掉这个Pattern,所以我们希望Receptive Field彼此之间有高度的重叠。
Padding:当Receptive Field超出图片固有的范围,那超出的范围就叫Padding。(Pading为0即可)       

 receptive Field也会向垂直方向移动。按照这个方式,扫过整张图片,所以整张图片里面,每一寸土地都是有被某一个Receptive Field覆盖的,也就是图片里面每一个位置,都有一群Neuron在侦测那个地方判断有没有出现某些Pattern。
     

 Observation2

同样的Pattern(比如鸟嘴),它可能会出现在图片的不同区域里面。

如下图所示:如果不同的守备范围Receptive Field,都要有一个侦测鸟嘴的Neuron,那你的参数量不会太多了吗?

就是说,如第一张图片显示,鸟嘴的pattern出现在左上角的Receptive Field上面,由负责蓝色的Neuron检测到了。而第二张图片,鸟嘴的pattern出现在中间的Receptive Field上面,却由黄色的Neuron检测到了。这样这两个Neuron不就是在重复性事情吗,但却增加了weight数量。

解决方法很简单,是 共享

 Simplification2---在Network中将Observation2 实现

让不同Receptive Field的Neuron(这里的Neuron都是侦查同一类的Pattern)共享参数,即参数权值共享。

共享参数:这两个Neuron它们的weights完全是一样的。 如下图所示:

 Ps:上面这个Neuron跟下面这个Neuron,它们守备的Receptive Field是不一样的,但是它们的参数是一模一样的。
那有人可能就会问说,它的参数是一模一样,那它会不会输出永远都是一样?
不会,因为所监听守备的Receptive Field是不一样的,所以它们的输入是不一样的,进而输出是不一样的。

接下来,介绍在影像辨识上常见的共享方法:

那我们刚才已经讲说,每一个Receptive Field,它都有一组Neuron在负责守备,如下图所示:

假设每一个Receptive Field有64个Neuron对其进行监听,那么他们彼此之间怎么共享参数呢?

 其实每一个Receptive Field都只有一组参数而已,就是

  • 左上边这个Receptive Field的第一个红色Neuron,会跟右下边这个Receptive Field的第一个红色Neuron共用参数,名叫filer1
  • 它的第二个橙色Neuron,跟它的第二个橙色Neuron共用参数,名叫filter2
  • 它的第三个绿色Neuron,跟它的第三个绿色 Neuron共用参数,名叫filter3
  • 所以每一个Receptive Field,都只有一组参数而已

Observation3

pooling---他来自一个观察:

我们把一张比较大的图片做Subsampling,举例来说将图片的偶数的Column都拿掉,奇数的Row都拿掉,图片变成为原来的1/4,但是不会影响里面的内容,把一张大的图片缩小,他还是一只鸟。

所以就有了Pooling这样的设计

其实pooling有很多不同的版本,这里讲Max Pooling

 

 刚才说每一个Filter都产生一把数字,要做Pooling的时候,我们就把这些数字几个几个一组,比如说在这个例子里面就是2x2个一组,每一组里面选一个代表,在Max Pooling中,我们选的代表就是最大的那一个

而2x2一组是否,这个数值可以是自己做决定的,你也可以3x3 or 4x4 ect。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值