CNN卷积神经网络

卷积神经网络(Foundations of Convolutional Neural Networks)

计算机视觉(Computer vision)

由于深度学习的兴起,计算机视觉发展的十分迅猛。我们在生活中也能看见一些计算机视觉的例子,比如自动驾驶,人脸识别这些比较热的领域。
截屏2022-07-19 10.44.00.png

  • 给出这张64×64的图片,让计算机去分辨出这是一只猫。
  • 目标检测,无人驾驶项目中,你不一定非得识别出图片中的物体是车辆,但你需要计算出其他车辆的位置,以确保自己能够避开它们。
  • 神经网络实现的图片风格迁移,一张图片,将这张图片转换为另外一种风格。

面临问题
但在应用计算机视觉时要面临一个挑战,就是数据的输入可能会非常大。举个例子,一般操作的都是64×64的小图片,实际上,它的数据量是64×64×3,因为每张图片都有3个颜色通道。计算一下可得知数据量为12288,所以我们的特征向量Convolutional Neural Networks - 图2维度为12288。这其实还好,因为64×64真的是很小的一张图片。如果要操作更大的图片,比如一张1000×1000的图片,它足有1兆那么大,但是特征向量的维度达到了1000×1000×3,因为有3个RGB通道,所以数字将会是300万。
截屏2022-07-19 10.48.34.png
如果要输入300万的数据量,这就意味着特征向量Convolutional Neural Networks - 图4的维度高达300万。所以在第一隐藏层中也许会有1000个隐藏单元,而所有的权值组成了矩阵Convolutional Neural Networks - 图5。如果你使用了标准的全连接网络,这个矩阵的大小将会是1000×300万。因为现在Convolutional Neural Networks - 图6的维度为Convolutional Neural Networks - 图7Convolutional Neural Networks - 图8通常用来表示300万。这意味着矩阵Convolutional Neural Networks - 图9会有30亿个参数,这是个非常巨大的数字。在参数如此大量的情况下,难以获得足够的数据来防止神经网络发生过拟合和竞争需求,要处理包含30亿参数的神经网络,巨大的内存需求让人不太能接受。
但对于计算机视觉应用来说,肯定不想它只处理小图片,希望它同时也要能处理大图。为此需要进行卷积计算,它是卷积神经网络中非常重要的一块。

边缘检测(Edge detection)

截屏2022-07-19 17.24.21.png截屏2022-07-19 17.24.52.png
举个例子,给了这样一张图片,让电脑去搞清楚这张照片里有什么物体,做的第一件事是检测图片中的垂直边缘。比如说,在这张图片中的栏杆就对应垂直线,与此同时,这些行人的轮廓线某种程度上也是垂线,这些线是垂直边缘检测器的输出。同样,你可能也想检测水平边缘,比如说这些栏杆就是很明显的水平线,它们也能被检测到。

6x6灰度图像

这是一个6×6的灰度图像,因为是灰度图像,所以它是6×6×1的矩阵,而不是6×6×3的,因为没有RGB三通道。为了检测图像中的垂直边缘,可以构造一个3×3矩阵。在共用习惯中,在卷积神经网络的术语中,它被称为过滤器。我要构造一个3×3的过滤器,像这样Convolutional Neural Networks - 图12。在论文它有时候会被称为核,而不是过滤器,对这个6×6的图像进行卷积运算,卷积运算用“Convolutional Neural Networks - 图13”来表示,用3×3的过滤器对其进行卷积,这个卷积运算的输出将会是一个4×4的矩阵。
截屏2022-07-19 17.31.02.png
为了计算第一个元素,在4×4左上角的元素,使用3×3的过滤器,将其覆盖在输入图像,如下图所示。然后进行元素乘法(element-wise products)运算,所以Convolutional Neural Networks - 图15,然后将该矩阵每个元素相加得到最左上角的元素,即Convolutional Neural Networks - 图16,把这9个数加起来得到-5。
截屏2022-07-19 17.33.45.png
接下来,4x4的第二个元素是什么,把蓝色的方块,向右移动一步,把这些绿色的标记去掉,继续做同样的元素乘法,然后加起来,所以是 Convolutional Neural Networks - 图18。接下来也是一样,继续右移一步,如此讲4x4填满。
截屏2022-07-19 17.36.18.png截屏2022-07-19 17.36.24.png
截屏2022-07-19 17.36.30.png
这里最终得到的是一个4维的矩阵,应用数学知识不难得出,如果输入矩阵为n维,过滤器为f维,那么输出矩阵为n-f+1维。
在编程练习中,你会使用一个叫conv_forward的函数。如果在tensorflow下,这个函数叫tf.conv2d。在其他深度学习框架中,例如Keras这个框架,在这个框架下用Conv2D实现卷积运算。所有的编程框架都有一些函数来实现卷积运算。

垂直边缘检测

用一个简单的例子,这是一个简单的6×6图像,左边的一半是10,右边一般是0。如果你把它当成一个图片,左边那部分看起来是白色的,像素值10是比较亮的像素值,右边像素值比较暗,使用灰色来表示0,尽管它也可以被画成黑的。图片里,有一个特别明显的垂直边缘在图像中间,这条垂直线是从黑到白的过渡线,或者从白色到深色。
截屏2022-07-19 17.43.19.png
如果把最右边的矩阵当成图像,它在中间有段亮一点的区域,对应检查到这个6×6图像中间的垂直边缘。这里的维数似乎有点不正确,检测到的边缘太粗了。因为在这个例子中,图片太小了。如果你用一个1000×1000的图像,而不是6×6的图片,你会发现其会很好地检测出图像中的垂直边缘。
在这个例子中,在输出图像中间的亮处,表示在图像中间有一个特别明显的垂直边缘。从垂直边缘检测中可以得到的启发是,因为我们使用3×3的矩阵(过滤器),所以垂直边缘是一个3×3的区域,左边是明亮的像素,中间的并不需要考虑,右边是深色像素。在这个6×6图像的中间部分,明亮的像素在左边,深色的像素在右边,就被视为一个垂直边缘,卷积运算提供了一个方便的方法来发现图像中的垂直边缘。
颜色翻转
截屏2022-07-19 17.55.56.png
颜色被翻转了,变成了左边比较暗,而右边比较亮。现在亮度为10的点跑到了右边,为0的点则跑到了左边。如果你用它与相同的过滤器进行卷积,最后得到的图中间会是-30,而不是30。如果你将矩阵转换为图片,就会是该矩阵下面图片的样子。现在中间的过渡部分被翻转了,之前的30翻转成了-30,表明是由暗向亮过渡,而不是由亮向暗过渡。

水平边缘检测

