PyTorch 卷积神经网络简介(p16-p24)

    本节是理论介绍,挑一部分老师讲关键的贴出来,穿插我自己的理解的整理下,因为每个人知识背景不同,老师不能吧所有的知识点背景都事无巨细讲一遍,有些一带而过我自己不明白的,我会网上查一下补充一下,所以写的不一定对,请大家指正。

概述

卷积神经网络(Convolutional Neural Network)在 CV 领域, 检测任务领域, 分类与检索领域, 图片重构领域, 医学任务领域, 无人驾驶领域, 人脸识别领域等等都有广泛的应用.

近几年发展迅速,是计算机视觉领域的标配,指标不贴了。

卷积神经网络与传统网络的区别:

PyTorch 卷积神经网络简介(p16-p24)_第1张图片

   与常规神经网络不同,卷积神经网络的各层中的神经元是3维排列的:宽度、高度和深度,深度度指的是激活数据体的第三个维度,而不是整个网络的深度,整个网络的深度指的是网络的层数。

    左侧是一个3层的神经网络;右侧是一个卷积神经网络,将它的神经元在成3个维度(宽、高和深度)进行排列。卷积神经网络的每一层都将3D的输入数据变化为神经元3D的激活数据并输出。在图的右侧,红色的输入层代表输入图像,所以它的宽度和高度就是图像的宽度和高度,它的深度是3(代表了红、绿、蓝3种颜色通道),与红色相邻的蓝色部分是经过卷积和池化之后的激活值(也可以看做是神经元) ,后面是接着的卷积池化层。

    还是有些抽象,补充些背景知识:

     传统的BP神经网络不同层神经元的连接方式是“全连接”,也就是这一次层的一个神经元的输入,会接受上一次每一个神经元的输出,这种方式即为“全连接神经网络”。这样的连接方式有一个的缺点:因为权值与偏置等参数量大,导致训练收敛十分缓慢。我们上一节课学习的mnist里面的黑白28×28 的手写数字图片,输入层的神经元就有784个,如果换成百万像素的图片会更大了。大量的参数也很快会导致网络过拟合。

    而在卷积神经网络中,卷积层的神经元只与前一层的部分神经元节点相连,即它的神经元间的连 接是非全连接的,且同一层中某些神经元之间的连接的权重 w 和偏移 b 是共享的(即相同的),这样大量地减少了需要训练参数的数量。

  卷积神经网络特点:

   局部感受野

    一张图像,我们实际上并不需要让每个神经元都接受整个图片的信息,而是让不同区域的神经元对应一整张图片的不同局部,最后只要再把局部信息整合到一起就可以了。这样就相当于在神经元最初的输入层实现了一次降维。

​​​​​​     感受野就是视觉感受区域的大小。在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。看完定义有些抽象,我的理解(指的是卷积核所覆盖的像素面积)。CNN是一个从局部到整体的过程(局部到整体的实现是在全连通层)。下图是全连接层和卷积层的对比。

PyTorch 卷积神经网络简介(p16-p24)_第2张图片

如果理解了,下一段可以跳过,不理解还可以看知乎上篇文章我觉得介绍的比较好,推荐下:

深度神经网络中的感受野(Receptive Field) - 知乎

在机器视觉领域的深度神经网络中有一个概念叫做感受野,用来表示网络内部的不同位置的神经元对原图像的感受范围的大小。神经元之所以无法对原始图像的所有信息进行感知,是因为在这些网络结构中普遍使用卷积层和pooling层,在层与层之间均为局部相连(通过sliding filter)。神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着他可能蕴含更为全局、语义层次更高的特征;而值越小则表示其所包含的特征越趋向于局部和细节。因此感受野的值可以大致用来判断每一层的抽象层次。

PyTorch 卷积神经网络简介(p16-p24)_第3张图片

可以看到在Conv1中的每一个单元所能看到的原始图像范围是3*3,而由于Conv2的每个单元都是由 2x2 范围的Conv1构成,因此回溯到原始图像,其实是能够看到  5X5的原始图像范围的。因此我们说Conv1的感受野是3,Conv2的感受野是5. 输入图像的每个单元的感受野被定义为1,这应该很好理解,因为每个像素只能看到自己。

