李宏毅机器学习CNN

Why CNN?

在这里插入图片描述
当我们直接用一般的fully connected的feedforward network来做图像处理的时候,往往会需要太多的参数,100100的彩色图片input是3100*100维向量,如果第一层hidden layer有1000个神经元,则一共需要需要30000000个参数

怎么减少参数呢?

  • 想要发现图片的样式不需要看整张图片,只需要看一部分图片
    在这里插入图片描述
  • 对于出现在不同位置的同样的pattern,处理这些的神经元功能相似,可以共用同一组参数

在这里插入图片描述

  • 利用subsampling这个概念把image变小,从而减少需要用到的参数量

CNN架构

在这里插入图片描述
在这里插入图片描述
接下来详细介绍每一层

Convolution

假设input是一张6*6的黑白图像,每个pixel只需要用一个value来表示,而在convolution layer里面,有一堆Filter,每一个Filter,其实等同于是Fully connected layer里的一个neuron,其中的的参数是通过training data学习到的

在这里插入图片描述
从image的左上角开始,做一个slide window,每次向右挪动一定的距离(本例中stride设定1),每次filter停下的时候就跟image中对应的33的matrix计算内积(相同位置的值相乘并累计求和),经过一整个convolution的process,最终得到下图所示的红色的44 matrix
在这里插入图片描述
观察上图中的Filter1,它斜对角的地方是1,1,1,所以它的工作就是detect有没有连续的从左上角到右下角的1,1,1的pattern出现在这个image里面,此时filter得到的卷积结果的左上和左下得到了最大的值3,这就代表说,该filter所要侦测的pattern出现在image的左上角和左下角

同一个pattern出现在image左上角的位置和左下角的位置,并不需要用到不同的filter,我们用filter1就可以侦测出来,这就考虑了property 2

在这里插入图片描述

Feature Map
在一个convolution的layer里面,它会有一系列filter,不一样的filter会有不一样的参数,把filter2跟image做完convolution以后,就会得到另外一个蓝色的44 matrix,那这个蓝色的44 matrix跟之前红色的4*4matrix合起来,就叫做Feature Map(特征映射),有多少个filter,对应就有多少个映射后的image

在这里插入图片描述
同学提问:filter大小是固定的,对于不同大小的鸟嘴怎么办?

CNN对不同scale的相同pattern的处理上存在一定的困难,由于现在每一个filter size都是一样的,这意味着,如果你今天有同一个pattern,它有不同的size,有大的鸟嘴,也有小的鸟嘴,CNN并不能够自动处理这个问题;DeepMind曾经发过一篇paper,上面提到了当你input一张image的时候,它在CNN前面,再接另外一个network,这个network做的事情是,它会output一些scalar,告诉你,它要把这个image的里面的哪些位置做旋转、缩放,然后,再丢到CNN里面,得到较好的表现

彩色图片怎么处理?

彩色图片RGB有三层,对应的filter也有三层

在这里插入图片描述

Convolution V.s. Fully connected

filter是特殊的”neuron“

convolution其实就是fully connected的layer把一些weight拿掉而已,下图中绿色方框标识出的feature map的output,其实就是hidden layer的neuron的output

在这里插入图片描述

如下图所示,convolution得到左上角的值3

这件事情等同于,我们现在把这个image的6*6的matrix拉直变成右边这个用于input的vector

然后,有一个neuron,这个neuron带weight的连线只连接了vector的1,2,3,7,8,9,13,14,15共9个位置,而这个neuron和这9个pixel连线上所标注的的weight就是filter matrix里面的这9个数值,这些input经过这个neuron之后,得到的output是3

对比fully connected要连接36个位置,但是,我们现在只用连接9个input,因为我们知道要detect一个pattern,不需要看整张image,看9个input pixel就够了,所以当我们这么做的时候,就用了比较少的参数
在这里插入图片描述
“neuron”之间共享参数
当我们把filter做stride = 1的移动的时候,得到另外一个output值-1作为另外一个neuron的output

output为3和-1的这两个neuron,它们分别去检测在image的两个不同位置上是否存在某个pattern,这两个neuron共享一组weight,虽然这两个neuron连接到的pixel对象各不相同,但它们用的weight都必须是一样的,等于filter里面的元素值,这件事情就叫做weight share,进一步减少了参数数量

在这里插入图片描述
所以CNN通过减少连接和share weight两次减少了参数

Max Pooling

max pooling就是做subsampling

根据filter 1,我们得到一个44的matrix,根据filter 2,你得到另外一个44的matrix,我们把output四个分为一组,每一组里面通过选取平均值或最大值的方式,把原来4个value合成一个value

在这里插入图片描述
在这里插入图片描述

PS:如果取Maximum放到network里面,不就没法微分了吗?后面的章节会讲到Maxout network,其实用微分的方式来处理它

Convolution + Max Pooling

所以,结论是这样的:

做完一次convolution加一次max pooling,我们就把原来66的image,变成了一个22的image
在这里插入图片描述
第一层convolution+max pooling结束后,因为使用了2个filter,所以得到的2*2的image,它每一个pixel的深度(channel)=2

   the number of the channel is the number of filters

不同的filter检测的是该image同一区域上的不同特征属性,所以每一层channel(通道)代表的是一种属性,一块区域有几种不同的属性,就有几层不同的channel,对应的就会有几个不同的filter对其进行convolution操作

PS: 假设我第一个convolution有25个filter,通过这些filter得到25个feature map,然后repeat的时候第二个convolution也有25个filter,那这样做完,我是不是会得到 2 5 2 25^2 252个feature map?

其实不是这样的,一次convolution结束,得到25个feature map之后再做一次convolution,还是会得到25个feature map,因为convolution在考虑input的时候,是会考虑深度的,它并不是每一个channel分开考虑,而是一次考虑所有的channel

Flatten

做完convolution和max pooling之后,提取出了image的feature,它相较于原先一整个image的vetor,少了很大一部分内容,因此需要的参数也大幅度地减少了,紧接着进行flatten操作,Flatten的意思是,把左边的feature map拉直,然后把它丢进一个Fully connected Feedforward network中去做最后的分类工作

在这里插入图片描述

CNN in Keras

后面还没看。。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值