这里还有个更复杂的例子,左上方和右下方都是亮度为10的点。如果你将它绘成图片,右上角是比较暗的地方,这边都是亮度为0的点,我把这些比较暗的区域都加上阴影。而左上方和右下方都会相对较亮。如果你用这幅图与水平边缘过滤器卷积,就会得到如下矩阵。
截屏2022-07-19 17.59.49.png截屏2022-07-19 18.03.28.png
这里的30(右边矩阵中绿色方框标记元素)代表了左边这块3×3的区域(左边矩阵绿色方框标记部分),这块区域确实是上边比较亮,而下边比较暗的,所以它在这里发现了一条正边缘。而这里的-30(右边矩阵中紫色方框标记元素)又代表了左边另一块区域(左边矩阵紫色方框标记部分),这块区域确实是底部比较亮,而上边则比较暗,所以在这里它是一条负边。现在所使用的都是相对很小的图片,仅有6×6。但这些中间的数值,比如说这个10(右边矩阵中黄色方框标记元素)代表的是左边这块区域(左边6×6矩阵中黄色方框标记的部分)。这块区域左边两列是正边,右边一列是负边,正边和负边的值加在一起得到了一个中间值。假如这个一个非常大的1000×1000的类似这样棋盘风格的大图,就不会出现这些亮度为10的过渡带了,因为图片尺寸很大,这些中间值就会变得非常小。
总而言之,通过使用不同的过滤器,你可以找出垂直的或是水平的边缘。

过滤器

Sobel
在计算机视觉的文献中,曾公平地争论过怎样的数字组合才是最好的,所以你还可以使用这种:Convolutional Neural Networks - 图26,叫做Sobel的过滤器,它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些。
Scharr
但计算机视觉的研究者们也会经常使用其他的数字组合,比如这种:Convolutional Neural Networks - 图27,这叫做Scharr过滤器,它有着和之前完全不同的特性,实际上也是一种垂直边缘检测,如果你将其翻转90度,你就能得到对应水平边缘检测。
截屏2022-07-19 18.10.54.png
随着深度学习的发展,我们学习的其中一件事就是当你真正想去检测出复杂图像的边缘,你不一定要去使用那些研究者们所选择的这九个数字,但你可以从中获益把这矩阵中的9个数字当成9个参数,并且在之后你可以学习使用反向传播算法,其目标就是去理解这9个参数,当你得到左边这个6×6的图片,将其与这个3×3的过滤器进行卷积,将会得到一个出色的边缘检测。将这9个数字当成参数的思想,已经成为计算机视觉中最为有效的思想之一。

Padding

之前的卷积运算已经可以实现特征的探测了,但其还有两个缺点:

  • 可以看到探测结果的维度在一次次的缩小,虽然大部分时候确实需要这样,但有时还是需要保持与输入图片的维度相一致。
  • 输入图片中边角用到的太少,在卷积运算中,四个角落甚至只用到一次,这样就会导致对图像周围的探测不够充分。

