首页 > Udacity机器人软件工程师课程笔记(二十七) - 卷积神经网络(CNN)

Udacity机器人软件工程师课程笔记(二十七) - 卷积神经网络(CNN)

1.卷积神经网络介绍

**卷积神经网络(Convolutional Neural Network,CNN)**是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

在这里插入图片描述虽然上图中显示的全连接神经网络结构和卷积神经网络的结构直观上差异比较大,但他们的整体架构是非常相似的。从上图可以看出,卷积神经网络也是通过一层一层的节点组织起来的。和全连接神经网络一样,卷积神经网络中的每一个节点都是一个神经元。在全链接神经网络中,每相邻两层之间的节点都全部相连,于是一般会将每一层全连接层中的节点组织成一列,这样方便显示连接结构。而对于卷积神经网络,相邻两层之间只有部分相连接,为了展示每一层的神经元的维度,一般会将每一层卷积层的节点组织成一个三维矩阵。

lnd4mQ.gif

除了结构相似,卷积神经网络的输入和输出以及训练流程与全连接神经网络也基本一致。以图象为例,卷积神经网络的输入层就是图像的原始像素,而输出层的每一个节点代表了不同类别的可信度。这和全链接神经网络的输入输出是一致的。卷积神经网络和全连接神经网络的的唯一区别就在于神经网络中相邻两层的连接方式。

在这里插入图片描述上图给出了一个更加具体的卷积神经网络架构图。

在神经网络前几层中,每一层的节点都被组织成一个三维矩阵,从图中可以看出卷积神经网络前几层中每一个节点之和上一层中部分节点相连。一个卷积神经网络主要由以下5种结构组成。

  1. 输入层。输入层是整个神经网络的输入,在处理图像的卷积神经网络中,它一般代表了一张图片的像素矩阵。
  2. 卷积层。从名字就可以看出,卷积层是一个卷积神经网络中最重要的部分。和传统的全连接层不容,卷积层中每一个介蒂安的输入只是上一层神经网络的一小块。这个小块常用的大小为33或者5。卷积层试图将神经网络中每一个小块进行更加深入的分析从而得到抽象程度更高的特征。一般来说,通过卷积层处理过的节点矩阵会变得更深。
  3. 池化层(Pooling)。池化层神经网络不会改变三维矩阵的深度,但是它可以缩小矩阵的大小。池化操作可以认为使将一张分辨率较高的图片转换为一张分辨率较低的图片。通过池化层,可以进一步缩小最后全连接层结点的个数,从而达到减少整个神经网络中参数的目的。
  4. 全连接层。在经过多轮卷积层和池化层的处理之后,在卷积神经网络的最后一般是由一到两个全连接层来给出最后的分类结果。经过几轮卷积层和池化层的处理之后,可以认为图像中的信息已经被抽象成了信息含量更高的特征。我们可以将卷积层和池化层看成自动图像特征提取的过程。在特质提取完成之后,仍然需要使用全连接层来完成分类任务。
  5. Softmax层。Softmax主要用于分类问题。通过Softmax层,可以得到当前样例属于不同种类的概率分布情况。

2. 过滤器

(1)分解图像

CNN的第一步是将图像分解成较小的碎片。我们通过选择定义过滤器的宽度和高度来做到这一点。

在这里插入图片描述然后,我们可以简单地水平或垂直滑动此滤镜以聚焦在另一幅图像上。

过滤器滑动的量称为“步幅”。跨度是我们可以调整的超参数。通过减少每一层观察到的总面片数量,增加步幅可减小模型的大小。但是,这通常会降低准确性。

让我们看一个例子。在这张放大的狗的图像中,我们首先以红色概述的补丁开始。滤镜的宽度和高度定义了该正方形的大小。

在这里插入图片描述然后,我们将正方形向右移动给定的步幅(在本例中为2)以获得另一个图片。

在这里插入图片描述

(2)过滤器深度

通常有多个过滤器。不同的过滤器选择不同质量的部分。例如,一个过滤器可能查找特定的颜色,而另一个可能查找特定形状的对象。卷积层中过滤器的数量称为 过滤器深度

在这里插入图片描述

过滤器尺寸是指的过滤器的输入节点矩阵的大小,深度指的hi输出单位节点矩阵的深度。

假设使用wx,y,ziw_{x,y,z}^iwx,y,zi来表示对于输出单位节点矩阵中的第iii个节点,过滤器输入节点(x,y,z)( x,y,z)x,y,z 的权重,使用bib^ibi表示第iii个输出节点对应的偏置项参数,那么单位矩阵中的第iii个节点的取值g(i)g(i)g(i)为:

