卷积神经网络入门

参考博客 图灵猫-Arwin

卷积神经网络
核概念和卷积操作

image-20230620122320094

卷积操作定义为就是kernel和input的对应位置相乘求和得到的结果

如果kernel里的值全是1,即求平均,那么得到的就是一个模糊的效果

image-20230620122457703

而图中右边的kernel就是边缘提取的作用,可以这样理解,kernel的作用是特征提取。

kernel中的权重w就是卷积神经网络训练需要求得的参数

由于kernel的尺寸一般都远远小于图像的像素矩阵尺寸,因此,只对图像进行一次卷积操作只能处理图像中的一小部分信息,这肯定是不合理的。所以,使用卷积处理图像还需要多个滑动遍历的过程,如下图所示:卷积核会从图像的起始位置(左上角)开始,以一定的顺序(从左到右,从上到下)遍历整张图像,每滑动一次就与对应的位置做一次卷积操作直到遍历到最终位置(右下角),这个过程叫做卷积对图像的一次处理。其中,kernel每次滑动的像素大小被定义为步幅(stride),动图中的stride=2。

cnn2

这里需要注意的一点是:卷积核从图像的初始位置(左上角)滑动到最后位置(右下角)这个过程中,卷积核中的参数是不会发生改变的,这叫做参数共享,是卷积操作的重要性质之一。如下图所示,左边是参数独立的情况,即核每滑动一次,其中的参数就要重新计算,右面则是参数共享的方式,也是卷积操作所采用的方式。

image-1663784221426

这样做的目的从某种角度来说是在模仿人类的一种视觉习惯:平移不变性。解释一下就是在图像中,只要是同一种特征,那么不管这个特征被平移到图像中的什么位置,我们人类都能做很好的识别。

填充(padding)

卷积对中间的关注度更高,对局部的关注度少了,从滑动遍历也可以很方便看出,中间参与计算的次数更多,所以就引入了Padding,他的第二个作用是为了调节输出结果的尺寸,因为很多情况下,我们希望在不使用1x1大小卷积核的前提下,可以调整卷积输出结果的尺寸。

cnn

卷积计算结果的尺寸与卷积核,步长,填充和输入信息尺寸这四个因素相关。
我们先定义几个参数:

  • 输入图片大小 W×W
  • 卷积核大小 F×F
  • 步长 S
  • padding的像素数 P

于是我们可以得出卷积结果的尺寸计算公式为:

N = (W − F + 2P )/S+1

即,卷积输出结果的尺寸为 N×N。

通道(channel)

我们可以将一个图片数据集抽象为四维[数量,长,宽,色彩],每个维度都是一个通道的概念,一个通道中往往存储中相同概念的数据。例如对于一张32x32分辨率的彩色照片来讲,我们一般将其抽象为向量[1,32,32,3], 3指的是RGB三个颜色通道。

image-1664914274639

从图中可以发现,首先卷积核的维度与输入图像的维度相同,也是四维信息,其维度是[3,kernel_H ,kernel_W,3] 。第一个维度的3,对应图中的三个卷积核。第二维度和第三维度对应着卷积核的尺寸。第四维度的3,对应的是卷积核的通道数目。需要注意的是,卷积核的通道数量与输入信息的通道数量是相等的,这是因为在一次卷积操作中,一个卷积核的通道与一个输入信息的通道做卷积操作,每个通道一一对应,如图中的灰色箭头所示。在示例中,一个卷积核的三个通道会计算得到三张特征图,这三个特征图最后对应位置求和会得到一个计算结果,即不管一个卷积核的通道数量是多少,一个卷积核只能计算得到一张特征图

除此之外,为了保证模型的学习能力,我们一般会设计多个卷积核,尝试去图像中分别提取不同的特征,之后会详细介绍。在上图示例中,一次卷积操作使用的n个卷积核,这n个卷积核会计算得到n个特征图,它们一起作为这次卷积的计算结果。

这里一定要明确的是每一次卷积的维度变化,假设:输入信息的维度是 [1, 32, 32, 3],卷积核的维度是 [4,3 , 3,3] ,卷积操作的步长为1,填充也为1。

那么每一个卷积核都会得到 [1, 32, 32, 1] 的输出结果。最后,由于我们有4个不同的卷积核,将四个 [1, 32, 32, 1] 拼到一起才得到维度 [1, 32, 32, 4]

最后,回归通道的概念。刚刚解释过计算机要表示整张彩色图片,需要RGB三个颜色通道。使其上,一个数据的通道可以是任意整数,在深度学习模型中,往往是成百上千的,这怎么理解呢?

其实,每个通道存储的都是一个概念,例如,单通道时可以存储图像的像素值;通道维度为2时,可以存储图像的平面坐标;通道维度为3时,可以存储图像的颜色信息;类比下去,对于多通道我们可以看做是图像更抽象的版本,每一个通道都表示图像某一方面的信息

池化与采样