为了解决这两个问题,我们找到一种方法:扩充,也叫padding,就是在输入图片的外围扩充一层或者几层,这样一来,首先会减缓甚至抵消掉维度的减小,同时,原来边角的像素值也不在处于边角的位置,这样图片的边缘也可以充分的探测。
截屏2022-07-19 18.17.42.png
我们在之前视频中看到,如果你用一个3×3的过滤器卷积一个6×6的图像,你最后会得到一个4×4的输出,也就是一个4×4矩阵。那是因为你的3×3过滤器在6×6矩阵中,只可能有4×4种可能的位置。这背后的数学解释是,如果我们有一个Convolutional Neural Networks - 图30的图像,用Convolutional Neural Networks - 图31的过滤器做卷积,那么输出的维度就是Convolutional Neural Networks - 图32。在这个例子里是6-3+1=4,因此得到了一个4×4的输出。
截屏2022-07-19 18.25.08.png
就拿这个图来说,原来6 Convolutional Neural Networks - 图34 6的输入图片经由3 Convolutional Neural Networks - 图35 3的过滤器卷积之后得到的图片规格是4 Convolutional Neural Networks - 图36 4,现在经过padding一层之后,输出的图片规格变为6 Convolutional Neural Networks - 图37 6。应用数学推导不难得出,如果padding的层数是Convolutional Neural Networks - 图38,那么输出维度将是Convolutional Neural Networks - 图39
在这个案例中,Convolutional Neural Networks - 图40,因为我在周围都填充了一个像素点,输出也就变成了Convolutional Neural Networks - 图41,所以就变成了Convolutional Neural Networks - 图42,和输入的图像一样大。这个涂绿的像素点(左边矩阵)影响了输出中的这些格子(右边矩阵)。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。
截屏2022-07-19 18.29.01.png
至于Convolutional Neural Networks - 图44取多少通常有两种选择

  • 一种是valid卷积,也就是不进行padding;
  • 另一种是same卷积,也就是通过padding,使得输入输出维度保持相同。在做same填充时,有Convolutional Neural Networks - 图45,也就是Convolutional Neural Networks - 图46,这也解释了为什Convolutional Neural Networks - 图47一般都是一个奇数;但还有另外一个原因,奇数维度的过滤器有一个中心点,便于指出过滤器的位置,会很方便。

    卷积步长(Strided convolutions)

    目前为止,我们讨论的卷积运算中,过滤器移动的步长都是一个格,那如果步长不是1,会怎么样呢?
    假设一个Convolutional Neural Networks - 图48的图像和一个Convolutional Neural Networks - 图49的过滤器进行卷积,如果Convolutional Neural Networks - 图50,步长为1,那么输出维度将是7-3+1=5,但如果步长为2,那么结果将是这样的:
    截屏2022-07-19 18.38.02.png截屏2022-07-19 18.34.17.png
    可以看到输出变成了三维的。假设步长为 Convolutional Neural Networks - 图53,经数学推导不难得出输出维度为 Convolutional Neural Networks - 图54 ,其中方括号表示向下取整。
    维度
    总结一下维度情况,如果你有一个Convolutional Neural Networks - 图55的矩阵或者n×n的图像,与一个Convolutional Neural Networks - 图56的矩阵卷积,或者说f×f的过滤器。PaddingConvolutional Neural Networks - 图57,步幅为Convolutional Neural Networks - 图58没输出尺寸就是这样:
    截屏2022-07-19 18.40.59.png

    三维卷积(Convolutions over volumes)

    现在看看如何执行卷积不仅仅在二维图像上,而是三维立体上。先从一个例子开始,如果你不仅想检测灰度图像的特征,而且还想检测RGB彩色图像的特征。彩色图像如果是6×6×3,这里的3指的是三个颜色通道,你可以把它想象成三个6×6图像的堆叠。为了检测图像的边缘或者其他的特征,不是把它跟原来的3×3的过滤器做卷积,而是跟一个三维的过滤器,它的维度是3×3×3,这样这个过滤器也有三层,对应红绿、蓝三个通道。
    截屏2022-07-19 23.05.36.png
    为了计算这个卷积操作的输出,你要做的就是把这个3×3×3的过滤器先放到最左上角的位置,这个3×3×3的过滤器有27个数,27个参数就是3的立方。依次取这27个数,然后乘以相应的红绿蓝通道中的数字。先取红色通道的前9个数字,然后是绿色通道,然后再是蓝色通道,乘以左边黄色立方体覆盖的对应的27个数,然后把这些数都加起来,就得到了输出的第一个数字。如果要计算下一个输出,就把这个立方体滑动一个单位,再与这27个数相乘,把它们都加起来,就得到了下一个输出,以此类推。
    截屏2022-07-19 23.08.21.png截屏2022-07-19 23.09.35.png
    那么,这个能干什么呢?举个例子,这个过滤器是3×3×3的,如果你想检测图像红色通道的边缘,那么你可以将第一个过滤器设为Convolutional Neural Networks - 图63,和之前一样,而绿色通道全为0,Convolutional Neural Networks - 图64,蓝色也全为0。如果你把这三个堆叠在一起形成一个3×3×3的过滤器,那么这就是一个检测垂直边界的过滤器,但只对红色通道有用。
    或者如果你不关心垂直边界在哪个颜色通道里,那么你可以用一个这样的过滤器,Convolutional Neural Networks - 图65Convolutional Neural Networks - 图66Convolutional Neural Networks - 图67,所有三个通道都是这样。所以通过设置第二个过滤器参数,就有了一个边界检测器,3×3×3的边界检测器,用来检测任意颜色通道里的边界。参数的选择不同,就可以得到不同的特征检测器。
    截屏2022-07-19 23.12.50.png
    多个过滤器
    第一个可能是一个垂直边界检测器或者是学习检测其他的特征。第二个过滤器可以用橘色来表示,它可以是一个水平边缘检测器。所以和第一个过滤器卷积,可以得到第一个4×4的输出,然后卷积第二个过滤器,得到一个不同的4×4的输出。我们做完卷积,然后把这两个4×4的输出,取第一个把它放到前面,然后取第二个过滤器输出,我把它画在这,放到后面。所以把这两个输出堆叠在一起,这样你就都得到了一个4×4×2的输出立方体。它用6×6×3的图像,然后卷积上这两个不同的3×3的过滤器,得到两个4×4的输出,它们堆叠在一起,形成一个4×4×2的立方体,这里的2的来源于我们用了两个不同的过滤器。
    截屏2022-07-19 23.16.07.png
    维度
    我们总结一下维度,如果你有一个Convolutional Neural Networks - 图70(通道数)的输入图像,在这个例子中就是6×6×3,这里的Convolutional Neural Networks - 图71就是通道数目,然后卷积上一个Convolutional Neural Networks - 图72,这个例子中是3×3×3,按照惯例,这个(前一个Convolutional Neural Networks - 图73)和这个(后一个Convolutional Neural Networks - 图74)必须数值相同。然后你就得到了Convolutional Neural Networks - 图75,这里Convolutional Neural Networks - 图76其实就是下一层的通道数,它就是你用的过滤器的个数,在我们的例子中,那就是4×4×2。我写下这个假设时,用的步幅为1,并且没有padding。如果你用了不同的步幅或者padding,那么这个Convolutional Neural Networks - 图77数值会变化。

    单层卷积网络(One layer of a convolutional network)

    卷积网络其实就是用三维的卷积运算来取代了神经网络中的线性运算,即 Convolutional Neural Networks - 图78 。拿上一个例子,输入一个6 Convolutional Neural Networks - 图79 6 Convolutional Neural Networks - 图80 3的图像,用2个3 Convolutional Neural Networks - 图81 3 Convolutional Neural Networks - 图82 3的过滤器进行卷积,步长为1,无padding,最终得到2个4 Convolutional Neural Networks - 图83 4 的输出。接下来就与神经网络一样,将两个输出分别加上偏差 Convolutional Neural Networks - 图84Convolutional Neural Networks - 图85 ,这一步也可以先把2个4 Convolutional Neural Networks - 图86 4 的输出合成一个4 Convolutional Neural Networks - 图87 4 Convolutional Neural Networks - 图88 2的三维输出,在加上一个列向量 Convolutional Neural Networks - 图89 ,经过广播也可以达到同样的效果。得到的结果经一个激活函数,一般选用ReLU,便可以作为本层的输出,也就是下一层的输入。
    截屏2022-07-19 23.30.33.png
    这就是Convolutional Neural Networks - 图91Convolutional Neural Networks - 图92的演变过程首先执行线性函数,然后所有元素相乘做卷积,具体做法是运用线性函数再加上偏差,然后应用激活函数ReLU。这样就通过神经网络的一层把一个6×6×3的维度Convolutional Neural Networks - 图93演化为一个4×4×2维度的Convolutional Neural Networks - 图94,这就是卷积神经网络的一层。
    示例中我们有两个过滤器,也就是有两个特征,因此我们才最终得到一个4×4×2的输出。但如果我们用了10个过滤器,而不是2个,我们最后会得到一个4×4×10维度的输出图像,因为我们选取了其中10个特征映射,而不仅仅是2个,将它们堆叠在一起,形成一个4×4×10的输出图像
    假设你有10个过滤器,而不是2个,神经网络的一层是3×3×3,那么,这一层有多少个参数呢?我们来计算一下,每一层都是一个3×3×3的矩阵,因此每个过滤器有27个参数,也就是27个数。然后加上一个偏差,用参数b表示,现在参数增加到28个。之前有2个过滤器,而现在我们有10个,加在一起是28×10,也就是280个参数。注意不论输入图片有多大,1000×1000也好,5000×5000也好,参数始终都是280个。用这10个过滤器来提取特征,如垂直边缘,水平边缘和其它特征。即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作“避免过拟合”。你已经知道到如何提取10个特征,可以应用到大图片中,而参数数量固定不变,此例中只有28个,相对较少。
    截屏2022-07-19 23.34.49.png
    下面我们做一下总结:以上一层的输出作为输入,即第l层的输入维度为 Convolutional Neural Networks - 图96 , Convolutional Neural Networks - 图97 个过滤器的维度均为 Convolutional Neural Networks - 图98 ,这里需要让过滤器的通道数与输入相一致。经三维卷积运算得到一个 Convolutional Neural Networks - 图99 的矩阵,其中 Convolutional Neural Networks - 图100 ,Convolutional Neural Networks - 图101 ,经过一个ReLU运算,再与一个 Convolutional Neural Networks - 图102 的偏差相加,便得到了第l层的输出 Convolutional Neural Networks - 图103 ,若样本有Convolutional Neural Networks - 图104个,则输出的规格为 Convolutional Neural Networks - 图105 。这就是一层卷积网络的运行过程。
    截屏2022-07-19 23.39.30.png

    简单卷积网络示例(A simple convolution network example)

    假设有一张图片,你想做图片分类或图片识别,把这张图片输入定义为Convolutional Neural Networks - 图107,然后辨别图片中有没有猫,用0或1表示,这是一个分类问题。我们来构建适用于这项任务的卷积神经网络。针对这个示例,用了一张比较小的图片,大小是Convolutional Neural Networks - 图108,这样设定可以使其中一些数字效果更好。所以Convolutional Neural Networks - 图109,即高度和宽度都等于39,Convolutional Neural Networks - 图110,即0层的通道数为3。
    截屏2022-07-20 18.19.33.png
    假设第一层我们用一个Convolutional Neural Networks - 图112的过滤器来提取特征,那么Convolutional Neural Networks - 图113,因为过滤器时3×3的矩阵。Convolutional Neural Networks - 图114Convolutional Neural Networks - 图115,所以高度和宽度使用valid卷积。如果有10个过滤器,神经网络下一层的激活值为Convolutional Neural Networks - 图116,10是因为用了10个过滤器,37是公式Convolutional Neural Networks - 图117的计算结果,也就是Convolutional Neural Networks - 图118,所以输出是Convolutional Neural Networks - 图119,它是一个vaild卷积,这是输出结果的大小。第一层标记为Convolutional Neural Networks - 图120Convolutional Neural Networks - 图121Convolutional Neural Networks - 图122等于第一层中过滤器的个数,这Convolutional Neural Networks - 图123是第一层激活值的维度。
    截屏2022-07-20 18.19.59.png
    假设还有另外一个卷积层,这次采用的过滤器是5×5的矩阵。在标记法中,神经网络下一层的Convolutional Neural Networks - 图125,即Convolutional Neural Networks - 图126步幅为2,即Convolutional Neural Networks - 图127padding为0,即Convolutional Neural Networks - 图128,且有20个过滤器。所以其输出结果会是一张新图像,这次的输出结果为Convolutional Neural Networks - 图129,因为步幅是2,维度缩小得很快,大小从Convolutional Neural Networks - 图130减小到Convolutional Neural Networks - 图131,减小了一半还多,过滤器是20个,所以通道数也是20,Convolutional Neural Networks - 图132即激活值Convolutional Neural Networks - 图133的维度。因此Convolutional Neural Networks - 图134
    截屏2022-07-20 18.22.28.png
    再来构建最后一个卷积层,假设过滤器还是Convolutional Neural Networks - 图136,步幅为2,即Convolutional Neural Networks - 图137最后输出为Convolutional Neural Networks - 图138,假设使用了40个过滤器。padding为0,40个过滤器,最后结果为Convolutional Neural Networks - 图139
    到此,这张Convolutional Neural Networks - 图140的输入图像就处理完毕了,为图片提取了Convolutional Neural Networks - 图141个特征,计算出来就是1960个特征。然后对该卷积进行处理,可以将其平滑或展开成1960个单元。平滑处理后可以输出一个向量,其填充内容是logistic回归单元还是softmax回归单元,完全取决于我们是想识图片上有没有猫,还是想识别K种不同对象中的一种,用\hat y表示最终神经网络的预测输出。明确一点,最后这一步是处理所有数字,即全部的1960个数字,把它们展开成一个很长的向量。为了预测最终的输出结果,我们把这个长向量填充到softmax回归函数中。
    截屏2022-07-20 18.24.48.png
    这是卷积神经网络的一个典型范例,设计卷积神经网络时,确定这些超参数比较费工夫。要决定过滤器的大小、步幅、padding以及使用多少个过滤器。
    截屏2022-07-20 18.26.16.png
    随着神经网络计算深度不断加深,通常开始时的图像也要更大一些,初始值为Convolutional Neural Networks - 图144,高度和宽度会在一段时间内保持一致,然后随着网络深度的加深而逐渐减小,从39到37,再到17,最后到7。而通道数量在增加,从3到10,再到20,最后到40。在许多其它卷积神经网络中,你也可以看到这种趋势。关于如何确定这些参数,后面课上我会更详细讲解,这是一个卷积神经网络示例。
    截屏2022-07-20 18.47.46.png
    一个典型的卷积神经网络通常有三层,一个是卷积层,我们常常用Conv来标注。还有两种常见类型层。一个是池化层,称之为POOL。最后一个是全连接层,用FC表示。虽然仅用卷积层也有可能构建出很好的神经网络,但大部分神经望楼架构师依然会添加池化层和全连接层。幸运的是,池化层和全连接层比卷积层更容易设计。

    池化层(Pooling layers)

    除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性(鲁棒性亦称健壮性、稳健性、强健性,是系统的健壮性,它是在异常和危险情况下系统生存的关键,是指系统在一定(结构、大小)的参数摄动下,维持某些性能的特性。 例如,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性)。所谓池化层就是把卷积层的卷积运算换成另一种运算,最常见的就是最大池化,这种运算不需要过滤器中含有参数,只是确定过滤器的维度即可,将过滤器按照步长与输入重叠后不必进行相乘再求和运算,而是提取当前区域的最大值即可。
    截屏2022-07-20 21.13.11.png
    最大池化
    举一个池化层的例子,再讨论池化层的必要性。假如输入是一个4×4矩阵,用到的池化类型是最大池化(max pooling)。执行最大池化的树池是一个2×2矩阵。执行过程非常简单,把4×4的输入拆分成不同的区域,我把这个区域用不同颜色来标记。对于2×2的输出,输出的每个元素都是其对应颜色区域中的最大元素值。
    截屏2022-07-20 21.14.08.png
    左上区域的最大值是9,右上区域的最大元素值是2,左下区域的最大值是6,右下区域的最大值是3。为了计算出右侧这4个元素值,我们需要对输入矩阵的2×2区域做最大值运算。这就像是应用了一个规模为2的过滤器,因为我们选用的是2×2区域,步幅是2,这些就是最大池化的超参数。
    因为我们使用的过滤器为2×2,最后输出是9。然后向右移动2个步幅,计算出最大值2。然后是第二行,向下移动2步得到最大值6。最后向右移动3步,得到最大值3。这是一个2×2矩阵,即f=2,步幅是2,即s=2。
    这是对最大池化功能的直观理解,你可以把这个4×4输入看作是某些特征的集合,也就是神经网络中某一层的非激活值集合。数字大意味着可能探测到了某些特定的特征,左上象限具有的特征可能是一个垂直边缘,或是大家害怕遇到的CAP特征。显然左上象限中存在这个特征,这个特征可能是一只猫眼探测器。然而,右上象限并不存在这个特征。最大化操作的功能就是只要在任何一个象限内提取到某个特征,它都会保留在最大化的池化输出里。所以最大化运算的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值。如果没有提取到这个特征,可能在右上象限中不存在这个特征,那么其中的最大值也还是很小,这就是最大池化的直观理解。
    池化层可以在缩小维度的同时,提取每个区域的特征,这样不至于丢失信息,同时由于不考虑过滤器内部参数,池化层其实是没有参数需要训练的。维度方面,高度和宽度的计算公式与卷积运算相同,而通道数贼是输出与输入的通道数保持相同,这一点是有别与卷积层的。
    平均池化
    还有一种池化叫做平均池化,它不太常用顾名思义,就是不再提取区域的最大值,而是求取区域块的平均值。一般来讲,还是最大池化更为常用。
    截屏2022-07-20 21.25.25.png
    目前来说,最大池化比平均池化更常用。但也有例外,就是深度很深的神经网络,你可以用平均池化来分解规模为7×7×1000的网络的表示层,在整个空间内求平均值,得到1×1×1000。但在神经网络中,最大池化要比平均池化用得更多。
    总结一下,池化的超级参数包括过滤器大小f和步幅s,常用的参数值为f=2,s=2,应用频率非常高,其效果相当于高度和宽度缩减一半。也有使用Convolutional Neural Networks - 图149的情况。至于其它超级参数就要看你用的是最大池化还是平均池化了。你也可以根据自己意愿增加表示padding的其他超级参数,虽然很少这么用。最大池化时,往往很少用到超参数padding,当然也有例外的情况。大部分情况下,最大池化很少用padding。目前Convolutional Neural Networks - 图150最常用的值是0,即Convolutional Neural Networks - 图151。最大池化的输入就是Convolutional Neural Networks - 图152,假设没有padding,则输出Convolutional Neural Networks - 图153。输入通道与输出通道个数相同,因为我们对每个通道都做了池化。需要注意的一点是,池化过程中没有需要学习的参数。执行反向传播时,反向传播没有参数适用于最大池化。只有这些设置过的超参数,可能是手动设置的,也可能是通过交叉验证设置的。
    截屏2022-07-20 21.29.55.png

    卷积神经网络示例(Convolutional neural network example)

    假设我们要做一个手写体识别的卷积网络,首先输入一张图片,比如手写体7,这是一个32维RGB图像,那么输入的维度为32 Convolutional Neural Networks - 图155 32 Convolutional Neural Networks - 图156 3。接下来进行卷积神经网络的第一层处理,包括一个卷积层和一个最大池化层,首先经过卷积层,有一些超参数是需要我们自己设计的:设过滤器维度为5 Convolutional Neural Networks - 图157 5 Convolutional Neural Networks - 图158 3,步长为1,个数为6个,无padding,那么经过计算,输出维度为28 Convolutional Neural Networks - 图159 28 Convolutional Neural Networks - 图160 6。将这一层记为conv1。
    截屏2022-07-21 09.55.23.png
    接下来是最大池化,选取f=2,s=2,没有padding,这种超参数的选取可以使得高度和宽度缩小一半,通道数保持不变。于是输出维度变为14 Convolutional Neural Networks - 图162 14 Convolutional Neural Networks - 图163 6。
    截屏2022-07-21 09.56.35.png
    我们将这两层记为神经网络的第一层,接下来在经过一个神经网络,这层中,卷积层的f=5,s=1,p=0,个数为16个;池化层的超参数选取还和第一层一样,f=2,s=2,没有padding,于是第二层得到输出维度为5Convolutional Neural Networks - 图165 5 Convolutional Neural Networks - 图166 16。
    截屏2022-07-21 09.57.33.png
    我们可以发现,随着层数的增加,输出的高度和宽度都在缩小,而通道数在一直增加,这确实是卷积网络的一个特点。正是这个特点决定了卷积网络的参数要比一般神经网络要少,这也是我们应用它的原因。
    5Convolutional Neural Networks - 图168 5 Convolutional Neural Networks - 图169 16是400个元素,接下来我们把它平整成一个列向量,作为一层神经元层,其中的每一个元素都是一个神经元,在下一层,选取120个元素,这便是一个全连接层,其中权重矩阵W的维度按照之前所讲,应为120 Convolutional Neural Networks - 图170 400,这一层全连接层我们记为FC3,下一层更小,选取84个神经元,记为FC4。最后在填充一个softmax单元,由于我们想识别的是0到9这十个数字,所以这个softmax就会有10个输出。
    截屏2022-07-21 09.58.28.png
    每层的参数情况
    截屏2022-07-21 09.59.25.png
    通过这个表可以发现,第一:池化层没有参数,第二:卷积层的参数远小于全连接层的,这可以看出卷积层对于减小参数的优势。

    卷积层的优点

    卷积层的优势就在于它所含有的参数少,不会给计算带来负担,那么它为什么可以减小参数呢?
    主要原因有

  • 参数共享,只需要一个过滤器,仅仅通过它的移动,便可以对输入图像的所有参数进行检测,普通神经网络则需要每一个运算都另设参数,而神经网络只需要过滤器这一组参数足矣,可见卷积网络的优势。

  • 稀疏链接,对比普通神经网络的全连接,卷积运算其实是一种稀疏链接,比如说如果过滤器是3 Convolutional Neural Networks - 图173 3的,那么输出的每一个参数只与输入的九个数有关,类比普通神经网络就是下一层的一个神经元只和上一层的9个神经元相连,而与其他的神经元不相连,这样使得权重矩阵W的维度下降,也可以使参数减少。

