卷积神经网络

目录

1、卷积运算

2、使用卷积运算实现垂直边缘检测

3、区分正边、负边

4、计算输出矩阵大小

5、边缘填充方法

6、卷积步长

7、三维卷积

8、单层卷积网络

9、卷积层的各种标记

10、简单卷积网络

11、池化层

12、卷 积 神 经 网 络 示 例


1、卷积运算

  • 使用灰度图像进行卷积(6*6*1,不是RGB三通道,所以为1)
  • 过滤器(卷积核,3*3)

  •  tensorflow 下,使用函数 tf.conv2d实现卷积运算,在Keras 这个框架,在这个框架下用 Conv2D 实现卷积运算

2、使用卷积运算实现垂直边缘检测

  •  如果把最右边的矩阵当成图像,它是这个样子。在中间有段亮一点的区域,对应检查到
    这个 6×6 图像中间的垂直边缘
  • 在这个例子中,在输出图像中间的亮处,表示在图像中间有一个特别明显的垂直边缘。从垂直边缘检测中可以得到的启发是,因为我们使用 3×3 的矩阵(过滤器),所以垂直边缘是一个 3×3 的区域,左边是明亮的像素,中间的并不需要考虑,右边是深色像素
  • 在这个 6×6 图像的中间部分,明亮的像素在左边,深色的像素在右边,就被视为一个垂直边缘,卷积运算提供了一个方便的方法来发现图像中的垂直边缘

3、区分正边、负边

  •  这里的 30(右边矩阵中绿色方框标记元素)代表了左边这块 3×3 的区域
    (左边矩阵绿色方框标记部分),这块区域确实是上边比较亮,而下边比较暗的,所以它在
    这里发现了一条正边缘。而这里的 -30 (右边矩阵中紫色方框标记元素)又代表了左边另一
    块区域(左边矩阵紫色方框标记部分),这块区域确实是底部比较亮,而上边则比较暗,所
    以在这里它是一条负边

4、计算输出矩阵大小

  • 如果有一个𝑛 × 𝑛的图像,用𝑓 × 𝑓的过滤 器做卷积,那么输出的维度就是(𝑛 − 𝑓 + 1) × (𝑛 − 𝑓 + 1),所以前面的例子中,矩阵的输出大小为6 −3 +1 = 4,因此得到了一个 4×4 的输出
  • 第一个缺点: 是每次做卷积操作,你的图像就会缩小,从 6×6 缩 小到 4×4 ,你可能做了几次之后,你的图像就会变得很小了,可能会缩小到只有 1×1 的大小。可不想让你的图像在每次识别边缘或其他特征时都缩小
  • 第二个缺点是: 如果你注意角落边缘的像素,这个像素点(绿色阴影标记)只被一个输
    出所触碰或者使用,因为它位于这个 3×3 的区域的一角。但如果是在中间的像素点,比如这
    个(红色方框标记),就会有许多 3×3 的区域与之重叠。所以那些在角落或者边缘区域的像
    素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息
  • 解决措施:边缘填充

    •  可以沿着图像边缘再填充一层像素。如果你这样操作了,那么 6×6 的图像就被你填充成了一个 8×8 的图像。如果你用 3×3 的图像对这个 8×8 的图像卷积,你得到的输出就不是 4×4 的,而是 6×6的图像,你就得到了一个尺寸和原始图像 6×6 的图像
    • 填充一个像素点的话,p = 1,输出也就变成了(𝑛 + 2𝑝 −𝑓 + 1) × (𝑛 + 2𝑝 − 𝑓 + 1),所以就变成了(6 + 2 × 1 − 3 + 1) × (6 + 2 × 1 − 3 + 1) = 6 ×6,和输入的图像一样大
    • 注意:不使用卷积核进行卷积,单纯padding之后的矩阵输出计算公式是对于输入矩阵x的形状为(batch_size, height, width, channels),进行零填充时,填充宽度为pad,则填充之后的矩阵大小为(batch_size, height + 2*pad, width + 2*pad, channels)