从某种程度上,池化可以看作特殊的卷积,因为卷积中常见的概念(kernel,padding,stride,slidding)池化操作都有;只有一个地方特殊,即池化的核与输入信息的对应位置元素做的操作不同,在卷积里这个操作是相乘求和,在池化里这个操作是求平均或最大,分别对应平均池化和最大池化(Average pooling和Max pooling)。 如下图示例所示:

image-1663779819393

上图中,池化的核是绿色的框,大小为2x2;原始输入数据的填充为0,因为在原始数据的四周并没有像素填充;池化操作的步长为2 ,即初始位置为黄色部分,滑动后到了红色的部分,滑动了两个像素位置。

至于左下角的2x2矩阵为平均池化的结果,例如第一个元素2的计算过程为 (1+3+1+3)/4,即池化的核与输入信息的对应位置做平均的结果;而左下角的2x2矩阵为最大池化的结果,例如第一个元素3的计算过程为 max(1,3,1,3),即池化的核与输入信息的对应位置比较取最大的结果。

感受野

在这里插入图片描述
如果只有一层的话,就只能看到3 * 3,如果有两层,那么第二层又是映射第一层的,第一层又是3 * 3的,所以这样就能看到5 * 5的,即明显更大了

设计思想
  1. 参数量角度:全连接神经网络是全局计算,参数量巨大,而卷积是局部性卷积可以在短时间内训练出一个相对较好的模型,减少参数。
    在这里插入图片描述

每个圆圈可理解为隐藏层的结点,连线的角度可以抽象成权值W。当以全连接层方式观察时,每变换一个结点,相当于变换一个观察角度,所有的连线角度都会改变,造成了所有的W都不一样,所以全连接层的参数会很多。反观卷积层方式,当选定一个kernel(即图中彩色长方形区域)大小时,可以通过kernel的上下左右移动来遍历整张图片,在此过程中,连线的角度不变,即权值w的大小不变,由次可以解释卷积方式参数大量下降的原理。

  1. 平移不变性角度:单独一个像素表征不了任何东西,需要和它附近的像素一块表示,并且像素点离得越远,越没有相关性。卷积神经网络在图片识别上意义重大,它的意义远不止减少参数量这一点。实际上,对图片进行卷积操作就是把卷积模板(kernel)与原图片做点积操作。点积的数学解释可以解释为:两个向量之间的相似度。推广到这里,可以说成kernel与原图的相似度,卷积的结果越大,说明图片中某位置和kernel的相似度越大,反之亦然。

实际上,深度卷积神经网络就是去求解这千千万万个kernel的这么一种网络。这些kernel不是凭借我们的经验随便定义的,而是通过网络不断的学习更新参数得来的。而卷积神经网络的不易解释性就在于此,随着模型的复杂,抽象出的kernel千千万万,我们难以去解释每个kernel的具体含义,也难以介绍每个中间层和中间结点的含义。

  1. 人的视觉角度:人类的视觉习惯更喜欢关注一些局部的标志性特征而不是整体

相较于全连接神经网络,卷积神经网络的计算方法更符合人类的视觉习惯。我们可以想象一个场景:当我们突然置身于一个复杂且陌生的环境,那么,我们是怎么快速的获得周边信息的?

如果以神经网络的方式,由于神经网络的计算是全局性的,为了模仿这一性质,我们在观察场景时需要同时的观察全局,思考全局。这其实并不是人类视觉的观察习惯。我们往往会选择先观察一个局部的你感兴趣的区域,观察时,只需要思考这个局部区域有什么即可。之后,再会选择左看看,右看看,看到哪里思考到哪里,通过有规律的扫视对全局做完整的观察。这其实与卷积神经网络先观察局部,再通过滑动的方式遍历全局,滑动到哪里就计算到哪里是一样的。所以说,卷积的设计是更符合人类的视觉习惯的。

卷积对图像的特征提取

如何提取特征?在滑动遍历的时候相乘求和,如果和核的特征是一样的话,那么算出的是极大值。

一次卷积操作用多个卷积核,目的是为了提取多个特征。当然肯定也不是越多越好的

image-20230620130619616

如上图所示,当滑动到绿色框的时候,其卷积计算结果等于9,此时9为这个3*3的卷积核能够计算得到的最大值。而在其他位置的卷积结果肯定是比9要小的值

卷积实现图像识别

如下图所示是卷积模型实现图像识别的标准网络结构:从图中可以看出整个卷积网络是分为两个阶段的,分别是红色框和绿色框圈出的两部分。

image-1663778905303

在红色框中,是通过不断堆叠卷积层和池化层组成的(虽然图中只画了一层卷积和池化,实际的模型中会有多层),其中,卷积的目的是做特征提取;池化的目的是做特征汇聚。

在绿色框中,是通过不断堆叠全连接神经网络层组成的,其目的是对红色框传过来的特征进行学习,判断这些特征最有可能属于哪个类别。