截屏2022-07-21 10.06.44.png
从整体的角度来看一下整个的卷积神经网络,我们可以看到,与传统神经网络不同的是,卷积神经网络用卷积和池化层代替了一大部分的神经元层,后面的全连接层与深度神经网络没什么不同。之所以要用卷积池化层来代替就是因为在图片处理中,如果不对图片进行处理而直接使用深度神经网络,则会参数过大,影响计算。卷积池化层的作用就是提取图片中的有用信息,而过滤掉无用的信息,简单来说就是特征提取。比如说我想识别图片中的猫,那么猫旁边的玩具实际上是没什么用的,我们用卷积池化层进行过滤后便可以大大减少参数,使得神经网络得以搭建。对于超参数的选择,最好的办法是多看他人成功的案例,选取别人设计好的超参数,这样会事半功倍。

深度卷积网络:实例探究(Deep convolutional models: case studies)

为什么要进行实例探究

学以致用,学习经典CNN后,会对如何构建有效的CNN更有感觉。
经典网络,LeNet-5,AlexNet,VGG,ResNet,Inception
截屏2022-07-21 10.29.56.png
LeNet-5网络,应该是1980年代的,经常被引用的AlexNet,还有VGG网络。这些都是非常有效的神经网络范例,当中的一些思路为现代计算机视觉技术的发展奠定了基础。论文中的这些想法可能对你大有裨益,对你的工作也可能有所帮助。
ResNet,又称残差网络。神经网络正在不断加深。ResNet神经网络训练了一个深达152层的神经网络,并且在如何有效训练方面,总结出了一些有趣的想法和窍门。
了解了这些神经网络,相信你会对如何构建有效的卷积神经网络更有感觉。即使计算机视觉并不是你的主要方向,但相信你会从ResNetInception网络这样的实例中找到一些不错的想法。这里面有很多思路都是多学科融合的产物。总之,即便你不打算构建计算机视觉应用程序,试着从中发现一些有趣的思路,对工作也会有所帮助。

