4.1卷积神经网络

简介: 这篇文章详细介绍了卷积神经网络(CNN)的基础模块,包括卷积计算、填充(padding)、步幅(stride)、感受野(Receptive Field)、多输入/输出通道和批量操作的概念,以及如何在飞桨(PaddlePaddle)框架中使用卷积API。

4.1卷积神经网络

百度AI Studio课程_学习成就梦想,AI遇见未来_AI课程 - 飞桨AI Studio星河社区-人工智能学习与实训社区 (baidu.com)

卷积神经网络是目前计算机视觉中使用最普遍的模型结构。本章节主要向读者介绍卷积神经网络的一些基础模块,包括:

  • 卷积(Convolution)
  • 池化(Pooling)
  • ReLU激活函数
  • 批归一化(Batch Normalization)
  • 丢弃法(Dropout)

回顾一下,在上一章“一个案例带你吃透深度学习”中,我们介绍了手写数字识别任务,应用的是全连接网络进行特征提取,即将一张图片上的所有像素点展开成一个1维向量输入网络,存在如下两个问题:

1. 输入数据的空间信息被丢失。空间上相邻的像素点往往具有相似的RGB值,RGB的各个通道之间的数据通常密切相关,但是转化成1维向量时,这些信息被丢失。同时,图像数据的形状信息中,可能隐藏着某种本质的模式,但是转变成1维向量输入全连接神经网络时,这些模式也会被忽略。

2. 模型参数过多,容易发生过拟合。在手写数字识别案例中,每个像素点都要跟所有输出的神经元相连接。当图片尺寸变大时,输入神经元的个数会按图片尺寸的平方增大,导致模型参数过多,容易发生过拟合。

为了解决上述问题,我们引入卷积神经网络进行特征提取,既能提取到相邻像素点之间的特征模式,又能保证参数的个数不随图片尺寸变化图6是一个典型的卷积神经网络结构,多层卷积和池化层组合作用在输入图片上,在网络的最后通常会加入一系列全连接层,ReLU激活函数一般加在卷积或者全连接层的输出上,网络中通常还会加入Dropout来防止过拟合。

图6:卷积神经网络经典结构


说明:

在卷积神经网络中,计算范围是在像素点的空间邻域内进行的,卷积核参数的数目也远小于全连接层。卷积核本身与输入图片大小无关,它代表了对空间邻域内某种特征模式的提取。比如,有些卷积核提取物体边缘特征,有些卷积核提取物体拐角处的特征,图像上不同区域共享同一个卷积核。当输入图片大小不一样时,仍然可以使用同一个卷积核进行操作。

卷积(Convolution)

这一小节将为读者介绍卷积算法的原理和实现方案,并通过具体的案例展示如何使用卷积对图片进行操作,主要涵盖如下内容:

  • 卷积计算
  • 填充(padding)
  • 步幅(stride)
  • 感受野(Receptive Field)
  • 多输入通道、多输出通道和批量操作
  • 飞桨卷积API介绍
  • 卷积算子应用举例

卷积计算

卷积是数学分析中的一种积分变换的方法,在图像处理中采用的是卷积的离散形式。这里需要说明的是,在卷积神经网络中,卷积层的实现方式实际上是数学中定义的互相关(cross-correlation)运算,与数学分析中的卷积定义有所不同,这里跟其他框架和卷积神经网络的教程保持一致,都使用互相关运算作为卷积的定义,具体的计算过程如图7所示。

图7:卷积计算过程

说明:

卷积核(kernel)也被叫做滤波器(filter),假设卷积核的高和宽分别为k_h和k_w,则将称为k_h* k_w卷积,比如3×5卷积,就是指卷积核的高为3, 宽为5。


  • 如图7(a)所示:左边的图大小是 3 × 3 ,表示输入数据是一个维度为 3 × 3的二维数组;中间的图大小是 2 × 2 ,表示一个维度为 2 × 2的二维数组,我们将这个二维数组称为卷积核。先将卷积核的左上角与输入数据的左上角(即:输入数据的(0, 0)位置)对齐,把卷积核的每个元素跟其位置对应的输入数据中的元素相乘,再把所有乘积相加,得到卷积输出的第一个结果:

0×1+1×2+2×4+3×5=25(a)

  • 如图7(b)所示:将卷积核向右滑动,让卷积核左上角与输入数据中的(0,1)位置对齐,同样将卷积核的每个元素跟其位置对应的输入数据中的元素相乘,再把这4个乘积相加,得到卷积输出的第二个结果:

0×2+1×3+2×5+3×6=31(b)

  • 如图7(c)所示:将卷积核向下滑动,让卷积核左上角与输入数据中的(1, 0)位置对齐,可以计算得到卷积输出的第三个结果:

0×4+1×5+2×7+3×8=43(c)

  • 如图7(d)所示:将卷积核向右滑动,让卷积核左上角与输入数据中的(1, 1)位置对齐,可以计算得到卷积输出的第四个结果:

0×5+1×6+2×8+3×9=49(d)