当池化操作与卷积操作配合使用时,池化的作用是做特征的汇聚,我们还以刚才的示例为例,如下图所示,从图像的起始位置开始做卷积操作,每次滑动的步长为2,直到末尾的位置。当第一个卷积核滑动到图中四个位置时,卷积结果分别是9,3,-1,-3 。

image-1663780573264

这四个值在本次卷积的计算结果中大致是如下所示,注意,滑动到其他位置的卷积计算结果也应该是有值的,这里以…代替:

image-1664916830972

池化操作一般是跟在卷积操作后面的,即卷积的计算结果是池化操作的输入信息,在当前这个例子中,上图表即为卷积的计算结果。当我们选择使用一个2x2大小的池化核对上述卷积结果做操作时,我们发现被保留下来的数值是9 。对此是解释是:9正是卷积操作在原图中找到的对角特征,通过最大池化的方式被保留下来了;顺带把卷积认为不是很重的特征(例如3,-1,-3)删掉,这就完成了特征汇聚的过程。

接下来是绿色框中的全连接神经网络操作。如下图所示,我们发现,在送进全连接神经网络之前,有一步叫做Flatten的操作。对此的解释是卷积的计算结果是一组特征图,这些数据是有空间维度的(即高度和宽度),但是全连接神经网络层能接受的数据格式要求是向量(即维度等于1的数据),因此,Flatten操作的目的是把多维的特征图压缩成长度为 height × width × channel 的一维数组,然后再与全连接层连接,通过全连接层处理卷积操作提取到的特征并输出结果。

image-1663781907135

上图中,全连接神经网络层最后只输出了两个节点,此时表明是一个二分类的问题,即 X 和 O 两个类别。这两个数值可以看作模型认为该图像属于某类型的可能性。

此外,在做图像识别时,我们一般习惯在模型是输出结果后增加一个简单的分类器,例如softmax分类器,其作用是把输入数据归一化到[0,1]区间,且所有归一化后的所有元素相加等于1,归一化后的数值即可表示图像属于某种类别的可能性了。例如图中[0.92, 0.51]归一化后会变成[0.98, 0.02]

softmax的作用简单的说就计算一组数值中每个值的占比,公式一般性描述为:
设一共有n个用数值表示的分类 S k S_k Sk ,k∈(0,n],其n表示分类的个数。那么softmax计算公式为:
P ( S i ) = e g i ∑ k n e g k P(S_i)=\frac{e^{gi}}{\sum_k^n{e^{gk}}} P(Si)=knegkegi
其中,i表示k中的某个分类, g i g_i gi表示该分类的值。

卷积操作在pytorch中的API

卷积操作在pytorch中被封装成一个名称为torch.nn.Conv2d的类

image-1663786840440
其中,类的参数解释如下:

  • in_channels (int) - 输入图像中的通道数
  • out_channels (int) - 由卷积产生的通道数
  • kernel_size (int or tuple) - 卷积核的大小
  • stride (int or tuple, optional) - 卷积的步长。默认值:1
  • padding (int, tuple or str, optional) - 在输入的四边都加上padding。默认值:0
  • padding_mode (string, optional) - padding的模式,可选参数有’zeros’, ‘reflect’, ‘replicate’ or ‘circular’. 分别代表’零填充’、‘镜像填充’、‘复制填充’,‘循环填充’。 默认值为:‘零填充’。
  • dilation (int or tuple, optional) - 卷积核中元素之间的间距,对应卷积变体之扩张卷积。默认值:1
  • groups (int, optional) - 从输入通道到输出通道的阻塞连接的数量,对应卷积变体之组卷积。默认值:1
  • bias (bool, optional) - 如果为真,给输出增加一个可学习的偏置。默认值为真
最大池化操作在pytorch中的API

池化操作在pytorch中被封装成一个名称为torch.nn.MaxPool2d的类,具体如下图所示:image-1663787858851 (1)

其中,类的参数解释如下:

  • kernel_size - 池化核的大小。
  • stride - 池化的步长。默认值是kernel_size
  • padding - 在输入的四边都加上padding。 隐含的零填充,在两边添加。
  • dilation - 池化核中元素之间的间距, 默认值:1
  • return_indices - 如果为真,将与输出一起返回最大索引。对以后的 torch.nn.MaxUnpool2d 有用。
  • ceil_mode - 如果为真,将使用ceil而不是floor来计算输出形状。
全连接神经网络层在pytorch中的API

全连接神经网络层在pytorch中被封装成一个名称为torch.nn.Linear的类,具体如下图所示:

image-1663787858851 (1)

其中,类的参数解释如下:

  • in_features - 每个输入样本的大小
  • out_features - 每个输出样本的大小
  • bias - 如果设置为False,该层将不学习加性偏置。默认值。为真
激活函数ReLU在pytorch中的API

常见的激活函数ReLU在pytorch中被封装成一个名称为torch.nn.ReLU的类,具体如下图所示:

image-1663788577182

其中,参数一般习惯指定为Ture,当为Ture时,ReLU的计算在底层会节省一下计算和存储资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值