经典网络(Classic networks)

几个经典的神经网络结构,分别是LeNet-5AlexNetVGGNet。

LeNet-5

假设你有一张32×32×1的图片,LeNet-5可以识别图中的手写数字,比如像手写数字7。LeNet-5是针对灰度图片训练的,所以图片的大小只有32×32×1。
LeNet-5使用6个5×5的过滤器,步幅为1。由于使用了6个过滤器,步幅为1,padding为0,输出结果为28×28×6,图像尺寸从32×32缩小到28×28。然后进行池化操作,在这篇论文写成的那个年代,人们更喜欢使用平均池化,而现在我们可能用最大池化更多一些。在这个例子中,进行平均池化,过滤器的宽度为2,步幅为2,图像的尺寸,高度和宽度都缩小了2倍,输出结果是一个14×14×6的图像。
接下来是卷积层,用一组16个5×5的过滤器,新的输出结果有16个通道。LeNet-5的论文是在1998年撰写的,当时人们并不使用padding,或者总是使用valid卷积,这就是为什么每进行一次卷积,图像的高度和宽度都会缩小,所以这个图像从14到14缩小到了10×10。然后又是池化层,高度和宽度再缩小一半,输出一个5×5×16的图像。将所有数字相乘,乘积是400。
下一层是全连接层,在全连接层中,有400个节点,每个节点有120个神经元,这里已经有了一个全连接层。但有时还会从这400个节点中抽取一部分节点构建另一个全连接层,就像这样,有2个全连接层。
最后一步就是利用这84个特征得到最后的输出,我们还可以在这里再加一个节点用来预测Convolutional Neural Networks - 图176的值,Convolutional Neural Networks - 图177有10个可能的值,对应识别0-9这10个数字。在现在的版本中则使用softmax函数输出十种分类结果,而在当时,LeNet-5网络在输出层使用了另外一种,现在已经很少用到的分类器。
截屏2022-07-21 10.37.57.png
这个神经网络中还有一种模式至今仍然经常用到,就是一个或多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接一个池化层,然后是全连接层,最后是输出,这种排列方式很常用。
小结

  • 针对灰度图;
  • 现代版本使用Relu;
  • 现代版本最后是softmax层;
  • 建议只读原论文的第二部分和第三部分,因为大部分都已过时,但网络结构仍有参考价值,即conv - pool - conv - pool - FC - FC 。

    AlexNet

    以论文的第一作者Alex Krizhevsky的名字命名的,另外两位合著者是ilya SutskeverGeoffery Hinton
    截屏2022-07-21 10.40.39.png
    AlexNet首先用一张227×227×3的图片作为输入,实际上原文中使用的图像是224×224×3,但是如果你尝试去推导一下,你会发现227×227这个尺寸更好一些。第一层使用96个11×11的过滤器,步幅为4,由于步幅是4,(利用公式Convolutional Neural Networks - 图180计算,Convolutional Neural Networks - 图181=55)因此尺寸缩小到55×55,缩小了4倍左右。然后用一个3×3的过滤器构建最大池化层,f=3,步幅s为2,卷积层尺寸缩小为27×27×96。接着再执行一个5×5的卷积,padding之后,输出是27×27×256。然后再次进行最大池化,尺寸缩小到13×13。再执行一次same卷积,相同的padding,得到的结果是13×13×384,384个过滤器。再做一次same卷积,就像这样。再做一次同样的操作,最后再进行一次最大池化,尺寸缩小到6×6×256。6×6×256等于9216,将其展开为9216个单元,然后是一些全连接层。最后使用softmax函数输出识别的结果,看它究竟是1000个可能的对象中的哪一个。
    实际上,这种神经网络与LeNet有很多相似之处,不过AlexNet要大得多。正如前面讲到的LeNetLeNet-5大约有6万个参数,而AlexNet包含约6000万个参数。当用于训练图像和数据集时,AlexNet能够处理非常相似的基本构造模块,这些模块往往包含着大量的隐藏单元或数据,这一点AlexNet表现出色。AlexNetLeNet表现更为出色的另一个原因是它使用了ReLu激活函数。
    小结
    AlexNet与LeNet在很多地方很相似,但是要大很多。LeNet-5大概6万个参数。而AlexNet大概6000万个参数。
    AlexNet(比LeNet-5)表现出色的原因:
    当用于训练图像和数据集的时候,AlexNet能够处理非常相似的基本构造模块。这些模块往往包含着大量的隐藏单元或数据。
    使用Relu激活函数。
    看论文可以绕过的点:
    在写AlexNet论文的时候,GPU速度还很慢。所以采用了很复杂的方法在两个GPU上训练。
    所使用的局部响应归一化层(LRN层:local response normalization)后续研究发现起不到作用,也没人用,可以不看。
    该论文是深度学习进入计算机视觉领域的开端。从这篇论文开始,计算机视觉的研究者开始重视深度学习,最后使得深度学习在其他领域也发扬光大。

    VGG

    也叫作VGG-16网络,VGG-16网络没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络。
    截屏2022-07-21 10.55.06.png
    首先用3×3,步幅为1的过滤器构建卷积层,padding参数为same卷积中的参数。然后用一个2×2,步幅为2的过滤器构建最大池化层。因此VGG网络的一大优点是它确实简化了神经网络结构,下面我们具体讲讲这种网络结构。假设要识别这个图像,在最开始的两层用64个3×3的过滤器对输入图像进行卷积,输出结果是224×224×64,因为使用了same卷积,通道数量也一样。VGG-16其实是一个很深的网络。
    假设这个小图是我们的输入图像,尺寸是224×224×3,进行第一个卷积之后得到224×224×64的特征图,接着还有一层224×224×64,得到这样2个厚度为64的卷积层,意味着我们用64个过滤器进行了两次卷积。正如我在前面提到的,这里采用的都是大小为3×3,步幅为1的过滤器,并且都是采用same卷积,所以我就不再把所有的层都画出来了,只用一串数字代表这些网络。
    接下来创建一个池化层,池化层将输入图像进行压缩,从224×224×64缩小到多少呢?没错,减少到112×112×64。然后又是若干个卷积层,使用129个过滤器,以及一些same卷积,我们看看输出什么结果,112×112×128.然后进行池化,可以推导出池化后的结果是这样(56×56×128)。接着再用256个相同的过滤器进行三次卷积操作,然后再池化,然后再卷积三次,再池化。如此进行几轮操作后,将最后得到的7×7×512的特征图进行全连接操作,得到4096个单元,然后进行softmax激活,输出从1000个对象中识别的结果。
    VGG-16的这个数字16,就是指在这个网络中包含16个卷积层和全连接层。确实是个很大的网络,总共包含约1.38亿个参数,即便以现在的标准来看都算是非常大的网络。但VGG-16的结构并不复杂,这点非常吸引人,而且这种网络结构很规整,都是几个卷积层后面跟着可以压缩图像大小的池化层,池化层缩小图像的高度和宽度。同时,卷积层的过滤器数量变化存在一定的规律,由64翻倍变成128,再到256和512。作者可能认为512已经足够大了,所以后面的层就不再翻倍了。无论如何,每一步都进行翻倍,或者说在每一组卷积层进行过滤器翻倍操作,正是设计此种网络结构的另一个简单原则。这种相对一致的网络结构对研究者很有吸引力,而它的主要缺点是需要训练的特征数量非常巨大。
    小结
    一种没有很多超参数,只需要专注于构建卷积层的简单网络。VGG-16简化了神经网络结构。
    VGG-16,即有16层网络的VGG,有13个CONV和3个FC。一共1.38亿个参数。
    虽然是个大网络,但结构简单,规整,过滤器数量变化存在规律(64 - 128 - 256 - 512 - 512)。
    缺点是:需要训练的特征数量非常巨大。

    残差网络(ResNets)(Residual Networks (ResNets))

    常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。ResNets是由残差块(Residual block)构建的。

    跳跃连接(Skip connection)

    又叫捷径(short cut),用来构建残差块,而残差块可以训练更深的神经网络。它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳跃连接构建能够训练深度网络的ResNets,有时深度能够超过100层,

    残差块(Residual block)

    截屏2022-07-21 11.02.59.png
    这是一个两层神经网络,在Convolutional Neural Networks - 图184层进行激活,得到Convolutional Neural Networks - 图185,再次进行激活,两层之后得到Convolutional Neural Networks - 图186。计算过程是从Convolutional Neural Networks - 图187开始,首先进行线性激活,根据这个公式:Convolutional Neural Networks - 图188,通过Convolutional Neural Networks - 图189算出Convolutional Neural Networks - 图190,即Convolutional Neural Networks - 图191乘以权重矩阵,再加上偏差因子。然后通过ReLU非线性激活函数得到Convolutional Neural Networks - 图192计算得出。接着再次进行线性激活,依据等式Convolutional Neural Networks - 图193,最后根据这个等式再次进行ReLu非线性激活,即Convolutional Neural Networks - 图194,这里的g是指ReLU非线性函数,得到的结果就是Convolutional Neural Networks - 图195。换句话说,信息流从Convolutional Neural Networks - 图196需要经过以上所有步骤,即这组网络层的主路径。
    截屏2022-07-21 15.02.59.png
    在残差网络中有一点变化,我们将Convolutional Neural Networks - 图198直接向后,拷贝到神经网络的深层,在ReLU非线性激活函数前加上Convolutional Neural Networks - 图199,这是一条捷径。Convolutional Neural Networks - 图200的信息直接到达神经网络的深层,不再沿着主路径传递,这就意味着最后这个等式Convolutional Neural Networks - 图201去掉了,取而代之的是另一个ReLU非线性函数,仍然对Convolutional Neural Networks - 图202进行Convolutional Neural Networks - 图203函数处理,但这次要加上Convolutional Neural Networks - 图204,即:Convolutional Neural Networks - 图205,也就是加上的这个Convolutional Neural Networks - 图206产生了一个残差块。
    截屏2022-07-21 15.06.05.png
    在上面这个图中,我们也可以画一条捷径,直达第二层。实际上这条捷径是在进行ReLU非线性激活函数之前加上的,而这里的每一个节点都执行了线性函数和ReLU激活函数。所以Convolutional Neural Networks - 图208插入的时机是在线性激活之后,ReLU激活之前。除了捷径,你还会听到另一个术语“跳跃连接”,就是指Convolutional Neural Networks - 图209跳过一层或者好几层,从而将信息传递到神经网络的更深层。

    残差网络 (Residual Network)

    ResNet的发明者是何凯明Kaiming He)、张翔宇Xiangyu Zhang)、任少卿Shaoqing Ren)和孙剑Jiangxi Sun),他们发现使用残差块能够训练更深的神经网络。所以构建一个ResNet网络就是通过将很多这样的残差块堆积在一起,形成一个很深神经网络,
    截屏2022-07-21 15.09.00.png
    这并不是一个残差网络,而是一个普通网络(Plain network),这个术语来自ResNet论文。
    把它变成ResNet的方法是加上所有跳跃连接,正如前一张幻灯片中看到的,每两层增加一个捷径,构成一个残差块。如图所示,5个残差块连接在一起构成一个残差网络。
    截屏2022-07-21 15.09.42.png