权值共享

    全连接神经网络最大的问题就是权值参数太多,而卷积神经网络的卷积层,不同神经元的权值是共享的,这使得整个神经网络的参数大大减小,提高了整个网络的训练性能。

   基于一个合理的假设:如果一个特征在计算某个空间位置 (x1,y1)(x1,y1) 的时候有用,那么它在计算另一个不同位置 (x2,y2)(x2,y2) 的时候也有用。基于这个假设,可以显著地减少参数数量。

池化

  简单理解可以看作是对图像的一次“有损压缩”,因为在实际的训练中,我们并不需要对图像中的每一个细节都进行特征提取和训练,所以池化的作用就是更进一步的信息抽象和特征提取,当然也会减小数据的处理量。

整体架构:

  • 输入层
  • 卷积层
  • 池化层
  • 全连接层

PyTorch 卷积神经网络简介(p16-p24)_第4张图片

  • 输入层:CNN的输入为原始图像,三维(RGB)或二维的向量。
  • 卷积层:CNN的核心,卷积层由一组可学习的滤波器(filter)或内核(kernels)组成,它们具有小的感受野,每个卷积核具有kernel size,padding,stride等参数。从图像的左上角依次做内积操作,提取出图片的高层次特征。
  • 池化层:对conv后输出的feature map进行下采样操作,这样的好处有降低参数的数量,防止过拟合等作用。
  • 激活层:在CNN中使用relu激活函数,在网络中引入了非线性。通过relu激活函数传递卷积运算的结果。因此,最终特征映射中的值不是简单的线性关系。
  • 全连接层:全连接层的输入是一维向量,需要将pooling 层的输出向量flatten成一个一维的向量,然后输入到全连接层中,最后送到soft Max层进行类别的分类。
  • 输出层:用于输出结果

输入层

   在CNN的输入层中,(图片)数据输入的格式 与 全连接神经网络的输入格式(一维向量)不太一样。CNN的输入层的输入格式保留了图片 本身的结构。对于黑白的 28×28 的图片,CNN的输入是一个 28×28 的的二维神经元。而对于RGB格式的28×28图片,CNN的输入则是一个 3×28×28 的三维神经元(RGB中的每一个颜色通道都有一个 28×28 的矩阵) 

PyTorch 卷积神经网络简介(p16-p24)_第5张图片

卷积层

卷积层是构建卷积神经网络的核心层。

     前面说了卷积层可以理解为提取特征,那么卷基层是如何提取特征的呢?我们都知道卷积就是2个函数的叠加,应用在图像上,则可以理解为拿一个滤镜放在图像上,找出图像中的某些特征,通过这些滤镜的组合,我们可以得出很多的特征,通过很多特征就能区分出具体物体。

   前面也提到了卷积层的重要概念,局部感受野、权重共享。

局部感受野可类似看作:隐藏层中的神经元具有一个固定大小的感受视野去感受上一层的部分特征。隐藏层中的神经元的感受视野比较小,只能看到上一次的部分特征,上一层的其他特征可以通过平移感受视野来得到同一层的其他神经元,由同一层其他神经元来看

     下面是知乎的例子,为了简化假设我们有一组灰度图片,这样图片就可以表示为一个矩阵,假设我们的图片大小为5 * 5,那么我们就可以得到一个5 * 5的矩阵,接下来,我们用一组过滤器(Filter)来对图片过滤,过滤的过程就是求卷积的过程。假设我们的Filter的大小为3 * 3,我们从图片的左上角开始移动Filter,并且把每次矩阵相乘的结果记录下来。可以通过下面的过程来演示。

PyTorch 卷积神经网络简介(p16-p24)_第6张图片

      每次Filter从矩阵的左上角开始移动,每次移动的步长是1,从左到右,从上到下,依次移动到矩阵末尾之后结束,每次都把Filter和矩阵对应的区域做乘法,得出一个新的矩阵。这其实就是做卷积的过程。

注意:输入的通道数跟filter的最后一个参数深度保持一致。就是上图的7x7x3 跟filter:3x3x3 

计算就是内积 ,对应位置相乘再求和。注意有个偏移量b.可以试着算一下。上面绿图分别对应fiilter w0,filter w1,多个特征图代表不同提取特征,如下图所示

