CNN基础从入门到放弃

一.基本重要概念

一.1局部感受野(local receptive fields)

以minst数据集为例,图示为28x28的像素点。
在这里插入图片描述
在CNN中我们只用部分像素点与隐藏层进行连接而不是全部像素点(否则就是全连接深度神经网络(DNN)了)
在这里插入图片描述像这种局部区域就被称为局部感受野。在这里插入图片描述
在这里插入图片描述如上两图所示,局部感受野在不断的移动直至扫描完整个区域,而伴随着每次移动,都有一个隐藏层的节点与之对应,以此类推即可得到第一个隐藏层。
注意到我们的数据为28*28的,而窗口大小为5x5,所以怎么求隐藏层的节点个数呢?
答案是:28-5+1=24因此隐藏层为24x24的。
ps:这里我们的窗口指滑动了一个像素,通常说成一步(stride),也可以滑动多步,这里的stride也是一个超参,训练是可以根据效果调整,同样,窗口大小也是一个超参。

一.2 权值共享(shared weights)

如上文所示,每个隐藏层节点都对应了一个5x5的窗口,一共24x24个隐藏层节点,他们的权值和偏移值是共享的,如下所示:
在这里插入图片描述
σ代表的是激活函数,如sigmoid函数等,b就是偏移值,w就是5x5个共享权值矩阵,我们用矩阵a表示输入层的神经元,ax,y表示第x+1行第y+1列那个神经元(注意,这里的下标默认都是从0开始计的,a0,0表示第一行第一列那个神经元)所以通过矩阵w线性mapping后再加上偏移值就得到公式中括号里的式子,表示的是隐藏层中第j+1行k+1列那个神经元的输入。有点晕的话就参照上面的图,下面第一个就是j=k=0的情况,第二个是j=0,k=1. 最后加上激活函数就表示该隐藏神经元的输出了。这部分原理和DNN是一样的,如果把w改成28*28的矩阵就变成了全连接,就是DNN了。
在这里插入图片描述
上式为简化版本,a1表示隐藏层的输出,a0表示隐藏层的输入,而∗就表示卷积操作(convolution operation) 这也正是卷积神经网络名字的由来。
由于权值共享,窗口移来移去还是同一个窗口,也就意味着第一个隐藏层所有的神经元从输入层探测(detect)到的是同一种特征(feature),只是从输入层的不同位置探测到(图片的中间,左上角,右下角等等)。
必须强调下,一个窗口只能学到一种特征!另外,窗口还有其他叫法:卷积核(kernal),过滤器(filter)。
我们在做图像识别时光学习一个特征肯定是不够的,我们想要学习更多的特征,就需要更多的窗口。如果用三个窗口的话如下图
在这里插入图片描述窗口与窗口间的w和b是不共享的,三个窗口就表示有三个w矩阵和三个偏移值b,结果是从整张图片的各个位置学到三种不同的特征。到这里肯定有人会问,你说学到特征了,怎么证明学到了呀?现在我们用20个窗口来学习MNIST里的图片特征,我们只看20个窗口里的权值矩阵w,如果把这20个w画成20张黑白图,每张图片都是5x5(一个权值代表一个像素点),如下图所示
在这里插入图片描述盯着其中的一张看,白色区域表示权值比较小,说明窗口的这部分对输入层的神经元不敏感(responds less),相反黑色部分表示权值比较大,说明窗口的这部分对输入层的神经元敏感(responds more).每张图片都有明显的黑白区域,这也能够说明CNN确实学到一些和空间结构相关的特征。究竟学的是什么特征呢?这个很难回答清楚,此处暂不深究,更好理解的话可以参考 Visualizing and Understanding Convolutional Networks

权值共享还有一个很大的好处,就是可以大大减少模型参数的个数。我们的例子中,一个窗口参数个数是26(5x5+1),20个窗口就是520个参数,如果换成全连接的话就是785(28x28+1)个参数,比CNN多了265个参数。可能你觉得265嘛,对计算机来说完全不算什么。如果我们是30个隐藏层的DNN的话(深度学习里很常见的),需要23550(785x30)个参数,是CNN的45倍多。。当然我们也不能光光去比较它们参数的个数,毕竟两个模型本质原理上就相差甚远,但是直觉上我们可以感受到,CNN可以依靠更少的参数来获得和DNN相同的效果,更少的参数就意味着更快的训练速度,这可是谁都想要的。

一.3池化(pooling)

CNN还有一个重要思想就是池化,池化层通常接在卷积层后面。池化这个词听着就很有学问,其实引入它的目的就是为了简化卷积层的输出。通俗地理解,池化层也在卷积层上架了一个窗口,但这个窗口比卷积层的窗口简单许多,不需要w,b这些参数,它只是对窗口范围内的神经元做简单的操作,如求和,求最大值,把求得的值作为池化层神经元的输入值,如下图,这是一个2*2的窗口
在这里插入图片描述值得注意的是,我们此时的窗口每次移动两步,采用的是求最大值的方法,所有称之为max-pooling,刚刚卷积层含有24x24个神经元,经过池化后到池化层就是12x12个神经元。通常卷积层的窗口是多个的,池化层的窗口也是多个的。简单来说,卷积层用一个窗口去对输入层做卷积操作,池化层也用一个窗口去对卷积层做池化操作。但是注意这两个操作的本质区别。下面来看一个用三个卷积窗口和跟随其后的池化窗口长啥样。
在这里插入图片描述
对于max—pooling操作的理解如下:
经过池化后,大大减少了我们学到的特征值,也就大大减少了后面网络层的参数。相当于是学习了主要特征。
L2-pooling:求的是所有神经元平方后求和开根号。
池化操作方式的选择也是我们调参工作的一部分,我们可以根据validation data集来调节,选择更好的池化操作。
整个CNN网络的结构大概如下所示:
(注:池化层到输出层是全连接)

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值