随着网络层数的增加,理论上训练误差应该越来越小;但在普通网络上却不是这样,随着网络深度的加深,训练错误会越来越多。而残差网络可以做到。

残差网络为什么有用

深度网络存在退化问题,即随着深度的加深,训练误差反而加大。
截屏2022-07-21 15.36.39.png
给一个普通网络加入残差块,如图所示。整个网络使用Relu激活函数,那么,所有的激活值a>=0。如果使用L2L2正则化或者权重衰减,会压缩Convolutional Neural Networks - 图213的值。如果对b使用权重衰减,也可以达到相同效果。
如果Convolutional Neural Networks - 图214,为方便分析,假设此时Convolutional Neural Networks - 图215 ,那么Convolutional Neural Networks - 图216.
即,skip connection 使网络很容易得到a[l+2]=a[l]a[l+2]=a[l]这个恒等式。
残差块可以很容易地学习到恒等式函数
这意味着,即使给神经网络增加了两层,也没有使得网络的性能降低。因为学习恒等式函数对残差块来说很简单。尽管多了两层,但是也只是把Convolutional Neural Networks - 图217的值赋给Convolutional Neural Networks - 图218。所以,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的性能。但我们的目标不是仅仅在保持网络性能的条件下单纯的增加层数(要深还要好)。如果我们新添加的隐藏单元能够学习到一些有用信息,那么它可能比学习到恒等式函数表现的更好(深,好)。如果是没有残差块的深度普通网络,当网络不断加深时,其仅仅选择学习恒等式函数的参数都很困难。所以增加层数最后的表现不但不能变好,反而更糟。
总结:残差块学习恒等函数非常容易。所以可以很肯定的说,增加残差块不会使得网络的性能受到影响。很多时候,这些增加的残差块还可以提升网络的性能(如果残差块学习到有用信息的话)。反过来说,增加残差块至少不会降低网络的性能。

