什么是卷积神经网络(CNN)?
卷积神经网络是深度学习中很重要的一个内容,也是面试题中经常涉及到的一个知识点。
在这里,我来谈谈自己对于卷积神经网络的理解。
神经网络
在讨论卷积神经网络之前,我们首先来简单了解一下什么是神经网络。
简单来说,神经网络是一个这样的模型:输入可以类比于神经元的树突,输出可以类比于神经元的轴突,计算则可以类比于神经元的细胞核。
根据上图,如果把输入1设为a1,输入2为a2......权值1为w1,权值2为w2......非线性函数表示为g,最终输出为z,那么输出z的计算公式为
训练神经网络的过程就是不断调整更新权值w1、w2......的过程。
- 最简单的神经网络:单层感知机。
常见的神经网络有卷积神经网络(CNN)、循环神经网络(RNN)等。在这里我们主要讨论的是卷积神经网络(CNN)。
卷积神经网络
卷积神经网络主要包含:卷积层、激活层、池化层和全连接层。CNN非常适用于图像分类和识别。
卷积层
卷积层是卷积神经网络的核心所在。在该层中,我们设置一个适当大小的卷积核,通过使用该核来对数据进行扫描运算提取特征,并不断降低数据的维度。以图像为例子,卷积核从图像的左上端开始扫描;卷积核每移动一次(卷积核根据给定的移动步长stride来进行移动),便提取卷积核所处区域的某一个数据作为该区域的特征值(假设卷积核的大小是a*a,那么每a*a个数据转化为一个数据,这大大降低了数据的维度),从而达到降维的效果。
激活层
激活层的功能是:将上一层的输出通过一个特定的激活函数,将数据进行一定的处理(比如归一化处理等),得到的函数的输出作为下一层的输入。
- 常用的激活函数有sigmoid函数和relu函数。
池化层
在该层中,我们将在一个区域中的所有信息,提取一个信息出来作为代表信息传入到下一层的神经元中,从而降低信息的维数,可以有效防止过拟合的出现。
- 一般而言,池化层特征信息的提取有四种方法:选择所有信息的平均数、选择出现频率最多的那一个、选择最大的或最小的、随机选择。
全连接层
全连接层放在神经网络的最后,将最后一层卷积的结果进行全连接,得到最终的结果。全连接层主要起到分类器的作用。
卷积神经网络的卷积、激活和池化可进行多次重复操作,最终的全连接层只有一层。
在上面我们知道,神经网络学习的是各个权值wi。但在卷积神经网络中,我们需要学习的参数是什么呢?我们需要学习和更新的是卷积核!
卷积核提取特征的运算是矩阵的乘积运算,大家可以看看下面一个例子:
(步长为1,卷积核和原始图像如下,原始图像不知为何无法显示出来,大家可以看下面与全连接对比的那张图)
卷积核的移动步长为1,每一个3*3的区域经过卷积核的运算,都提取出了一个特征值。
- 运算规则为每个卷积核对应的数值与原图像扫描区域的对应数值相乘得到一个输出,再把得到的输出相加,即可得到该区域的特征值。以第一个扫描区域为例,设特征值为z,则
这是卷积后得到的新矩阵,与原来的6*6矩阵相比,新矩阵的维度为4*4,维度明显下降。
- 卷积神经网络的最大优点便是卷积核的使用。与全连接相比,卷积核的存在,使得卷积神经网络的输入之间可以共享参数,大大减少了参数的数量(卷积神经网络的参数个数是卷积核的大小,而全连接网络的参数是所有输入的个数)。
下面我们来看一下python中如何创建一个卷积神经网络。
self.conv1 = nn.Sequential( #(3, 224, 224) nn.Conv2d( in_channels=3, #输入通道数 out_channels=16, #输出通道数 kernel_size=5, #卷积核大小 stride=1, #步长 padding=2, #填充 ), #卷积层 nn.ReLU(), #激活层 nn.MaxPool2d(kernel_size=2), #(16, 112, 112) 池化层 )这是一层卷积的代码,假设输入为通道数为3,大小为224*224的图像。
- 输入通道数in_channels必须与上一层的输出通道数相等
- 输出通道数out_channels可以自行设定,代表的是卷积核的个数,同时训练多个不同的卷积核
- kernel_size是卷积核的大小
- 步长stride代表卷积核每次移动的跨度
- padding代表填充的大小。如果没有填充,步长的设置不当可能导致卷积核移动到图像区域以外。这时候,填充空白的数值是必要的。padding需要认为进行计算和设定,最简单的计算公式(周围填充)为
(p表示padding,k表示kernel大小,s表示步长)
最后全连接层为
self.out = nn.Linear(16*112*112, 5) #5代表图像的类别数

查看13道真题和解析
阿里云成长空间 786人发布