5、边缘填充方法

  • Valid 卷积意味着不填充,这样的话,如果你有一个𝑛 × 𝑛的图像,用一个 𝑓 × 𝑓 的过滤器 卷积,它将会给你一个(𝑛 − 𝑓 + 1) × (𝑛 − 𝑓 + 1) 维的输出。类似于前面展 示的例子,有一个 6×6 的图像,通过一个 3×3 的过滤器,得到一个 4×4 的输出
  • Same 卷积,根据这个公式𝑛− 𝑓+1,当你填充𝑝个像素点,𝑛就变成了𝑛+2𝑝,最后公式变为𝑛 + 2𝑝 − 𝑓 + 1。因此如果你有一个𝑛 ×𝑛的图像,用𝑝个像素填充边缘,输出的大小就是这样的(𝑛 + 2𝑝 − 𝑓+ 1) × (𝑛+2𝑝−𝑓+ 1)。如果你想让𝑛+2𝑝− 𝑓 + 1=𝑛的话,使得输出和输入大小相等,如果你用这个等式求解𝑝,那么𝑝= (𝑓−1)/2。所以当𝑓是一个奇数的时候,只要选择相应的填充尺寸,你就能确保得到和输入相同尺寸的输出。这也是为什么前面的例子,当过滤器是 3×3 时,和上一张幻灯片的例子一样,使得输出尺寸等于输入尺寸,所需要的填充是(3-1)/2,也就是 1 个像素
  • (注意) 计算机视觉中, 𝑓 通常是奇数,甚至可能都是这样。很少看到一个偶数的过 滤器在计算机视觉里使用

6、卷积步长

  • 用一个𝑓 × 𝑓的过滤器卷积一个𝑛 × 𝑛的图像, padding 为𝑝,步幅为𝑠,在这个例子中𝑠 = 2,会得到一个输出,因为现在不是一次移动一个步子,而是一次移动𝑠个步子,输出于是变为
    (𝑛+2𝑝−𝑓)/𝑠 + 1 × (𝑛+2𝑝−𝑓)/𝑠 + 1。这个例子里,𝑛 = 7,𝑝 = 0,𝑓 = 3,𝑠 = 2, (7+0−3
    )2 + 1 = 3,即 3×3 的输出
     
  • 注意:如果商不是一个整数怎么办?在这种情况下,我们向下取整。⌊ ⌋这是向下取整的符号,这也叫做对𝑧进行地板除(floor),这意味着𝑧向下取整到最近的整数。这个原则实现的方式是,你只在蓝框完全包括在图像或填充完的图像内部时,才对它进行运算。如果有任意一个蓝框移动到了外面,那你就不要进行相乘操作,这是一个惯例。你的 3×3 的过滤器必须完全处于图像中或者填充之后的图像区域内才输出相应结果,这就是惯例。因此正确计算输出维度的方法是向下取整,以免(𝑛+2𝑝−𝑓)/𝑠 不是整数