g(i)=f(∑x=12∑y=12∑z=13ax,y,z×wx,y,zi+bi)g(i)=f(sum_{x=1}^{2}sum_{y=1}^{2}sum_{z=1}^{3}a_{x,y,z} imes w_{x,y,z}^{i}+b^i)g(i)=f(x=12y=12z=13ax,y,z×wx,y,zi+bi)

其中ax,y,za_{x,y,z}ax,y,z为过滤器中节点(x,y,z)(x,y,z)(x,y,z)的取值, fff为激活函数。下图展示了在给定a,w0a, w^0a,w0b0b^0b0的情况下,使用ReLU 作为激活函数时g(0)g(0)g(0)的计算过程。在图6-9 的左侧给出了a,w0a, w^0a,w0的取值,这里通过3 个二维矩阵来表示一个三维矩阵的取值,其中每一个二维矩阵表示三维矩阵在某一个深度上的取值。下图中⋅· 符号表示点积,也就是矩阵中对应元素乘积的和。图6-9 的右侧显示了g(0)g(0 )g(0)的计算过程。如果给出w1w^1w1w4w^4w4b1b^1b1b4b^4b4 , 那么也可以类似地计算出g(1)g(1)g(1)g(4)g(4)g(4)的取值。如果将aaawiw^iwi组织成两个向量,那么一个过滤器的计算过程完全可以通过向量乘法来完成。

在这里插入图片描述当过滤器的大小不为l × l 时, 卷积层前向传播得到的矩阵的尺寸要小于当前层矩阵的尺寸。如下图所示, 当前层矩阵的大小为3 × 3 (左侧矩阵〉,而通过卷积层前向传播算法之后,得到的矩阵大小为2 × 2 (右侧矩阵〉。为了避免尺寸的变化,可以在当前层矩阵的边界上加入全0填充(zero -padding)。这样可以使得卷积层前向传播结果矩阵的大小和当前层矩阵保持一致。

在这里插入图片描述

以下公式给出了同时使用全0填充的结果矩阵的大小。

outlength=[inlength/srtidelength]out_{length}=[in_{length}/srtide_{length}]outlength=[inlength/srtidelength]

outwidth=[inwidth/srtidewidth]out_{width}=[in_{width}/srtide_{width}]outwidth=[inwidth/srtidewidth]

如果不使用全0填充,以下公式给出了结果矩阵的大小。

outlength=[(inlength−filterlength+1)/srtidelength]out_{length}=[(in_{length}-filter_{length}+1)/srtide_{length}]outlength=[(inlength

更多相关:

  • 看龙书的时候发现一个矩阵在传入Shader之前都要转置一下,很好奇为什么要有一步这样的操作。行主序和列主序行主序指矩阵在内存中逐行存储,列主序指矩阵在内存中逐列存储。行主序矩阵内存布局:列主序矩阵内存布局:行向量和列向量行向量指的是把向量当成一个一行n列的矩阵,列向量指的是把向量当成一个n行一列的矩阵。左乘和右乘矩阵“左乘”:矩阵和向...

  • ORB-SLAM点云地图中相机的位姿初始化,无论算法工作在平面场景,还是非平面场景下,都能够完成初始化的工作。其中主要是使用了适用于平面场景的单应性矩阵H和适用于非平面场景的基础矩阵F,程序中通过一个评分规则来选择适合的模型,恢复相机的旋转矩阵R和平移矩阵t那么下面主要讲解关于对极几何中的基础矩阵,本质矩阵,和单应矩阵之间的区别与联...

  • 矩阵可分为稠密矩阵和稀疏矩阵,对于稀疏矩阵而言,使用同样的内存来存储这个矩阵显然是对内存的浪费,那么我们就可以想办法将矩阵中所有的o元素挥着不相关元素剔除,怎么剔除,第一种方法是通过三个一维矩阵来存储原二维矩阵中的所有非0元素,三个矩阵分别为value、column、row, value 数组存储所有的非零元素, column 数...

  • void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const; m – 目标矩阵。如果m在运算前没有合适的尺寸或类型,将被重新分配。rtype – 目标矩阵的类型。因为目标矩阵的通道数与源矩阵一样,所以rtype也可以看做是目标...

  • https://blog.csdn.net/jiangdf/article/details/8460012 glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项(参数)有3种模式: GL...