经典DL回顾——CNN

粗略DL自阅笔记——CNN

怕忘记,所以写下来给自己看,很粗略,只是为了提醒自己某些关键点

主要参考李宏毅老师的课程和邱锡鹏老师的书

为什么要用CNN?

在识别图像的时候,图像在计算机用pixel存储,一个彩色图像假设是100✖️100,由于是彩色需要加上3个维度,则有30000个pixel,如果用传统的全连接神经网络去做分类,那么需要学习整个的30000个参数,参数过多了。而其中很多参数是不必要的。

为什么可以减少参数?图像的特点

  • 第一点,对于一张图片而言,并不需要识别整张图片,只需要识别其中的部分特征即可,比如识别鸟,只需要识别鸟嘴,羽毛等等,而对于图片背景,则是无关紧要的。

  • 第二点,同样的pattern可能出现在图的不同位置,可以用同样的侦测方式去识别,公用同一组参数。

  • 第三点,对于图像而言,av画质和高清画质,人依然可以分辨出是同一种东西。

第一点和第二点CNN的卷积(Convolution)完成,第三点由池化完成。

CNN结构

截屏2019-10-31下午1.05.52

###卷积Convolution

卷积层通过filter提取特征,输出特征映射图feature map

584693-20160519134756826-166871751

每层的卷积运算即用filter与image做内积

截屏2019-10-31下午1.24.53

filter可以视为dnn的参数(即神经网络的“边”),原本的图像为input,filter与input内积为output

filter共享相同的参数,一个filter对图片进行一次扫描得到一层的feature map(每个输出的特征映射都需要一个filter和一个偏置),可以设置多个filter,得到多层的feature map,filter移动的距离也可以进行设置

由于相同的filter是一样的参数,这样就减少了参数

这里有一个疑问是,第二层的卷积和池化,是否会让feature map的维度以指数倍增长,不会,因为第二层的filter可以设置为立方的。比如经过第一次的一个平面的filter之后,channel变味了25,那第二层的卷积的filter可以考虑深度为25,并非直接是一个平面。

有一个说法是,卷积层虽然可以显著减少连接的个数,但是每一个特征映射的神经元个数并没有显著减少。这个意思是filter因为共享的缘故,减少了参数,但是由于多个filter,使得下一层的output仍然很多。

在实际操作中,加入非线性结构可以有助于防止过拟合,故典型CNN结构可以是这样

v2-afa8132cdb9958051f102657335ac68f_r

步幅

卷积中的过滤器filter,若设置为1,接受域会有很大的重叠,如果想让接受域重叠少且更小的空间维度,可以考虑增加步幅

填充padding

填充即在过滤器filter边界填充0元素,在网络的早期层中,我们想要尽可能多地保留原始输入内容的信息,这样我们就能提取出那些低层的特征。比如说我们想要应用同样的卷积层,但又想让输出量维持为 32 x 32 x 3 。为做到这点,我们可以对这个层应用大小为 2 的零填充(zero padding)。零填充在输入内容的边界周围补充零。如果我们用两个零填充,就会得到一个 36 x 36 x 3 的输入卷。

如果你的步幅为 1,而且把零填充设置为

v2-151ea0d356f24533867c018bec7c3127_hd

K 是过滤器尺寸,那么输入和输出内容就总能保持一致的空间维度。

计算任意给定卷积层的输出的大小的公式是

v2-47d83d1bb16072a57d5c1fbb49991d68_hd

其中 O 是输出尺寸,K 是过滤器尺寸,P 是填充,S 是步幅。

这一节的描述来自[机器之心的知乎回答][https://www.zhihu.com/question/52668301?sort=created]

池化Pooling

卷积层虽然可以显著减少网络中权重的数量,但特征映射组中的神经元个数并没有显著减少

池化可以有效的减少神经元个数,对应图像特点的第三点(减少图像pixel个数),将卷积层得到的feature map用最大值下采样或平均值下采样等方式得到更少的参数

截屏2019-10-31下午1.35.06

Flatten

Flatten即把最后一次池化后的结果,tensor,给拉直,作为全连接神经网络的输入

参数学习

在全连接神经网络中,采用反向传播算法,因为链式求导,很容易优化参数(神经元之间连接边的权重),使损失函数最小化

CNN中仍是使用反向传播,不过由于卷积和池化,误差项𝛿的计算会有所不同

池化层

在前向传播时,若后一层时池化层,则会采取下采样的操作,一般为取最大MAX或者求平均Average,为了求L层的误差项,需要对L+1层的误差项进行上采样(upsample)

这样便可以得到后一层的gif,由于池化层没有参数需要学习,使用的是线性激活函数,故

![gif (1)](经典DL回顾——CNN/gif (1).gif)

卷积层

回顾卷积层前向传播公式,其中å^(l-1)是卷积层的输入,å^(l)是输出

![gif (2)](经典DL回顾——CNN/gif (2).gif)

根据DNN,求该层的gif是关键,而层与层之间进行传播

![gif (4)](经典DL回顾——CNN/gif (4).gif)

可以得到

![gif (5)](经典DL回顾——CNN/gif (5).gif)

这里对比层与层之间的递推传播

DNN:![gif (6)](经典DL回顾——CNN/gif (6).gif)

池化层:![gif (7)](经典DL回顾——CNN/gif (7).gif)

卷积层:![gif (8)](经典DL回顾——CNN/gif (8).gif)

这一节可以参考[刘建平的博客][https://www.cnblogs.com/pinard/p/6494810.html#!comments]和[legend_hua的博客][https://blog.csdn.net/legend_hua/article/details/81590979]

一些经典网络结构

这一节内容待补充

LeNet-5

AlexNet

###VGG

ResNet

Inception网络

卷积神经网络的应用

CNN最初更多的是用来CV上的任务,但由于其本身卷积在频域上的平移不变性,同时VGG,ResNet等深度CNN的提出,使之在语音识别,nlp上也有一些热门的应用。

待补充

DNN/CNN的不足

  • 连接存在层与层之间,每层的节点之间是无连接的
  • 输入和输出的维数都是固定的,不能任意改变,无法处理变长的序列数据
  • 假设每次输入都是独立的,即每次网络的输出只依赖于当前的输入