7、三维卷积

  • 给这些起个名字(原图像),这里的第一个 6 代表图像高度,第二个 6 代表宽度,这个 3 代表通道的数目。同样你的过滤器也有高,宽和通道数,并且图像的通道数必须和过滤器 的通道数匹配,所以这两个数(紫色方框标记的两个数)必须相等。下个幻灯片里,我们就会知道这个卷积操作是如何进行的了,这个的输出会是一个 4×4 的图像,注意是 4×4×1,最 后一个数不是 3 了

  • 为了计算这个卷积操作的输出,你要做的就是把这个 3×3×3 的过滤器先放到最左上角
    的位置,这个 3×3×3 的过滤器有 27 个数, 27 个参数就是 3 的立方。依次取这 27 个数,然
    后乘以相应的红绿蓝通道中的数字。先取红色通道的前 9 个数字,然后是绿色通道,然后再
    是蓝色通道,乘以左边黄色立方体覆盖的对应的 27 个数,然后把这些数都加起来,就得到
    了输出的第一个数字。 如果要计算下一个输出,你把这个立方体滑动一个单位,再与这 27 个数相乘,把它们 都加起来,就得到了下一个输出,以此类推

  • 或者如果你不关心垂直边界在哪个颜色通道里,那么你可以用一个这样的过滤器

  • 问题:对建立卷积神经网络至关重要。就是,如果我们不仅仅想要检测垂直边缘怎么办?如果我们同时检测垂直边缘和水平边缘,还有 45°倾斜的边缘,还有 70°倾斜的边缘怎么做?换句话说,如果你想同时用多个过滤器怎么办?

  • 所以和第一个过滤器卷积,可以得到第一个 4×4 的输出,然后卷积第二个过滤器,得到
    一个不同的 4×4 的输出。我们做完卷积,然后把这两个 4×4 的输出,取第一个把它放到前
    面,然后取第二个过滤器输出,我把它画在这,放到后面。所以把这两个输出堆叠在一起,
    这样你就都得到了一个 4×4×2 的输出立方体,你可以把这个立方体当成,重新画在这,就是
    一个这样的盒子,所以这就是一个 4×4×2 的输出立方体。它用 6×6×3 的图像,然后卷积上这
    两个不同的 3×3 的过滤器,得到两个 4×4 的输出,它们堆叠在一起,形成一个 4×4×2 的立方
    体,这里的 2 的来源于我们用了两个不同的过滤器
  • 如果你有一个𝑛 × 𝑛 × 𝑛𝑐(通道数)的输入图像,在这个例子中就 是 6×6×3,这里的𝑛𝑐就是通道数目,然后卷积上一个𝑓 × 𝑓 × 𝑛𝑐,这个例子中是 3×3×3,按照 惯例,这个(前一个𝑛𝑐)和这个(后一个𝑛𝑐)必须数值相同。然后你就得到了𝑛 − 𝑓 + 1× 𝑛 − 𝑓 + 1× 𝑛𝑐 ′,这里𝑛𝑐 ′其实就是下一层的通道数,它就是你用的过滤器的个数,在我们的例子中,那就是4×4×2。我写下这个假设时,用的步幅为 1,并且没有 padding。如果你用了不同的步幅或者 padding,那么这个𝑛 − 𝑓 + 1数值会变化,正如前面的视频演示的那样

