• 6.卷积神经网络


    #pic_center

    R 1 R_1 R1

    R 2 R^2 R2

    知识框架

    No.1 卷积层

    一、从全连接到卷积

    1、分类猫和狗的图片

    • 开始了真正的卷积哈。卷积是整个深度学习中最重要的概念之一。今天将记录一下卷积的一些基本知识。从一个简单的例子出发,假设要进行图片分类,问题是要分类猫和狗。假设使用手机拍照片,现在一般的手机至少有大约1,000万像素,甚至1,200万像素。这是三年前的手机,而现在的手机甚至有上亿像素。假设用手机拍了一张1,200万像素的RGB图片,这意味着有303,600万个元素,即每个像素都有一个值。
    • 假设使用一个单隐藏层的MLP来训练,而且隐藏层的大小是100,那么这个模型就有36亿个参数。这个参数数量远远超过了世界上所有猫和狗的总数。大概有9亿只狗和6亿只猫,总共约15亿只。所以,用MLP来处理这样的图片时,会遇到问题,特别是在处理较大的图片时。因此,需要考虑如何解决这个问题。

    在这里插入图片描述

    2、回顾:单隐藏层MLP

    • 来看一下,就是MLP(多层感知器)的问题。刚刚我们讲到的是,输入有3,600万个元素,而隐藏层的大小是100。那么权重就是100乘以3,600万,即36亿。如果要存储这36亿的权重,大约需要14GB的内存。基本上,只有配备强大的GPU才能承受得住这个内存开销。这显然不是一个可行的方案,因为这还不考虑进行实际的计算操作。
    • 那么,如果要使用多层结构,情况就更加糟糕了。现在我们面临着一个巨大的内存需求问题,因此需要寻找其他解决方案。

    image-20231102151445347

    3、Waldo在哪里?

    • 看一下关于图像的问题,我们要讨论的是整个图像中有什么不同寻常之处。让我们看一个简单的例子,这是一个德国比较流行的游戏,通常出现在儿童书籍中。这个游戏的目标是,通过一本书中的图像,让小孩子找到"Waldo",这个"Waldo"是一个特定的人物,而图像中会有许多其他元素。"Waldo"会被巧妙地藏在图像中的某个地方,然后小朋友需要努力寻找他。这就是说,在这个图像中找到"Waldo"并不容易,因为有很多其他元素干扰。
    • 所以,我们可以看到,在这种情况下,找到"Waldo"其实是一项具有挑战性的任务,因为图像中有很多干扰元素,这使得寻找变得更加困难。这个游戏的目的是训练观察力和耐心,同时也可以用来说明在图像处理中,识别目标可能会受到噪音和其他干扰的影响。

    image-20231102151533724

    4、两个原则

    • 寻找模式的时候,有两个重要的原则需要考虑。首先,我们可以考虑平移不变性。这意味着,如果我们能够在一处地方找到一个模式(比如"water"),那么当这个模式出现在其他地方时,我们应该能够以相似的方式进行识别。我们需要一个分类器,能够在不同位置的图像中检测到相同的模式。这是为了确保我们的识别器不会因为模式出现在不同位置而发生改变。
    • 第二个原则是局部性。当寻找某个模式时,我们通常只需要关注局部区域,而不必远远地观察整个图像。我们只需关注局部信息,而不需要考虑全局信息。这有助于提高效率,并且与计算机视觉中的许多算法和技术密切相关。
    • 这两个原则在图像模式识别中起着关键作用,它们对我们后续的设计和算法选择提供了重要的启发。

    在这里插入图片描述

    5、重新考察全连接层

    • 要从全连接层的角度出发,应用这两个原则来实现卷积。如前所述,卷积实际上是一种特殊的全连接层。让我们来详细看一下这是如何实现的。
    • 首先,我们知道全连接层通常将图像视为一维向量,而现在我们需要将其还原为二维矩阵,因为我们需要考虑空间信息。因此,将输入和输出从向量变为矩阵,这两者都具有宽度和高度的维度。这导致权重从二维张量变为四维张量。之前权重仅取决于输入和输出的长度,现在它们还取决于输入和输出的高度和宽度。
    • 我们可以将这些权重重新塑造为一个四维张量,表示为wijkl。现在,输出h[i][j]之前是一个简单的h[i],但现在我们必须处理一个矩阵。因此,我们有两个坐标i和j,然后我们引入了两个额外的坐标k和l来遍历这两个维度,然后对它们进行求和。这等效于之前的二维情况,其中wij对应于wi’j’,xj对应于xj’,然后进行加和,最后再加上偏置b。
    • 我们可以将w的元素重新排列为v,这可以通过索引变换来实现,即vijab = wijab。这使我们可以重排下标,以便我们可以将元素表达为vijab,这可以看作对x进行某种线性变换。这个变换将i + a变为a,将j + b变为b。因此,我们可以看到如何重新索引w的元素以引出卷积的操作。
    • 总结一下,这是如何将全连接层重新组织为一个二维的输入输出层,并如何进行下标变换以引入卷积操作。这个过程中引入的权重变换和下标变换是卷积运算的核心。

    在这里插入图片描述

    在这里插入图片描述

    6、原则#1–平移不变性

    • 接下来,我们来应用第一个原则,即平移不变性。我们需要考虑一个问题,当输入发生平移时,会如何影响输出。以一个简单的例子来说明,假设 h[i][j] 等于这样计算出来。如果一个东西在输入 x 上发生了平移,即发生了微小的位移,那么对应的 vijab 也会发生变化。这里的 v 代表权重,用于识别图像中的特征。
    • 假设 x 的位置发生了变化,即 i 和 j 发生了变化,那么整个 v 也会发生变化。这就意味着不管 i 和 j 如何变化,v 应该保持不变。为了实现这一点,我们引入一个约束,使得 vijab 等于 vab。这意味着前两个维度基本上都是常数,我们可以忽略它们,即抹掉前两个维度。
    • 因此,hij等于 vab 乘以 xij ;[i]加上 a,[j] 加上 b。无论 i 和 j 如何变化,输出位置的移动,模式的识别器都保持不变。 vab 不会发生变化,这就是二维卷积的本质。
    • 需要注意的是,尽管严格来说,数学上它被称为二维交叉相关,而不是卷积。它实际上是在输入的像素上以它为中心进行不断的 offset(偏移),对它的一个模式进行累积的操作。在这里,我们展示了二维卷积的效果。
    • 所以,第一个原则是平移不变性,通过对权重的限制,将纬度 IJ 剔除,只留下 AB 纬度。这就直接得到了二维卷积或者角相关的计算。因此,我们可以认为,二维卷积实际上就是全连接或者矩阵乘法,但权重的一些部分是重复的,不是每个元素都可以自由变换。通过限制模型的取值范围,降低了模型的复杂度,从而减少存储元素的需求。

    image-20231102161019744

    7、原则#2–局部性

    • 第二个原则被称为"局部性"。局部性的概念是,当计算输出的元素 h[i][j] 时,我们不需要考虑所有的输入元素 i 和 j,而只需要关注附近的元素。具体来说,我们应该只考虑输入 x[i][j] 附近的元素,而不是无限远的元素。
    • 为了实现局部性,我们可以引入一个限制条件,即当 a 或 b 的绝对值大于某个值 Delta 时,将 vab 设置为 0。这意味着在输入 i 和 j 远离某个点,超出 Delta 范围时,不再考虑那些位置。因此,当进行求和时,只需考虑 a 在从 -Delta 到 Delta 的范围内的变化。
    • 举个例子,如果我们考虑 xij,那么只需要关注它附近距离不超过 Delta 的区域,这将产生输出 hij。这实际上意味着我们只关注局部区域,这就是局部性的概念。所以,简而言之,这就是卷积的核心思想。

    image-20231102161340538

    8、总结

    • 总结一下,对于全连接层应用平移不变性和局部性原则,我们可以得到卷积层。为什么我们说卷积是特殊的全连接层呢?因为它的处理方式允许我们将输入和输出重新表示为二维结构,并对权重进行一些重新排列。具体来说:
    • 首先,我们可以将前两个维度抛弃,将它们合并成一个二维结构,使得在其他维度上的元素都相同。
    • 其次,我们限制了 a 和 b,使它们的绝对值在 -Delta 到 Delta 之间,这将它们限制为一个很小的范围。
    • 这就是全连接层到卷积层的转变方式。这种变换允许我们更好地处理图像数据,利用平移不变性和局部性原则,减少了模型的复杂度和存储需求。

    在这里插入图片描述

    二、卷积层

    1、卷积层

    • 接下来讲一下卷积层;刚刚的是卷积这个操作子;来说一下在神经网络里面;卷积层是一个什么东西;

    image-20231102214656822

    2、二维交叉相关

    • 首先,我们刚刚介绍了一个称为"二维相关操作"的概念,通常也被称为"二维卷积"。现在,让我们具体了解这个操作是如何运行的。下面有一个动画,用来说明这个过程。比方说,我们有一个输入矩阵,它是一个 3x3 的矩阵,其中元素为 0 到 8。我们也有一个卷积核,通常称为 “w” 或 “kernel”,它是一个 2x2 的核。
    • 让我们看一下动画中每一步的操作。假设我们要计算第一个输出元素,也就是 h(0,0) ,它是如何计算的呢?首先,我们将核的一个窗口放在输入的左上角,然后将窗口内的元素与核内的元素相乘。接着,我们将窗口向右移动,再次进行相乘操作。这样,最终将四个乘积相加,得到输出元素 h(0,0) 的值,这里是 19。
    • 接下来,我们要计算第二个输出元素,也就是 h(0,1)。同样的核被用来进行计算,但输入向右移动了一个位置,因此窗口也相应地右移。这样,我们继续计算每个输出元素,依次向右移动核的窗口。
    • 在这个过程中,我们使用了同一个核窗口,但输入随着输出的右移而相应地改变。这意味着核和输入的相乘与位置无关,也就是之前提到的平移不变性。此外,我们只使用了一个 2x2 的窗口,而没有考虑整个输入,这体现了局部性的原则。
    • 这就是二维卷积的核心概念,通过不断在输入上滑动核窗口,我们可以计算出输出。这个过程被称为二维交叉相关,即核窗口在输入上进行滑动,并执行相应的计算。这一过程在图示中得到了清晰的演示,展示了具体的计算步骤。

    image-20231102215508635

    3、二维卷积层

    • 好的,让我们来深入了解二维卷积层是什么。从神经网络的角度来看,二维卷积层的输入是一个 h×w 的矩阵,h 表示高度,w 表示宽度。卷积核(kernel)是一个大小为 h×w 的矩阵,其中 k 表示卷积核的数量,h 表示卷积核的高度,w 表示卷积核的宽度。此外,还有一个偏差项(bias),它是一个标量值。
    • 二维卷积层的输出是一个 n×(h-k+1)×(w-w+1) 的矩阵。为什么输出的高度和宽度会减小呢?这是因为在卷积操作中,卷积核是从输入的左上角开始滑动的,当它移到输入的右边或下边时,部分输入不再被考虑在内,因此导致输出尺寸减小。这是为了方便计算,如果核移到边界之外,就无法完全处理。
    • 在计算输出时,我们使用了卷积核和偏差项,即 y = x ∗ w + b,这是刚刚我们讨论的二维交叉相关操作。卷积核和偏差项都是可以学习的参数。这些参数的值将在训练神经网络的过程中进行调整,以适应给定的任务。
    • 总之,二维卷积层在神经网络中扮演重要角色,用于从输入数据中提取特征。卷积核和偏差项是学习到的参数,通过它们,网络可以识别不同的特征,从而执行各种计算机视觉任务。

    image-20231102215554095

    4、例子

    • 这张图片展示了一个骆驼的头部图像,作为输入。我们可以看到不同的卷积核,这是卷积操作的一个示例。不同的卷积核会产生不同的效果。例如,如果卷积核中间有一个相对较大的值,而边缘有一圈较小的值,那么通过与输入的卷积操作(也就是二维相关操作),会产生边缘检测的效果。这将突出显示图像中的边缘部分,而使较平滑的区域变得一致。
    • 另一个示例是,如果卷积核的中心值为5,对角线部分设置如此,那么会产生图像的锐化效果。最后,还有一个示例是产生图像的模糊效果,就像图像被刀丝模糊一样。
    • 这说明神经网络可以学习不同的卷积核,以获得所需的效果。例如,如果要检测图像中的某些特征,可以通过学习边缘检测核来实现。如果需要图像的锐化效果,并且这对任务有帮助,网络可能会学习到适用于锐化的参数。
    • 这只是一个示例,说明了卷积操作的多样性和神经网络的学习能力。

    image-20231102215634355

    5、交叉相关vs卷积

    • 交叉相关和卷积的实际操作非常相似,它们的唯一区别在于符号的不同。在卷积操作中,滤波器(或内核)反转了水平和垂直方向,但这仅仅是一个符号上的区别。由于滤波器通常是对称的,因此在实际使用中这个区别并不重要。
    • 换句话说,当学习卷积核时,无论它们是正向还是反向,都可以达到相同的效果。例如,如果使用二维交叉相关学习了一组滤波器,那么使用二维卷积来学习时,可以得到相同的结果,只需将滤波器在水平和垂直方向上进行翻转。
    • 因此,在实际使用中,我们常常称之为卷积层,但实际上执行的操作是交叉相关。这只是为了方便书写和理解。在数学上,卷积核通常是反向的,但这并不会影响最终的结果。所以不要感到困惑,这是很常见的情况。

    image-20231102215703237

    6、—维和三维交叉相关

    • 另外一个重要的概念是二维输入。当我们处理的是一组二维图片时,输入数据可以是一维的,也可以是三维的。对于一维的情况,我们通常处理文本数据,而在深度学习中也有用卷积来处理文本的有效方法。不管是文本、语言,还是时序序列数据,都可以视为一维的输入。在一维情况下,卷积核是一维的,整体处理方式与二维或三维类似。
    • 对于三维的情况,典型的应用是视频数据或医学图像处理,如核磁共振图像。视频是一系列帧的集合,具有时间轴信息。医学图像也可以是三维的,因为它们可能是体积数据,例如3D扫描。此时,卷积核也会变成三维的。这样一来,我们就需要处理多一个维度的数据。
    • 总之,卷积在一维、二维和三维情况下都有应用,但在计算机视觉领域,主要使用的是二维卷积。所以通常我们会听到关于"1D"(一维)和"3D"(三维)卷积的讨论,但最常见的情况是针对二维图像的卷积操作。这些术语有助于指明卷积操作所处理的数据的维度。

    在这里插入图片描述

    7、总结

    • 总结一下,卷积层的主要作用是对输入数据和卷积核进行交叉相关运算,并加上偏移项来得到输出。卷积核和偏移项都是可以学习的参数。此外,卷积层还涉及一些超参数,例如卷积核的大小,这会影响局部性。较大的卷积核会涵盖更广的范围,而较小的卷积核则保持较小的局部范围。
    • 在对卷积层进行理解时,可以将其视为一种特殊的全连接层,但通过一些限制条件,例如将前两个维度保持相同大小,并使用小型的局部卷积核,从而确保卷积核的参数不会因输入的大小而过分膨胀。这是卷积层相对于全连接层的优势之一,因为它不会受到输入尺寸的限制。
    • 总的来说,卷积层在深度学习中扮演着重要的角色,能够有效处理图像、文本等多种类型的数据,同时能够保持模型的参数规模相对较小,是深度学习中不可或缺的组成部分。

    image-20231102215959574

    三、代码

    四、QA

    No.2 卷积层里的填充和步幅

    一、填充和步幅

    1、为什么需要填充?

    • 卷积层有两个控制输出大小的超参数,一个是填充(padding),另一个是步幅(stride)。首先,我们来看一下为什么需要填充。举个例子,假设给定一个 32x32 的输入图像,然后使用一个 5x5 大小的卷积核。如果使用一个 5x5 的卷积核,那么输出的尺寸会减小为 28x28。这就意味着,每次卷积操作后,输出都会变得更小,这个例子中每次减小了 4x4 的尺寸。如果连续进行七层卷积操作,输出的尺寸将变得非常小,最后可能只剩下一个很小的尺寸。
    • 如果希望输出的尺寸不要变得太小,特别是在使用较大的卷积核时,需要考虑填充的问题。当输入是 n_h x n_w(高 x 宽)时,输出的尺寸会减小到 n_h - k_h + 1 x n_w - k_w + 1,其中 k_h 和 k_w 是卷积核的高和宽。如果希望输出的尺寸与输入相同,或者不要减小得太快,可以通过添加适当的填充来实现。填充可以是在输入的周围添加一些额外的像素,使输入的尺寸变大,这样输出的尺寸也会更大。
    • 通过适当的填充,可以避免输出尺寸过小的问题,使得深度卷积网络的构建更加灵活,可以实现更多的层次。填充是卷积层中一个非常重要的超参数,可以根据任务的需要来选择适当的填充方式。填充的选择对于卷积神经网络的性能和效果具有重要影响。

    image-20231102224632948

    2、填充方法

    • 填充的思想很简单,就是在输入数据的周围增加额外的行和列,从而使输出数据的尺寸比原来更大。下面通过一个示例来说明。原始输入如下:

      原始输入:
      [ 1  2  3 ]
      [ 4  5  6 ]
      [ 7  8  9 ]
      
      • 1
      • 2
      • 3
      • 4

      现在在输入数据的上、下、左、右分别进行填充,填充的值为 0,如下所示:

      填充后的输入:
      [ 0  0  0  0  0 ]
      [ 0  1  2  3  0 ]
      [ 0  4  5  6  0 ]
      [ 0  7  8  9  0 ]
      [ 0  0  0  0  0 ]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 填充完成之后,再进行卷积操作。通过卷积操作滑动窗口,可以观察到以下效果:原来的输出是一个 2x2 的矩阵,而填充后的输入输出变为了一个 4x4 的矩阵。可以看到,输出比输入多了一行和一列,这就是填充的效果。填充在卷积操作中用于调整输出的尺寸,使其更大或更适应特定的任务需求。这种技术在卷积神经网络中被广泛使用。

    image-20231102225031039

    3、填充方程式

    • 一般情况下,我们会定义填充参数,通常记作 p_h 表示在高度方向(行)填充的行数,以及 p_w 表示在宽度方向(列)填充的列数。这会改变输出的形状。具体来说,填充后的输出形状可以通过以下公式来计算:

      新的输出高度(n_h)= 输入高度 n_h - k_h+ p_h+1
      新的输出宽度(n_w)= 输入宽度 n_w- k_w + p_w+1

      如果没有进行填充,即 p_h = p_w = 0,那么新的输出形状;

    • 通常,我们选择 p_h 和 p_w 的值等于卷积核的高度 kh 减去 1 和宽度 kw 减去 1,即 p_h = kh - 1 和 p_w = kw - 1。这是一个常见的选择,它的好处是可以确保将整个像素值带入卷积操作后,整个项仍然是零。这意味着输出形状不会发生变化,而将保持为 n_h 乘以 n_w。

    • 具体来说,如果填充高度 p_h 为奇数,填充就会分别在输入的顶部和底部各填充 p_h 除以 2 行,通常填充值为 0。如果卷积核的高度 kh 为偶数,填充有时候会稍有变化。在这种情况下,可以选择在上部填充多一行,而在下部填充少一行,或者反过来。但一般情况下,不会影响输出形状太多。

    • 总之,填充是卷积操作中常用的技术,用于控制输出形状,保持特定的图像维度,使其适应网络结构或任务需求。

    在这里插入图片描述

    4、为什么需要步幅?

    • 这个观点背后的思想是,假设输入的尺寸比较大,如从之前的 32x32 变成了 224x224。这通常在深度神经网络中使用,尤其是当我们需要处理较大的输入图像时。然而,224x224 仍然被认为是一个相对较小的图像尺寸。
    • 现在,假设我们使用 5x5 的卷积核,但希望最终的输出具有相对较小的尺寸,例如 4x4。如果我们尝试在网络中使用许多层来逐渐减小图像的尺寸,这将需要非常深的网络,例如 44 层或更多。这样的网络会导致计算复杂度急剧增加。

    在这里插入图片描述

    5、步幅的过程

    • 步幅的概念是指在卷积过程中,每次滑动窗口时,之前通常是按一列或一行的跨度往右或往下移动。但不服的概念允许我们控制每次滑动窗口时的跨度,可以选择跨度为两列或两行等其他值。
    • 举个具体的例子,假设我们选择在高度上的步幅(stride)为 3,宽度上的步幅为 2。下面来看看会发生什么。
    • 首先,假设原始输入是 3x3,并且padding为 2。那么第一个滑动窗口的窗口大小还是 2x2,但会有一些填充。接着,如果在宽度上的步幅不再是 1,而是 2,那么下一个滑动窗口不再是在前一个窗口的右侧,而是直接向右跳过两列。这会导致我们直接跳到一个新的位置。
    • 现在,如果在高度上的步幅为 3,那么下一个滑动窗口会直接向下跳过三行。这也会导致我们直接跳到一个新的位置。
    • 这个步幅的概念允许我们在滑动窗口时控制每次的跨度,而不再像之前一样按照一列或一行的跨度滑动。这可以改变输出的尺寸,使其不再是线性相关,而是指数相关。

    在这里插入图片描述

    6、步幅方程式

    • 让我们直接来计算一下,假设高度上的步幅为SH,宽度上的步幅为SW,那么输出的形状可以这样计算。首先,如果SH等于1,那么输出形状没有变化。如果SH等于2,输出形状可以近似认为是输入的一半。
    • 输出的高度可以用这个公式来计算:NH + (NH - 1) / SH,其中NH是输入的高度。这个公式考虑了填充,一般会选取和核大小KH减1一样的填充。如果输入的高度和宽度都可以被步幅整除,通常取2的步幅,那么输出的高度可以简化为NH / SH,宽度可以简化为NW / SW。这些计算都是基于向下取整的。
    • 一般情况下,可以选择合适的填充和步幅来使计算更加方便,不需要考虑太复杂的情况。这就是步幅的概念。

    image-20231102225449130

    7、总结

    • 总结一下,填充和步幅都是卷积层的超参数。之前已经讨论过卷积核的大小,现在我们来看填充和步幅。填充的概念是在输入的周围添加额外的行和列,通常用0来填充,以控制输出的大小至少不变或变大。这在处理较小的输入图像并且不想减小输出大小以构建深度模型时非常有用。
    • 步幅则用来控制每次滑动窗口时的行和列的步长,以使输出形状成倍减少。这对于处理大尺寸输入并通过步幅来减小计算量非常有效。
    • 综而言之,填充和步幅是用来调整卷积层操作的超参数,以适应不同的输入大小和计算需求。

    image-20231102225752761

    二、D2L代码注意点

    三、QA

    No.3 卷积层里的多输入和多输出通道

    一、多输入和多输出通道

    1、多个输入和输出通道

    • 卷积神经网络另外一个非常重要的一个超参数;叫做通道数;这个真的是大家通常会去仔细去设的一个超参数;输入和输出的通道

    在这里插入图片描述

    在这里插入图片描述

    2、多个输入通道样例

    • 通常情况下,我们使用彩色图片,这些彩色图片包含了RGB三个通道。然而,在之前的数据集中,例如Fashion MNIST,使用的是灰度图片,只包含了一个通道,即灰度通道。对于简单的图片,这是足够的,但对于复杂的彩色图片,情况就不同了。
    • 举个例子,我使用了一张彩色图片,它实际上由红色、绿色和蓝色三个通道组成。如果这张图片的大小是200x200像素,那么它的张量表示应该是200x200x3。在计算机视觉中,这是一个常见的彩色图片表示方式。所以,这不再是一个简单的矩阵了。

    image-20231102235814577

    3、多个输入通道会怎么办?

    • 让我们来详细探讨一下,如果输入具有多个通道会发生什么情况。这也涉及到如何处理输入不再是一个矩阵,而是一个三维张量的情况。为了更具体,我们举一个例子,假设输入有两个通道,我们称它们为通道0和通道1。
    • 当存在多个输入通道时,每个通道都将有自己独立的卷积核,这些卷积核具有各自独立的参数,因此它们的值可能不同。以通道0为例,我们对其应用专门为通道0设计的卷积核,执行卷积运算,这种卷积也可以看作相关操作,就像我们前面所讲的。同样,对通道1也是如此,通道1与自己的卷积核进行卷积操作,然后将它们的结果进行逐元素相加。最终,我们得到了一个输出通道,其值是高度乘以2,再对这些通道的结果进行逐元素相加,得到最终的输出。
    • 具体来看,我们可以观察一个数值,如56,它是如何计算得出的。在这个例子中,它是通过对通道0应用卷积核,然后加上通道1的卷积操作得到的。这个计算可以用一个公式来表示,假设输入x是一个三维张量,之前是n h乘以n w,现在多了一个c i(通道数量),其中c表示通道的意思,i表示输入。所以,x的维度变成了c i乘以n h乘以n w,卷积的结果也会相应地变成一个3D矩阵。
    • 而之前的卷积核是高度和宽度的k h乘以k w,现在的卷积核数量是等于输入通道数的c i,这个地方没有写,c i 乘以 k h乘以 k w,这里的c i 表示每个通道都有自己的卷积核。因此,输出结果是一个单通道,因为无论输入有多少通道,最终都会将它们的结果相加,所以输出是一个矩阵,将它们的相应位置的值相加起来。
    • 这就是多输入通道时的处理方式。

    在这里插入图片描述

    4、多个输入通道的公式大小

    image-20231103000238372

    5、多个输出通道思想

    • 进行多个输出通道的操作是什么样的呢?为什么要使用多个输出通道呢?原因在于,无论输入通道的数量如何,我们只会得到单个输出通道。举例来说,如果输入包含了RGB三个通道,仍然只会得到一个单独的输出通道,这显然是不够的。
    • 那么如何实现多个输出通道呢?对于每个输出通道,都会有自己的一个3D卷积核,而每个3D卷积核将生成一个对应的输出通道。然后,将这些输出通道叠加在一起,就得到了多输出通道的结果。
    • 具体来看,输入通道的数量不变,仍然是CI。唯一的变化是卷积核的数量多了一个CO,即China output。每个CO都对应一个3D卷积核,它将生成一个输出通道。每个输出通道将采用其对应的3D卷积核,然后每个输出通道的结果将被叠加起来,最终形成输出结果。
    • 因此,可以看出,输出的第i个通道实际上是通过将所有输入通道与其对应的3D核矩阵执行多输入通道卷积,然后对所有i执行一次叠加操作得到的。这样,就可以获得多输出通道的结果。
    • 需要强调的是,输入通道和输出通道之间实际上是相对独立的,它们的数量和设置是可以根据需求来进行调整的。

    image-20231103000344895

    6、多个输入和输出通道例子

    • 之前我们已经讨论了卷积层的工作原理,每个输出通道可以看作是在识别某种特定的模式。举例来说,如果我们有一个6个输出通道的卷积层,每个通道都在识别不同的模式。例如,一个通道可能在识别边缘,另一个通道可能在识别锐化效果,还有一个可能在识别模糊效果。每个通道通过学习不同的卷积核参数来实现这些功能。
    • 多输入通道是什么意思呢?它意味着我们将多个输入通道提供给下一层。下一层将每个通道中的这些模式识别出来,然后将它们组合起来,相加在一起。这个组合的过程可以根据权重来调整,某些模式可能比其他模式更重要。最终,我们得到了一个组合的模式识别结果。
    • 从整个深度卷积神经网络的角度来看,底层的卷积层通常会识别一些局部的特征,比如不同的边缘、纹理等。随着网络层次的上升,这些局部特征逐渐被组合在一起,最终在更高层次的卷积层中组合成更复杂的模式。例如,底层的卷积层可能会识别猫的一些局部特征,如胡须、耳朵等,而更高层的卷积层将这些特征组合在一起,最终在最顶层的卷积层中识别出整只猫的模式。
    • 这就是卷积神经网络在处理多输入和输出通道时的工作原理,不同的通道和层次逐渐组合和提取特征,实现了对复杂模式的识别。

    image-20231103000529189

    7、1×1卷积层

    • 让我们详细探讨一下1x1卷积层,这是一个非常特殊的卷积层。1x1的卷积层的作用是什么呢?它的卷积核高度和宽度都等于1,这意味着它不关心空间信息,因为它只查看一个像素,而不会考虑像素周围的空间。它的作用在于融合不同通道的信息。
    • 举个例子,如果有一个输入通道数为3,高度和宽度都等于3的输入,以及输出通道数为2,1x1卷积的卷积核如下所示:对于输出通道0,因为它有3个输入通道,所以有3个值。对于输出通道1,同样也有3个值。每个值是由对应输入通道中的像素进行加权和获得的。
    • 这个卷积层的等效方式是将整个输入拉伸成一个向量,然后使用全连接层的方式进行通道之间的融合。具体来说,将输入的高度和宽度拉伸成一个长为nh x nw的向量,然后将通道数变换成一个矩阵。卷积核也可以看作是一个矩阵。因此,1x1卷积层可以等价地表示为一个全连接层。
    • 关于这个1x1卷积层的有趣之处在于,它不考虑空间信息,只关心在特征维度(通道维度)上的信息融合。最近有一篇论文讨论了使用MLP(多层感知器)来打败卷积神经网络,而实际上,这个论文中使用了大量的1x1卷积层,这些层实际上可以看作是全连接层,但也可以看作是卷积层的一种特殊情况。

    image-20231103000746531

    8、二维卷积层

    • 好的,让我们仔细看一下。最后,我想详细解释一下二维卷积层的构造。首先,我们考虑输入的维度,如果有多个输入通道,假设为CI,高度和宽度分别为n_h和n_w,那么输出的通道数将等于输出通道数CO乘以输入通道数CI,再乘以输出高度KH和输出宽度KW,这形成了一个4D张量。每个输出通道都有一个独立的偏差项,偏差的数量等于CO。然后,输出的高度mH和输出宽度mW会根据核的高度KH和核的宽度KW以及填充和步幅来计算,这部分我们之前也讨论过。
    • 接下来,我们要考虑计算复杂度,这是指卷积层进行计算所需的操作数量。计算复杂度的计算基于多个因素,通道数、输入通道数、输出通道数、输入高度、输入宽度以及输出高度和输出宽度。通常情况下,需要对每个输出通道对所有输入通道进行卷积操作,然后对每个输出通道中的每个元素进行累加。这涉及到多个元素的相乘。假设通道数是100,输入通道数是5,输出通道数是64,输出高度和宽度是64,这将需要10亿次浮点运算(Flops),这是相当大的数量。
    • 如果我们有10层这样的卷积层,每层有100万个样本(通常在计算机视觉任务中很常见),并且使用CPU进行计算,那么每层前向传播需要花费大约18小时。如果使用GPU,一层前向传播需要花费大约14分钟,然后再进行反向传播,总共需要大约28分钟。如果要处理100次数据,那就需要50个小时来完成一次训练。所以,卷积层的计算量并不小,但它的模型大小相对来说比较小,因为只需要存储一个100x100x5x5的4D张量,这使得模型的存储要求很低。

    image-20231103000816863

    9、总结

    • 最后来做一个总结。总结一下,输出的通道数是卷积层的超参数,而输入通道数则是前一层的超参数,不是这一层的超参数。每个输入通道都有独立的二维卷积核,而所有输入通道的结果会相加,得到一个输出通道。此外,每个输出通道也有独立的三维卷积核。因此,最终的卷积核是一个四维张量。这就是多输入和多输出通道的卷积层的一个简要介绍。

    image-20231103000857353

    二、D2L代码注意点

    三、QA

    No.4 池化层

    一、池化层

    1、为什么需要池化层?

    • 好的,让我们来讨论一下池化层。之前有同学提问,关于卷积层如何处理位置信息的问题。实际上,卷积层对位置非常敏感,这在垂直边缘检测的例子中可以看出。我将重复这个例子。
    • 假设我们有两列像素,这里有一个边缘。如果我们使用一个1x2的卷积核,一个边是1,另一个边是-1,那么在输出的第二列,所有值都将是1,这是因为边缘被检测到了。但在第一列,所有值都将是0。这表明卷积层对于物体位置非常敏感,即使一个像素的偏移也会导致不同的输出。
    • 然而,这可能不是一个好的特性,因为现实世界中的物体经常会发生微小的变化,比如相机的颤抖、手部移动或物体的轻微位移。这会导致边缘的位置发生变化,从而导致卷积层的输出发生很大的变化。这种敏感性并不总是理想的,因为光照、物体位置、比例和外观等因素都可能导致图像发生变化。
    • 因此,我们需要一些不变性,以使卷积层的输出对这些微小的变化不敏感。这就是为什么我们需要池化层,也称为池化层。下面我们将详细讨论池化层是如何工作的。

    在这里插入图片描述

    2、二维最大池化工作原理

    • 首先,我们来讨论一下二维最大池化层的工作原理。它的工作方式与之前的卷积操作有一些相似之处,都涉及到一个窗口在输入上滑动。让我们以一个示例来说明,这里有一个3x3的窗口,不断滑动在输入上。最后的输出与之前的卷积层输出类似,但有一些不同。在这里,我们没有核与输入进行卷积和相加的过程,而是将窗口内的最大值提取出来,这就是为什么它称为"最大"池化层。

    • 举个例子,假设我们有一个2x2的最大池化窗口。每次我们在输入上滑动这个2x2的窗口,然后窗口内的最大值就会成为输出的一部分。让我们来看一个例子,当窗口滑动到这个位置时,窗口内的最大值是4,所以输出值就是4。同样地,如果窗口滑到这个位置,输出值就是5。继续滑动窗口,下一个窗口的最大值是7,最后一个窗口的最大值是8。

    • 因此,最大池化层的工作原理可以简单地概括为:通过滑动窗口计算输出,但与卷积不同,它不进行加权相加,而是将窗口内的最大值提取出来作为输出。

    image-20231103091252348

    3、二位最大池化最大值

    • 让我们来看一下最大池化层是否能够解决之前提到的问题。回顾一下,我们的目标是进行垂直边缘检测。在左侧是输入图像,中间是卷积层的输出。如果我们在卷积层的输出上再应用一个2x2的最大池化操作,那么可以看到,最终的输出值来自于哪里?它来自于对这个20号窗口的操作,这里有一个额外的数值。
    • 但这里的问题是,这个额外的数值应该是哪里来的?实际上,在这个地方是没有这个数值的,这里应该都是0。这个地方来自于输入,也就是全零,我在这里犯了一个错误(第三个图第三列是全0)。因此,2x2的最大池化层可以容忍输入发生轻微的偏移。如果我们稍微向左偏移一点,这个位置仍然是0。
    • 同样,如果我们稍微向右偏移一点,这个位置也是0。最大池化层的作用是对输入进行一个小范围的模糊,使得在输出值附近的小窗口中,所有的值都可以出现。这就是最大池化层的效果。

    在这里插入图片描述

    4、填充,步幅和多个通道

    • 池化层与卷积层有一些相似之处,比如填充和步幅(stride)等超参数。填充(Padding)是指在输入周围添加额外的行和列,通常用填充值为1表示上下左右各添加一行或一列。当然,也可以使用不同的填充值,比如上下各添加2行或左右各添加2列。步幅(Stride)是指每次在输入上进行滑动操作时的步幅大小,例如步幅等于2表示每次向上下左右滑动2行或2列。
    • 与卷积层不同的是,池化层没有需要学习的参数。它仅执行最大值或平均值计算,不涉及参数的学习。因此,池化层只是执行某种操作,而不会改变网络的参数。
    • 此外,池化层在处理多输入通道时,与卷积层不同。对于每个输入通道,它都会执行独立的池化操作,而不会对多个通道进行融合。因此,池化层的输出通道数等于输入通道数,不会进行多通道融合。多通道的融合操作通常交给卷积层来处理。
    • 总之,池化层在某些方面与卷积层相似,但也存在一些不同之处。

    在这里插入图片描述

    5、平均池化层

    • 本段讨论的是最大池化层(Max Pooling),当然也可以使用平均池化层。最大池化层的操作是将窗口中的最大值输出,而平均池化层则将窗口内的值取平均。最大池化层的输出是窗口内的最强信号,通常用于检测特定特征或事件。
    • 以一张图为例,在经过卷积操作后,最大池化层将窗口内的最亮点(信号最强)突出显示,以突显重要信息。而平均池化层则平均窗口内的信号强度,使图像更柔和,减少抖动,但信号强度较弱。这两种池化方式都是非常常用的操作。

    在这里插入图片描述

    6、总结

    • 池化层有两种常见的操作方式:最大池化层和平均值池化层。
    • 它的主要作用是减轻卷积层对位置的敏感性。通常,池化层位于卷积层之后。
    • 与卷积层不同的是,池化层有三个超参数,即窗口大小、填充(padding)和步长(stride)。需要强调的是,池化层独立作用于每个通道,而不引入输出通道数这个超参数。因此,输入通道数必须等于输出通道数。与此不同的是,池化层没有可学习的参数,因此不会增加模型的大小。这就是池化层的定义。

    image-20231103091612853

    二、D2L代码注意点

    三、QA

    No.5 经典卷积神经网络LeNet

    一、LeNet

    1、手写的数字识别

    在这里插入图片描述

    2、MNIST

    • 当然,这个事情实际上一直被忽视。LeNet这个模型在很长一段时间内并没有引起广泛的注意,因为深度神经网络在那个时候并不流行。事实上,LeNet的知名度在当时相对较低。然而,值得一提的是,那个时候最知名的数据集之一就是MNIST数据集。如果你正在学习机器学习,很有可能你的第一个数据集就是MNIST。这个数据集也是LeNet网络最早提出时附带的一个数据集。

      • MNIST数据集包含5万个训练样本和一万个测试样本,每个样本都是28x28像素的图像。这是一个相对简单的数据集,因为它已经对图像进行了预处理,使得数字位于图像的正中央,而且所有图像都是灰度图像,基本上是黑白的。这个数据集一共有10个类别,对应数字0到9。在当时,这已经被认为是一个相当大的数据集,因为在80年代末期,计算机内存通常只有几兆字节。
    • 然而,正是LeNet在MNIST数据集上取得了出色的表现,这使得深度神经网络引起了人们的注意。当时,人们认为深度神经网络在大数据上表现出色,比传统的机器学习算法如支持向量机(SVM)等要好。这可以被视为当时的“大数据”,对于神经网络来说,这是一个里程碑。希望这能帮助您更好地理解LeNet和MNIST数据集的历史重要性。

    image-20231103105245866

    3、过程

    • 当年的demo;是把信放进去;就慢慢给你扫;然后跟你说这个是1是什么什么什么的;就是把信放进去;他就扫过去;然后给你出值;这个就是当年他们做的demo;

    在这里插入图片描述

    4、LeNet图

    • 来讲一下LeNet是什么概念。实际上,LeNet是一个相对简单的神经网络,我将在接下来的代码中实际演示它。下面是一个简单的图示,将帮助大家理解。
    • 这张图显示了网络的架构。网络的输入是一个大小为32x32的图像,经过一些卷积和池化操作后,输出结果是一组称为“特征图(feature map)”的特征。首先,输入通过一个5x5的卷积层,输出通道数为6,得到一个28x28的特征图。接着,这个特征图经过一个2x2的池化层,将其尺寸减半至14x14,通道数保持不变。然后,再经过一个卷积层,同样是5x5的卷积核,但输出通道数增加到16,得到一个10x10的特征图。之后再通过一个2x2的池化层,将其尺寸减半至5x5,通道数保持不变。最后,这个5x5的特征图被拉平并输入到一个全连接层,第一个全连接层的输出尺寸是120,接着是一个输出尺寸为64的全连接层。最后,通过一个输出层(在代码中被称为GOS),得到10个类别的输出概率。这就是LeNet的基本架构。
    • 在接下来的代码中,我将详细讲解这个网络的具体实现。请注意,GOS层在现代的神经网络中已经不再使用,因此可以将其视为一个输出层,通常使用Softmax来获得类别概率。

    image-20231103105339524

    5、总结

    • LeNet是早期的神经网络,奠定了神经网络在图像处理方面的成功基础。它采用了卷积层用于学习图像的空间信息,池化层用于减少对图像位置的敏感度,最后使用全连接层将图像映射到不同类别。在该模型中,我们得到了10个类别。这个基本思想在未来的很多年里一直非常流行,虽然现在情况已经发生了很大的改变,但它确实对后续的深度学习模型,如AlexNet,产生了深远的影响。

    image-20231103105406492

    二、D2L代码注意点

    三、QA

  • 相关阅读:
    STM32第一课:STM硬件实物图+功能简介
    java基于微信小程序的投票系统 uniapp 小程序
    低代码助力疫情防控:综合管理系统模板
    电子学:第012课——实验 11:光和声
    如何用redis做一个可靠的消息队列
    javaScript:DOM中的CSS操作
    C++二级题目5
    leetcode刷题日记:125. Valid Palindrome(验证回文串)和136. Single Number(只出现一次的数字)
    如何在微信上制作自己的小程序卖东西
    手把手教你如何Vue项目打包dist文件并Tomcat发布【超级详细】
  • 原文地址:https://blog.csdn.net/weixin_51429773/article/details/134086634