PyTorch 卷积神经网络简介(p16-p24)_第7张图片

PyTorch 卷积神经网络简介(p16-p24)_第8张图片

PyTorch 卷积神经网络简介(p16-p24)_第9张图片

只做一次卷积不够,需要 多次 ,就是下面 堆叠的卷积层。

PyTorch 卷积神经网络简介(p16-p24)_第10张图片

卷积层涉及的参数

PyTorch 卷积神经网络简介(p16-p24)_第11张图片

     相关参数如下

卷积核大小 f:刚才已经说到了一个重要的参数,就是核的大小,我们这里用f来表示。

边界填充 (p)adding:我们看到上图,经过计算后矩阵的大小改变了,如果要使矩阵大小不改变呢,我们可以先对矩阵做一个填充(一圈0,不对结果产生负面影响),将矩阵的周围全部再包围一层,这个矩阵就变成了7*7,上下左右各加1,相当于5+1+1=7这时,计算的结果还是5*5的矩阵,保证了大小不变,这里的p=1。

PyTorch 卷积神经网络简介(p16-p24)_第12张图片

步长 (s)tride:从动图上我们能够看到,每次滑动只是滑动了一个距离,如果每次滑动两个距离呢?那就需要使用步长这个参数。一般图像使用步长为1,文本任务要不同。

PyTorch 卷积神经网络简介(p16-p24)_第13张图片

计算公式:n为我们输入的矩阵的大小, \frac{n-f+2p}{s}+1 向下取整。

PyTorch 卷积神经网络简介(p16-p24)_第14张图片

卷积核个数:在每一个卷积层中我们都会设置多个核,每个核代表着不同的特征,这些特征就是我们需要传递到下一层的输出,而我们训练的过程就是训练这些不同的核。

卷积参数共享

PyTorch 卷积神经网络简介(p16-p24)_第15张图片

池化层(Max Pooling Layer)

       经过卷积层处理的特征是否就可以直接用来分类了呢,答案是不能。我们假设一张图片的大小为500 * 500,经过50个Filter的卷积层之后,得到的结果为500 * 500 * 50",维度非常大,我们需要减少数据大小,而不会对识别的结果产生影响,即对卷积层的输出做下采样(downsampling),它的作用是逐渐降低数据体的空间尺寸,这样的话就能减少网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。 

     池化层的操作很简单,就想相当于是合并,我们输入一个过滤器的大小,与卷积的操作一样,也是一步一步滑动,但是过滤器覆盖的区域进行合并,只保留一个值。 合并的方式也有很多种,例如我们常用的两种取最大值maxpooling,取平均值avgpooling。  

   平均池化历史上比较常用,但是现在已经很少使用了。因为实践证明,最大池化的效果比平均池化要好。 PyTorch 卷积神经网络简介(p16-p24)_第16张图片

 最大池化 :PyTorch 卷积神经网络简介(p16-p24)_第17张图片

        那么为什么这样做可行呢?丢失的一部分数据会不会对结果有影响,实际上,池化层不会对数据丢失产生影响,因为我们每次保留的输出都是局部最显著的一个输出,而池化之后,最显著的特征并没。我们只保留了认为最显著的特征,而把其他无用的信息丢掉,来减少运算。池化层的引入还保证了平移不变性,即同样的图像经过翻转变形之后,通过池化层,可以得到相似的结果。

    整体架构

PyTorch 卷积神经网络简介(p16-p24)_第18张图片

全连接层(Fully Connected Layer)

      全连接层的作用主要是进行分类。前面通过卷积和池化层得出的特征,在全连接层对这些总结好的特征做分类。全连接层就是一个完全连接的神经网络,根据权重每个神经元反馈的比重不一样,最后通过调整权重和网络得到分类的结果。

     我们的特征都是使用矩阵表示的,所以再传入全连接层之前还需要对特征进行压扁,将他这些特征变成一维的向量,如果要进行分类的话,就是用sofmax作为输出,如果要是回归的话就直接使用linear即可。

PyTorch 卷积神经网络简介(p16-p24)_第19张图片

 特征图

PyTorch 卷积神经网络简介(p16-p24)_第20张图片

 先整理 到这里

你可能感兴趣的:(python,pytorch,cnn,人工智能)