卷积核的计算过程可以用下面的数学公式表示,其中a代表输入图片,b代表输出特征图,w是卷积核参数,它们都是二维数组,∑u,v\sum{u,v}{\ }表示对卷积核参数进行遍历并求和。

b[i,j]=∑u,va[i+u,j+v]⋅w[u,v]

举例说明,假如上图中卷积核大小是2×2,则u可以取0和1,v也可以取0和1,也就是说:

b[i,j]=a[i+0,j+0]⋅w[0,0]+a[i+0,j+1]⋅w[0,1]+a[i+1,j+0]⋅w[1,0]+a[i+1,j+1]⋅w[1,1]

读者可以自行验证,当[i,j][i, j]取不同值时,根据此公式计算的结果与上图中的例子是否一致。

  • 【思考】 当卷积核大小为 3 × 3 时, b和 a之间的对应关系应该是怎样的?

其它说明:

在卷积神经网络中,一个卷积算子除了上面描述的卷积过程之外,还包括加上偏置项的操作。例如假设偏置为1,则上面卷积计算的结果为:

0×1+1×2+2×4+3×5+1=26

0×2+1×3+2×5+3×6+1=32

0×4+1×5+2×7+3×8+1=44

0×5+1×6+2×8+3×9+1=50

填充(padding)

在上面的例子中,输入图片尺寸为3×3,输出图片尺寸为2×2,经过一次卷积之后,图片尺寸变小。卷积输出特征图的尺寸计算方法如下(卷积核的高和宽分别为k_h和k_w):

H_{out} = H - k_h + 1

W_{out} = W - k_w + 1

如果输入尺寸为4,卷积核大小为3时,输出尺寸为4−3+1=2。读者可以自行检查当输入图片和卷积核为其他尺寸时,上述计算式是否成立。当卷积核尺寸>1时,输出特征图的尺寸会<输入图片尺寸。如果经过多次卷积,输出图片尺寸会不断减小。为了避免卷积之后图片尺寸变小,通常会在图片的外围进行填充(padding),如图8所示。

图8:图形填充

  • 如图8(a)所示:填充的大小为1,填充值为0。填充之后,输入图片尺寸从 4 × 4 变成了 6 × 6 ,使用 3 × 3 的卷积核,输出图片尺寸为 4 × 4 。
  • 如图8(b)所示:填充的大小为2,填充值为0。填充之后,输入图片尺寸从 4 × 4 变成了 8 × 8 ,使用 3 × 3的卷积核,输出图片尺寸为 6 × 6 。

如果在图片高度方向,在第一行之前填充p_{h1}行,在最后一行之后填充p_{h2}行;在图片的宽度方向,在第1列之前填充p_{w1}列,在最后1列之后填充p_{w2}列;则填充之后的图片尺寸为(H+ph1+ph2)×(W+pw1+pw2)。

经过大小为kh×kw的卷积核操作之后,输出图片的尺寸为:

Hout=H+ph1+ph2−kh+1 、Wout=W+pw1+pw2−kw+1

在卷积计算过程中,通常会在高度或者宽度的两侧采取等量填充,即ph1=ph2=ph,pw1=pw2=pw,上面计算公式也就变为:

H_{out} = H + 2p_h - k_h + 1 、W_{out} = W + 2p_w - k_w + 1

卷积核大小通常使用1,3,5,7这样的奇数,如果使用的填充大小为 p_h=(k_h-1)/2 ,p_w=(k_w-1)/2,则卷积之后图像尺寸不变。例如当卷积核大小为3时,padding大小为1,卷积之后图像尺寸不变;同理,如果卷积核大小为5,padding大小为2,也能保持图像尺寸不变。

步幅(stride)

图8中卷积核每次滑动一个像素点,这是步幅为1的特殊情况。图9是步幅为2的卷积过程,卷积核在图片上移动时,每次移动大小为2个像素点。

图9:步幅为2的卷积过程

当宽和高方向的步幅分别为s_h和s_w时,输出特征图尺寸的计算公式是:

感受野(Receptive Field)

输出特征图上每个点的数值,是由输入图片上大小为kh×kw的区域的元素与卷积核每个元素相乘再相加得到的,所以输入图像上kh×kw区域内每个元素数值的改变,都会影响输出点的像素值。我们将这个区域叫做输出特征图上对应点的感受野。感受野内每个元素数值的变动,都会影响输出点的数值变化。比如3×3卷积对应的感受野大小就是3×3,如图10所示。

图10:感受野为3×3的卷积

而当通过两层3×3的卷积之后,感受野的大小将会增加到5×5,如图11所示。

图11:感受野为5×5的卷积

因此,当增加卷积网络深度的同时,感受野将会增大,输出特征图中的一个像素点将会包含更多的图像语义信息。

多输入通道、多输出通道和批量操作

前面介绍的卷积计算过程比较简单,实际应用时,处理的问题要复杂的多。例如:对于彩色图片有RGB三个通道,需要处理多输入通道的场景。输出特征图往往也会具有多个通道,而且在神经网络的计算中常常是把一个批次的样本放在一起计算,所以卷积算子需要具有批量处理多输入和多输出通道数据的功能,下面将分别介绍这几种场景的操作方式。

  • 多输入通道场景