8、单层卷积网络

  • 最终各自形成一个卷积神经网络层,然后增加偏差,它是一个实数,通过 Python 的广
    播机制给这 16 个元素都加上同一偏差。然后应用非线性函数,为了说明,它是一个非线性
    激活函数 ReLU ,输出结果是一个 4×4 矩阵
  • 对于第二个 4×4 矩阵,我们加上不同的偏差,它也是一个实数, 16 个数字都加上同一
    个实数,然后应用非线性函数,也就是一个非线性激活函数 ReLU ,最终得到另一个 4×4
    阵。然后重复我们之前的步骤,把这两个矩阵堆叠起来,最终得到一个 4×4×2 的矩阵。我们
    通过计算,从 6×6×3 的输入推导出一个 4×4×2 矩阵,它是卷积神经网络的一层,把它映射到
    标准神经网络中四个卷积层中的某一层或者一个非卷积神经网络中
  • 注意前向传播中一个操作就是 𝑧 [1] = 𝑊 [1] 𝑎 [0] + 𝑏 [1] ,其中 𝑎 [0] = 𝑥 ,执行非线性函数得
    𝑎 [1] ,即 𝑎 [1] = 𝑔(𝑧 [1] ) 。这里的输入是 𝑎 [0] ,也就是 𝑥 这些过滤器用变量𝑊[1]表示 。在卷
    积过程中,我们对这 27 个数进行操作,其实是 27×2 ,因为我们用了两个过滤器,我们取这
    些数做乘法。实际执行了一个线性函数,得到一个 4×4 的矩阵。卷积操作的输出结果是一个
    4×4 的矩阵,它的作用类似于 𝑊 [1] 𝑎 [0],也就是这两个 4×4 矩阵的输出结果,然后加上偏差

  • (图中蓝色边框标记的部分)就是应用激活函数 ReLU 之前的值,它的作用类
    似于 𝑧 [1] ,最后应用非线性函数,得到的这个 4×4×2 矩阵,成为神经网络的下一层,也就是
    激活层。是𝑎 [0]到𝑎 [1]的演变过程,首先执行线性函数,然后所有元素相乘做卷积,具体做法
    是运用线性函数再加上偏差,然后应用激活函数 ReLU 。这样就通过神经网络的一层把一个
    6×6×3 的维度 𝑎 [0] 演化为一个 4×4×2 维度的 𝑎 [1] ,这就是卷积神经网络的一层
  • 10 个过滤器,而不是 2 个,神经网络的 一层是 3×3×3 ,那么,这一层有多少个参数呢?我们来计算一下,每一层都是一个 3×3×3 的 矩阵,因此每个过滤器有 27 个参数,也就是 27 个数。然后加上一个偏差,用参数 𝑏 表示, 现在参数增加到 28 个。上一页幻灯片里我画了 2 个过滤器,而现在我们有 10 个过滤器,加在一起是 28×10 ,也就是 280 个参数( 请注意一点,不论输入图片有多大,1000×1000 也好,5000×5000 也好,参数始终都是 280 个。因为参数w和b是使用过滤器的形式表示的,过滤器不改变,也即参数的个数不会发生改变

9、卷积层的各种标记

  •  用𝑓 [𝑙]表示过滤器大小,我们说过过滤器大小为𝑓 ×𝑓,上标[𝑙]表示𝑙层中过滤器大小为𝑓 × 𝑓。通常情况下,上标[𝑙]用来标记𝑙层。用𝑝 [𝑙]来标记padding的数量,padding 数量也可指定为一个 valid 卷积,即无 padding。或是 same 卷积,即选定 padding,如此一来,输出和输入图片的高度和宽度就相同了。用𝑠[𝑙]标记步幅
  • 这一层的输入会是某个维度的数据,表示为𝑛 × 𝑛 × 𝑛𝑐,𝑛𝑐某层上的颜色通道数。增加上标[𝑙 − 1],即𝑛 [𝑙−1] × 𝑛[𝑙−1] × 𝑛𝑐[𝑙−1],因为它是上一层的激活值。那么在第𝑙层,图片大小为𝑛𝐻
    [𝑙−1] × 𝑛 𝑊 [𝑙−1] × 𝑛 𝑐 [𝑙−1], 𝑙 层的 输入就是上一层的输出,因此上标要用[𝑙 − 1] 。神经网络这一层中会有输出,它本身会输出图像。其大小为𝑛 𝐻 [𝑙] × 𝑛𝑊 [𝑙] × 𝑛𝑐 [𝑙],这就是输出图像的大小(H是图片的高度,W是图片的宽度)

  • 确定通道数:一 个 6×6×3 的图片需要一个 3×3×3 的过滤器,因此过滤器中通道的数量必须与输入中通道的数量一致。因此,输出通道数量就是输入通道数量,所以过滤器维度等于𝑓 [𝑙] × 𝑓 [𝑙] × 𝑛𝑐[𝑙−1]

  • 应用偏差和非线性函数之后,这一层的输出等于它的激活值 𝑎 [𝑙] ,也就是这个维度(输出维度)。𝑎 [𝑙] 是一个三维体,即 𝑛 𝐻[𝑙] × 𝑛 𝑊[𝑙] × 𝑛 𝑐[𝑙]。当你执行批量梯度下降或小批量梯度下降
    时,如果有 𝑚 个例子,就是有 𝑚 个激活值的集合,那么输出 𝐴 [𝑙] = 𝑚 × 𝑛 𝐻[𝑙] × 𝑛 𝑊 [𝑙] × 𝑛 𝑐[𝑙]。如果 采用批量梯度下降,变量的排列顺序首先是索引和训练示例,然后是其它三个变量
  • 确定权重参数W:过滤器的维度已知,为𝑓 [𝑙] ×𝑓[𝑙] ×𝑛𝑐[𝑙−1],这只是一个过滤器的维度,有多少个过滤器,这(𝑛𝑐[𝑙])是过滤器的数量,权重也就是所有过滤器的集合再乘以过滤器的总数量,即𝑓 [𝑙] × 𝑓 [𝑙]×𝑛𝑐[𝑙−1] × 𝑛𝑐[𝑙],损失数量L就是𝑙层中过滤器的个数

10、简单卷积网络

11、池化层

  • 池化层是卷积神经网络(CNN)中常用的一种层,它的作用是对输入的特征图进行降采样,减少特征图的空间维度,同时保留重要的特征信息。
  • 池化层通常有两种类型:最大池化(Max Pooling)和平均池化(Average Pooling)。
  • 最大池化层会在输入的每个局部区域内选择最大的数值作为输出,从而提取出局部区域的最显著特征。这有助于提取出图像中的纹理、边缘等重要特征。
  • 平均池化层则是计算输入的每个局部区域内数值的平均值作为输出,可以减少特征图的维度,并且可以一定程度上保留图像的整体特征。
  • 池化的作用: 1. 降低特征图的空间维度:通过保留主要特征并去除冗余信息,减少计算量,降低模型复杂度。 2. 提取局部特征:通过选择最大值或平均值,池化层能够提取出图像的纹理、边缘等局部特征。 3. 改善平移不变性:池化层对图像的平移具有一定的不变性,即无论图像平移多少,池化层的输出都不会改变。 通过在卷积神经网络中添加池化层,可以有效地减少参数数量、加快计算速度,并且提取出重要的特征,从而提高模型的性能和泛化能力。

  •  以上就是一个二维输入的最大池化的演示,如果输入是三维的,那么输出也是三维的。
    例如,输入是 5×5×2 ,那么输出是 3×3×2 。计算最大池化的方法就是分别对每个通道执行刚
    刚的计算过程。如上图所示,第一个通道依然保持不变。对于第二个通道,我刚才画在下面
    的,在这个层做同样的计算,得到第二个通道的输出。一般来说,如果输入是 5×5×
    𝑛 𝑐 ,输出 就是 3×3× 𝑛 𝑐 𝑛 𝑐 个通道中每个通道都单独执行最大池化计算,以上就是最大池化算法

12、卷 积 神 经 网 络 示 例

 

  •  why(使用卷积):
  • 1. 局部感知:卷积能够通过在输入数据中提取局部特征来实现局部感知。这意味着它能够关注输入数据中的特定区域,而不是整个数据集。这对于处理具有局部特征的数据非常有用,例如图像和文本数据
  • 2. 参数共享:卷积神经网络通过共享权重来减少参数量,从而降低了模型的复杂性。通过共享权重,卷积层只需要学习一组权重,而不是为每个输入位置学习一个独立的权重。这一特性使得卷积神经网络更加高效,可以处理更大规模的数据集
  • 3. 平移不变性:卷积在处理平移不变性的数据时非常有效。平移不变性指的是输入数据中的特征在平移时保持不变。例如,对于图像分类任务,物体在图像中的位置不影响我们对物体的分类判断。卷积能够通过在整个输入数据上滑动卷积核来捕捉这种平移不变性
  • 4. 降维和提取特征:通过卷积层堆叠,可以实现对输入数据的降维和提取更高层次的特征。每个卷积层都可以提取输入数据的不同特征,然后将这些特征传递给下一层进行进一步处理。这种层级结构的堆叠可以逐渐提取更加抽象和高级的特征
  • 5. 处理大规模数据:卷积神经网络能够有效地处理大规模数据。通过并行计算和权重共享等技术,卷积神经网络可以在大规模数据集上进行高效的训练和推断。这使得卷积神经网络成为处理图像、视频、文本等大规模数据的理想选择

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q渡劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值