网络中的网络以及 1×1 卷积(Network in Network and 1×1 convolutions)

1x1卷积有时也被称为Network in Network,在架构内容设计方面,其中一个比较有帮助的想法是使用1×1卷积。过滤器为1×1,输入一张6×6×1的图片,然后对它做卷积,起过滤器大小为1×1×1,结果相当于把这个图片乘以数字2,所以前三个单元格分别是2、4、6等等。用1×1的过滤器进行卷积,似乎用处不大,只是对输入矩阵乘以某个数字。但这仅仅是对于6×6×1的一个通道图片来说,1×1卷积效果不佳。1×1卷积可以从根本上理解为对这32个不同的位置都应用一个全连接层,全连接层的作用是输入32个数字(过滤器数量标记为Convolutional Neural Networks - 图219,在这36个单元上重复此过程),输出结果是6×6×filters(过滤器数量),以便在输入层上实施一个非平凡(non-trivial)计算。
截屏2022-07-22 23.17.59.png


假设这是28×28×192的输入层,使用池化层压缩它的高度和宽度。但如果通道数量很大,该如何把它压缩为28×28×32维度的层呢?用32个大小为1×1的过滤器,严格来讲每个过滤器大小都是1×1×192维,因为过滤器中通道数量必须与输入层中通道的数量保持一致。但是使用了32个过滤器,输出层为28×28×32,这就是压缩通道数(Convolutional Neural Networks - 图221)的方法,对于池化层我只是压缩了这些层的高度和宽度。在之后我们看到在某些网络中1×1卷积是如何压缩通道数量并减少计算的。当然如果你想保持通道数192不变,这也是可行的,1×1卷积只是添加了非线性函数,当然也可以让网络学习更复杂的函数,比如,再添加一层,其输入为28×28×192,输出为28×28×192。1×1卷积层就是这样实现了一些重要功能的(doing something pretty non-trivial),它给神经网络添加了一个非线性函数,从而减少或保持输入层中的通道数量不变,当然如果你愿意,也可以增加通道数量。
截屏2022-07-23 09.58.44.png
小结
1x1卷积在二位图像上相当于图片的每个元素和一个卷积数字相乘。 但是,在三维上,与1x1xConvolutional Neural Networks - 图223卷积核进行卷积,相当于三维图像上的1x1xConvolutional Neural Networks - 图224的切片,也就是Convolutional Neural Networks - 图225个点的数值乘以卷积数值权重(按照一般来说应该是等权重的),最后通过ReLU函数,输出对应的结果。而不同的卷积核则相当于不同的隐藏层神经元结点。
1x1卷积的应用:

  • 维度压缩:使目标的通道数量为1x1的卷积核个数
  • 增加非线性:保持原维度,但是它给神经网络添加了一个非线性函数

    谷歌 Inception 网络

    Inception Network的作用就是令我们无需去考虑在构建深度卷积神经网络时,使用多大的卷积核以及是否添加池化层等问题。基本思想是Inception网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。
    Inception模块的架构:
    截屏2022-07-23 09.58.44.png截屏2022-07-23 10.09.55.png
    上图中使用了same类型的padding来池化,使得输出维度跟其他输出一样,这样才能跟其他输出连接起来。但是这样的一个架构,会有一个计算成本问题(以5x5卷积核运算为例):总的计算成本为 28283255192=120M
    截屏2022-07-23 10.12.14.png
    在这里使用了1x1大小的卷积核作为过渡,将中间的蓝色部分也叫“bottleneck layer“,主要是为了减小通道量,从而降低计算量,仍然以5x5的为例:总计算成本为1x1卷积层成本28
    281611192=2.4M 与 5x5卷积层成本2828325516=10.0M之和,共12.4M。同上一个架构相比计算成本减少了一个数量级。所以1x1卷积核作为”bottleneck layer“的过渡层,能够有效的减少卷积神经网络的计算成本。事实证明,只要合理的设置”bottleneck layer“,既可以显著减少上层的规模,同时也可以降低计算成本,而不会影响网络的性能
    截屏2022-07-23 10.14.50.png
    这是一张取自Szegety et al的论文中关于Inception网络的图片,你会发现图中有许多重复的模块,可能整张图看上去很复杂,但如果你只截取其中一个环节(编号1),就会发现这是在前面所见的Inception块。
    小结
    总结一下,如果你在构建神经网络层的时候,不想决定池化层是使用1×1,3×3还是5×5的过滤器,那么*Inception
    模块就是最好的选择。我们可以应用各种类型的过滤器,只需要把输出连接起来。之后我们讲到计算成本问题,我们学习了如何通过使用1×1卷积来构建瓶颈层,从而大大降低计算成本。
    你可能会问,仅仅大幅缩小表示层规模会不会影响神经网络的性能?事实证明,只要合理构建瓶颈层,你既可以显著缩小表示层规模,又不会降低网络性能,从而节省了计算。

    迁移学习(Transfer Learning)

    如果你要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始,如果你下载别人已经训练好网络结构的权重,你通常能够进展的相当快,用这个作为预训练,然后转换到你感兴趣的任务上。比如ImageNet,或者MS COCO,或者Pascal类型的数据集,这些都是不同数据集的名字,并且有大量的计算机视觉研究者已经用这些数据集训练过他们的算法了。
    小数据集:应用其他研究者建立的模型和参数,用少量的数据仅训练最后自定义的softmax部分。
    截屏2022-07-23 10.17.33.png
    大数据集:如果有大量数据,你应该做的就是用开源的网络和它的权重,把这、所有的权重当作初始化,然后训练整个网络。可以仅训练后面几层,而前面的直接使用已有的参数和模型。总之,随着数据集的增加,我们需要”freeze“的层数越来越少,最后如果我们有十分庞大的数据集,我们可以训练我们网络的所有参数,但是我们仍然可以将其他研究者训练好的模型参数作为我们的初始化参数来代替随机初始化的参数,从而加速我们的模型训练。
    截屏2022-07-23 10.17.53.png

    数据增强(Data augmentation)

    大部分的计算机视觉任务使用很多的数据,所以数据扩充是经常使用的一种技巧来提高计算机视觉系统的表现。与其他机器学习问题相比,在计算机视觉领域当下最主要的问题是没有办法得到足够多的数据。所以我们在训练计算机数据模型的时候,数据扩充会非常有用。
    垂直镜像对称(Mirroring)
    训练集中有这张图片,然后将其翻转得到右边的图像。对大多数计算机视觉任务,左边的图片是猫,然后镜像对称仍然是猫,如果镜像操作保留了图像中想识别的物体的前提下,这是个很实用的数据扩充技巧。
    截屏2022-07-23 10.24.28.png
    随机裁剪(Random Cropping)
    给定一个数据集,然后开始随机裁剪,可能修剪这个(编号1),选择裁剪这个(编号2),这个(编号3),可以得到不同的图片放在数据集中,你的训练集中有不同的裁剪。随机裁剪并不是一个完美的数据扩充的方法,如果你随机裁剪的那一部分(红色方框标记部分,编号4),这部分看起来不像猫。但在实践中,这个方法还是很实用的,随机裁剪构成了很大一部分的真实图片。
    截屏2022-07-23 10.25.47.png
    彩色转换(Color Shifting)
    有这样一张图片,然后给RGB三个通道上加上不同的失真值。在这个例子中(编号1),要给红色、蓝色通道加值,给绿色通道减值。红色和蓝色会产生紫色,使整张图片看起来偏紫,这样训练集中就有失真的图片。为了演示效果,我对图片的颜色进行改变比较夸张。在实践中,对RGB的变化是基于某些分布的,这样的改变也可能很小。
    截屏2022-07-23 10.27.35.png
    当你有特别大的训练数据,接下来这些就是人么经常使用的方法。你可能会使用CPU线程,然后它不停的从硬盘中读取数据,所以你有一个从硬盘过来的图片数据流。你可以用CPU线程来实现这些失真变形,可以是随机裁剪、颜色变化,或者是镜像。但是对每张图片得到对应的某一种变形失真形式,看这张图片(编号1),对其进行镜像变换,以及使用颜色失真,这张图最后会颜色变化(编号2),从而得到不同颜色的猫。与此同时,CPU线程持续加载数据,然后实现任意失真变形,从而构成批数据或者最小批数据,这些数据持续的传输给其他线程或者其他的进程,然后开始训练,可以在CPU或者GPU上实现训一个大型网络的训练。常用的实现数据扩充的方法是使用一个线程或者是多线程,这些可以用来加载数据,实现变形失真,然后传给其他的线程或者其他进程,来训练这个(编号2)和这个(编号1),可以并行实现。
    截屏2022-07-23 10.30.30.png
    小结
    这就是数据扩充,与训练深度神经网络的其他部分类似,在数据扩充过程中也有一些超参数,比如说颜色变化了多少,以及随机裁剪的时候使用的参数。与计算机视觉其他部分类似,一个好的开始可能是使用别人的开源实现,了解他们如何实现数据扩充。当然如果你想获得更多的不变特性,而其他人的开源实现并没有实现这个,也可以去调整这些参数。

    计算机视觉状

    数据和手工工程:
    截屏2022-07-23 10.32.30.png
    在有大量数据的时候,我们更倾向于使用简单的算法和更少的手工工程。因为此时有大量数据,我们不需要为这个问题来精心设计特征,我们使用一个大的网络结果或者更简单的模型就能够解决。 相反,在有少量数据的时候,我们从事的更多是手工工程,因为数据量太少,较大的网络结构或者模型很难从这些少量的数据中获取足够的特征,而手工工程实际上是获得良好表现的最佳方式。
    Tip for doing well:在基准研究和比赛中,下面的tips可能会有好的表现

  • Ensembling:独立的训练多个网络模型,输出平均结果或加权平均结果。

  • 测试时的Multi-crop:将数据扩充应用到测试,并取平均结果。

    目标检测(Object detection)

    目标定位(Object localization)