上面的例子中,卷积层的数据是一个2维数组,但实际上一张图片往往含有RGB三个通道,要计算卷积的输出结果,卷积核的形式也会发生变化。假设输入图片的通道数为Cin,输入数据的形状是Cin×Hin×Win,计算过程如图12所示。

  1. 对每个通道分别设计一个2维数组作为卷积核,卷积核数组的形状是 C i n × k h × k w 。
  2. 对任一通道 C i n ∈ [ 0 , C i n ) ,分别用大小为 k h × k w的卷积核在大小为 H i n × W i n 的二维数组上做卷积。
  3. 将这 C i n个通道的计算结果相加,得到的是一个形状为 H o u t × W o u t 的二维数组。

图12:多输入通道计算过程

  • 输出通道场景

一般来说,卷积操作的输出特征图也会具有多个通道Cout,这时我们需要设计Cout个维度为Cin×kh×kw的卷积核,卷积核数组的维度是Cout×Cin×kh×kw,如图13所示。

  1. 对任一输出通道 c o u t ∈ [ 0 , C o u t ) ,分别使用上面描述的形状为 C i n × k h × k w 的卷积核对输入图片做卷积。
  2. 将这 C o u t 个形状为 H o u t × W o u t的二维数组拼接在一起,形成维度为 C o u t × H o u t × W o u t的三维数组。

说明:

通常将卷积核的输出通道数叫做卷积核的个数

图13:多输出通道计算过程

  • 批量操作

在卷积神经网络的计算中,通常将多个样本放在一起形成一个mini-batch进行批量操作,即输入数据的维度是N×Cin×Hin×Win。由于会对每张图片使用同样的卷积核进行卷积操作,卷积核的维度与上面多输出通道的情况一样,仍然是Cout×Cin×kh×kw,输出特征图的维度是N×Cout×Hout×Wout,如图14所示。

图14:批量操作

飞桨卷积API介绍

飞桨卷积算子对应的API是paddle.nn.Conv2D,用户可以直接调用API进行计算,也可以在此基础上修改。Conv2D名称中的“2D”表明卷积核是二维的,多用于处理图像数据。类似的,也有Conv3D可以用于处理视频数据(图像的序列)。

classpaddle.nn.Conv2D ( in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, padding_mode='zeros', weight_attr=None, bias_attr=None, data_format='NCHW')

常用的参数如下:

  • in_channels(int) - 输入图像的通道数。
  • out_channels(int) - 卷积核的个数,和输出特征图通道数相同,相当于上文中的 C o u t C_{out} 。
  • kernel_size(int|list|tuple) - 卷积核大小,可以是整数,比如3,表示卷积核的高和宽均为3 ;或者是两个整数的list,例如[3,2],表示卷积核的高为3,宽为2。
  • stride(int|list|tuple,可选) - 步长大小,可以是整数,默认值为1,表示垂直和水平滑动步幅均为1;或者是两个整数的list,例如[3,2],表示垂直滑动步幅为3,水平滑动步幅为2。
  • padding(int|list|tuple|str,可选) - 填充大小,可以是整数,比如1,表示竖直和水平边界填充大小均为1;或者是两个整数的list,例如[2,1],表示竖直边界填充大小为2,水平边界填充大小为1。

输入数据维度[N,Cin,Hin,Win],输出数据维度[N,out_channels,Hout,Wout],权重参数ww的维度[out_channels,Cin,filter_size_h,filter_size_w],偏置参数b的维度是[out_channels]。注意,即使输入只有一张灰度图片[Hin,Win],也需要处理成四个维度的输入向量[1,1,Hin,Win]。

相关文章
|
15天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
7天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
18天前
|
机器学习/深度学习 监控 自动驾驶
卷积神经网络有什么应用场景
【10月更文挑战第23天】卷积神经网络有什么应用场景
18 2
|
18天前
|
机器学习/深度学习 自然语言处理 算法
什么是卷积神经网络
【10月更文挑战第23天】什么是卷积神经网络
24 1
|
21天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
65 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
8天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
23 0
|
11天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
17天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第26天】在这篇文章中,我们将深入探讨卷积神经网络(CNN)的基本原理、结构和应用。CNN是深度学习领域的一个重要分支,广泛应用于图像识别、语音处理等领域。我们将通过代码示例和实际应用案例,帮助读者更好地理解CNN的概念和应用。
|
19天前
|
机器学习/深度学习 算法 计算机视觉
深度学习与生活:如何利用卷积神经网络识别日常物品
【10月更文挑战第24天】在这篇文章中,我们将探索深度学习如何从理论走向实践,特别是卷积神经网络(CNN)在图像识别中的应用。通过一个简单的示例,我们将了解如何使用CNN来识别日常生活中的物体,如水果和家具。这不仅是对深度学习概念的一次直观体验,也是对技术如何融入日常生活的一次深刻反思。文章将引导读者思考技术背后的哲理,以及它如何影响我们的生活和思维方式。

热门文章

最新文章