从全连接层到卷积
- 卷积神经网络(convolutional neural networks, CNN)是机器学习利用自然图像中一些已知结构的创造性方法。
- 基于CNN的架构在CV领域无处不在,eg:在 Imagnet 集合(邓等人,2009 年)中,仅使用卷积神经网络,简称卷积网络,提供了显着的性能改进(Krizhevsky 等人,2012 年)。
- CNN需要的参数比全连接层少,CNN很容易在GPU内核之间并行化。(促使CNN具有计算效率)
数据小知识:
- 图像数据:每个样本是由一个二维像素网格组成,每个像素可能是一个或者多个数值(取决于是黑白还是彩色图像)
- 我们目前处理图像数据的方式:忽略像素之间的空间关系,直接将图像展平,将图像数据视为数字向量
- 上述的这种处理图像数据的方法,可以处理全连接MLP生成的一维向量
- 处理图像数据的最优结果是:利用相似像素之间的相互关联性,从图像数据中学习得到有效的模型
- 表格数据:行对应样本;列对应特征
适用于计算机视觉的神经网络架构的创建原则:
- 平移不变性(translation invariance): 不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应**(人话:检测对象在输入中平移,隐藏表示也应该平移)**
- **局部性(locality):**神经网络的前面几层应该只探索输入图像中的局部区域,不过度在意图像中相隔较远区域的关系(最终,模型可以聚合这些局部特征,以在整个图像级别进行预测)
多层感知机的限制
- 多层感知机的输入: 二维图像X
- 多层感知机的隐藏表示:H(在数学上是个矩阵,在代码中表示二维张量)
- X和H是相同的形状,(为了方便理解,我们认为:)X和H都拥有空间结构
- 输入图像中位置(i, j)处的像素:[X]i,j
- 隐藏表示中 位置(i, j)处的像素:[H]i,j
- 将参数从权重矩阵替换为四阶权重张量W(使每个隐藏层神经元都能接收到每个输入像素的信息)。假设U包含偏置参数,将全连接层形式化地表示为:
**ps:**W和V只是表达形式不同,让索引下标:k=i+a, l=j+b,则[V]i,j,a,b = [W]i,j,i+a,j+b
索引a和b通过在正偏移和负偏移之间移动覆盖了整个图像。
**上式的文字描述:**隐藏表示中任意给定位置(i,j)处的像素值[H]i,j = 在X(输入)中以(i,j)为中心对输入像素进行加权求和得到,加权使用的权重为[V]i,j,a,b
根据平移不变性,则检测对象在输入X中的平移,应该仅导致隐藏表示H中的平移则,上式中的V和U不依赖于(i,j)的值(就是V和U和(i,j)不相关),则[V]i,j,a,b = [V]a,b。并且U是一个常数,比如u。故而,我们可以将H简化为:
这个[H]i,j的表达式就是卷积(convolution)。
ps:[V]a,b的系数比[V]i,j,a,b少很多,因为前者不再依赖图像中的位置(这就是显著的进步)
根据局部性,不应偏离到距(i,j)很远的地方,收集来训练参数[H]i,j的相关信息=》或的范围之外,我们可以设置[V]a,b = 0。则[H]i,j重写为:
这个[H]i,j,我们称之为卷积层(convolutional layer)
卷积神经网络是包含卷积层的一类特殊的神经网络
V被称为:卷积核(convolution kernel)/ 滤波器(filter)/该卷积层的权重(是可学习的参数)
卷积
在数学中,2个函数之间的卷积定义为:
上式的文字描述:卷积就是把一个函数"翻转"并移位x时,测量f和g之间的重叠,当为离散对象时,积分就变成求和。
eg:
对于由索引为z的,平方可和的,无限维向量集合抽取的向量,我们得到以下定义:
对于二维张量,则为f的索引(a,b)和g的索引(i-a, j-b)上的对应加和:
这个和前面的[H]i,j本质上是一样的,只不过形式不同
图像:高度,宽度,颜色组成的三维张量(高度,宽度的轴与像素的空间位置有关;颜色的轴:每个像素的多维表示
根据图像的张量维度,[X]i,j=>[X]i,j,k ; [V]a,b => [V]a,b,c , 隐藏表示也变成了三维张量: [H]i,j => [H]i,j,d,此时我们称[H]i,j,b为一组隐藏表示,是一些互相堆叠的二维网格=》为一系列具有二维张量的通道(channel)。这些通道,有时候被称为特征映射(feature maps)(因为每个通道都向
后续层提供一组空间化的学习特征。)(直观上可以想象在靠近输入的底层。一些通道专门识别边缘,而一些通道专门识别纹理。
图像卷积
互相关运算
- 卷积层所表达的运算是:互相关运算(cross-correlation)(而不是卷积运算)(所以严格来说,卷积层是个错误的叫法)
- 在卷积层中,输入张量和核张量通过互相关运算产生输出张量(对应上面的卷积层的数学表达式)
- 卷积核窗口(卷积窗口)的形状由内核的高度和宽度决定
- 互相关运算示例:二维互相关运算:输入高度:3,宽度:3的二维张量(形状为3 x 3);卷积核的高度,宽度:2;卷积核窗口由内核的高度和宽度决定(2 x 2);卷积核窗口的元素和输入层根据卷积核窗口框住的范围按位元素相乘,具体如下:
ps:输出大小略小于输入大小:输出大小=输入大小 x - x 即
(因为卷积核只与图像中每个大小完全适合的位置进行互相关运算,上式表示我们需要足够的空间在图像上"移动"卷积核。)
- 上图输出的卷积层有时被称为特征映射(feature map)(因为它可以视为一个输入映射到下一层的空间维度的转换器
- 感受野(receptive filed):在卷积神经网络中,对于某一层的任意元素x,其感受野是指在前向传播期间可能影响x计算的所有元素(来自所有先前层);感受野可能大于输入的实际大小
- **根据上图解释感受野:**给定2x2卷积核,阴影输出元素值19的感受野是输入阴影部分的四个元素。假设之前输出为Y,其大小为2x2,现在我们在其后附加一个卷积层,该卷积层以Y为输入,输出单个元素z。在这种情况下,上的z的感受野包括y的所有四个元素而输入的感受野包括最初所有九个输入元素。因此,当一个特征图中的任意元素需要检测更广区域的输入特征时,我们可以构建一个更深的网络。
- 手动设计卷积核具体代码如下:
- 命名小规则:h X w 卷积(核):高度和宽度分别为h和w h X w 卷积层:带有h X w卷积核的卷积层
- 学习卷积核(仅查看"输入-输出"学习由X生成Y的卷积核: (当有更复杂数值的卷积核/连续的卷积层)
- 构造一个卷积层,将其卷积核随机初始化为一个张量
- 在每次迭代中,比较Y与卷积层输出的平方误差
- 计算梯度,更新卷积核
具体代码如下:
碎知识点:
- 卷积运算和互相关运算差别不大 ,我们只需水平和垂直翻转二维卷积核张量,对输入张量执行互相关运算;我们把**"互相关运算"称为卷积运算**(严格说,它们略有不同)
- 对于卷积核张量上的权重,我们称其为元素
- 因为卷积核是从数据中学习到的,所以不受计算方法的影响
填充(padding)和步幅(stride)
填充(padding)
- **适用场景:**应用多层卷积时,边缘像素丢失(丢失原因:使用小卷积核,对于任何单个卷积,我们可能丢失几个像素,但是随着应用连续卷积层的增多,累积丢失的像素数就多了)
padding(
主要)用于保持输入和输出特征图的空间尺寸一致- **填充具体做法:**在输入图像的边界填充元素(通常填充元素是0)
在许多情况下,我们设置= - 1 和,使 输入和输出具有相同的高度和宽度(这样可以在构建网络时更容易预测每个图层的输出形状):假设是奇数,在高度的2侧填充/2行;是偶数,在输入顶部填充[/2]行,在底部填充[/2]行(一种padding的做法)。同理,填充宽度的2侧。(可自己手动模拟卷积核移动,发现,这种填充方法确实是对的)
- 卷积神经网络中卷积核的高度和宽度通常为奇数 ,eg:1,3,5,7(选择奇数的好处 :保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列;也提供了书写上的便利),具体如下 :对于任何二维张量X,当满足:卷积核大小是奇数;所有边的填充行数和列数相同;输出与输入具有相同高度和宽度,则可以得出:输出Y[i,j]是通过以X[i,j]为中心,与卷积核进行互相关计算得到的。
具体数学例子:
**上图:**我们将3x 3输入填充到5x5,那么它的输出就增加为4x4。阴影部分是第一个输出元素以及用于输出计算的输入和核张量元素:0x0+0x1+0x2+0x3=0。
具体代码如下:
以上例子,我们默认卷积核每次滑动一个元素
步幅
- 有时候为了高效计算/缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素
- **步幅(stride):**每次滑动的元素数量
具体数学举例:
上图是 :垂直步幅为3,水平步幅为2的二维互相关运算。着色部分是输出元素以及用于输出计算的输入和内核张量元素:0x0+0x1+1x2+2x3=8、0x0+6x1+0x2+0x3=6
可以看到,为了计算输出中第一列的第二个元素和第一行的第二个元素,卷积窗口分别向下滑动三行和向右滑动两列。但是,当卷积窗口继续向右滑动两列时,没有输出,因为输入元素无法填充窗口(除非我们添加另一列填充)。
命名小规则:
填充(,): 当输入高度,宽度2侧的填充数量为,;当==p,填充是p
步幅(,):当高度,宽度上的步幅为,;当==s时,步幅为s
小tips:
- 默认情况下,填充为0,步幅为1
- 实践中,我们很少使用不一致的步幅/填充,即我们通常有=;=
- padding: 增加输出的高度和宽度,使用padding目的:使输出和输入具有相同的高度和宽度
- stride:减少输出的高和宽
- padding 和stride可用于有效调整数据维度
综上可知卷积的输出大小影响因素:输出形状取决于输入形状和卷积核的形状,填充(padding),步幅(stride)
多输入多输出通道
多输入通道
- 输入和卷积核的通道是要一致
- 假设输入的通道数为,则卷积核的通道数也为;如果卷积核的窗口形状是 X ,当=1,卷积核为 X 的二维张量;当 > 1,卷积核的每个(输入)通道都是形状是 X 的张量;将个张量连接在一起,就得到 X X 的卷积核
- 多输入通道卷积运算步骤: (假设输入和卷积核都有个通道)
- 对每个通道输入的二维张量和卷积核的二维张量进行互相关运算,
- 再对通道求和(将c;的结果相加)得到二维张量。
- 具体数学例子如下:
- **上图中:**阴影部分是第一个输出元素以及用于计算这个输出的输入和核张量元素:(1x1+2x2+4x3+5x4)+(0x0+1x1+3x2+4x3)=56。
具体代码如下:
多输出通道
- ,:输入,输出通道的数目;,:卷积核的高度,宽度;为每个输出通道创建一个形状为 X X 的卷积核张量,则卷积核的形状为 X X X
- 多输出通道运算:在互相关运算中,每个输出通道先获取所有输入通道,再以对应输出通道的卷积核计算出结果
- 具体代码如下:
1 X 1卷积层
- 1 X 1卷积使用了最小窗口,失去了卷积层特有能力--(在高度,宽度维度上)识别相邻元素相互作用的能力
- 1 X 1卷积的唯一计算发生在通道上
上图展示了使用1x1卷积核与3个输入通道和2个输出通道的互相关计算:
- 输入和输出具有相同的高度和宽度,输出中的每个元素都是从输入图像中同一位置的元素的线性组合。
- 将1x1卷积层看作在每个像素位置应用的全连接层,以个输入值转换为个输出值。(因为1X1卷积层仍然是一个卷积层,所以跨像素的权重是一致的。同时,1x1卷积层需要的权重维度 = X + 一个偏置。
- 具体代码如下:
小结:
- 多输入多输出通道可以用来扩展卷积层的模型
- 当以每像素为基础应用时,1X1卷积层相当于全连接层
- 1X1卷积层通常用于调整网络层的通道数量和控制模型复杂性
汇聚层
通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率,聚集信息,这样随着神经网络层叠的上升,每个神经元对其敏感的感受野(输入)就越大。
机器学习任务通常跟全局图像的问题有关(eg:图像是否包含一只猫呢?),所以**最后一层神经元应该对整个输入的全局敏感。**通过逐渐聚合信息,生成越来越粗糙的映射,最终实现学习全局表示的目标,同时将卷积图层的所有优势保留在中间层。
当检测较底层的特征时(eg:前面的图像边缘),我们通常希望这些特征保持某种程度上的平移不变性。eg:如果我们拍摄黑白之间轮廓清晰的图像x,并将整个图像向右移动一个像素,即z[i,j]=X[i,j+1],则新图像z的输出可能大不相同。而在现实中,随着拍摄角度的移动,任何物体几乎不可能发生在同一像素上。即使用三脚架拍摄一个静止的物体,由于快门的移动而引起的相机振动,可能会使所有物体左右移动一个像素(除了高端相机配备了特殊功能来解决这个问题)。
- 汇聚层(pooling)的2个目的:降低卷积层对位置的敏感性;降低对空间降采样表示的敏感性
最大汇聚层和平均汇聚层
- (与卷积层类似)汇聚层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,是固定形状的窗口(有时称为汇聚窗口),遍历每个位置计算一个输出
- 汇聚层不包含参数,我们通常计算汇聚窗口的所有元素的最大值或平均值(即,最大汇聚层(maximum pooling),平均汇聚层(average pooling)
- 汇聚层运算:与互相关运算符一样 ,汇聚窗口从输入张量的左上角开始,从左往右、从上往下的在输入张量内滑动。**在汇聚窗口到达的每个位置,它计算该窗口中输入子张量的最大值或平均值。**计算最大值或平均值是取决于使用了最大汇聚层还是平均汇聚层。
- **p x q汇聚层:**汇聚窗口形状为p x q的汇聚层;汇聚操作本身称为p x q汇集
- 具体数学例子如下:
回到本节开头提到的对象边缘检测示例,现在我们将使用卷积层的输出作为2x2最大汇聚的输入。设置卷积层输入为x,汇聚层输出为Y。无论 x[i, j]
、x[i, j+1]
、x[i+1, j]
和 x[i+1, j+1]
的值如何变化,只要它们的最大值相同,汇聚层的输出 Y[i, j]
就会是相同的。这意味着2x2最大汇聚层具有位置不变性,即它能够识别输入数据中的模式,即使这些模式在高度或宽度上移动了一个元素。
- 具体代码如下:
填充和步幅
- 默认情况下,深度学习框架中的步幅与汇聚窗口的大小相同。eg:如果我们使用形状为(3,3)的汇聚窗口,那么默认情况下,我们得到的步幅形状为(3,3)。
- 具体代码如下:
- 默认情况:
- 手动设置填充和步幅
- 手动设置汇聚窗口大小,填充,步幅
多个通道
- 汇聚层在每个输入通道上单独运算 ,则汇聚层的输出通道数与输入通道数相同
- 具体代码如下:
- 小tips:使用最大汇聚层以及大于1的步幅,可减少空间维度(eg:高度,宽度)
卷积神经网络(LeNet)
- **卷积层代替全连接层的一个好处:**模型更简洁,所需的参数更少
- 简介LeNet:
- 是最早发布的卷积神经网络之一
- 由AT&T贝尔实验室的研究员Yann LeCun在1989年提出的
- 目的:识别图像中的手写数字
- 当时LeNet成为了监督学习的主流方法
LeNet组成
- 总体来看,LeNet的组成:
- 卷积编码器: 由2个卷积层组成
- 全连接层密集块: 由3个全连接层组成
- 架构图如下:
- 具体小组成:
- 卷积块 :1个卷积层 ;1个sigmoid激活函数 ;平均汇聚层(ps:虽然ReLU和最大汇聚层更有效,但是在20世纪90年代,ReLU和最大汇聚层还没有出现))
- 卷积层 :5 x 5 卷积核 + 1个sigmoid激活函数 (这些卷积层将输入映射到多个二维特征输出,通常同时增加通道的数量)
- 第一个 卷积层有6 个输出通道;第二个卷积层 有16 个输出通道
- 每个 2 x 2池操作(步幅2)通过空间下采样将维数减少4倍
- ps:卷积的输出形状 由批量大小,通道数,高度,宽度决定
- 为了将卷积块的输出传递给稠密块,必须在小批量中展平每个样本:将4维输入=》全连接层所期望的二维 (~表示的第一维度索引小批量中的样本;第二维度给每个样本的平面向量表示)输入
- LeNet的稠密块 :3个全连接层:120, 84,10输出 (因为是在执行分类任务,所以输出层的10维对应于最后输出结果的数量)
- 具体代码如下:
ps:
- 在整个卷积块中,每一层特征的高度和宽度都比上一层减小了,具体如下:
- 第一个卷积层使用2个像素的padding,补偿 5 x 5卷积核导致的特征减少;
- 第二个卷积层没有填充,故而输出高度和宽度都减少4个像素;
- 随着层叠的上升,通道数量从输入时的1个,增加到第一个卷积层之后的6个,再到第二个卷积层之后的16个;
- 每个汇聚层的高度和宽度都减半
- 每个全连接层减少维数,最终输出一个与结果分类数相匹配的维数输出
- 我们通常对卷积层进行排列,逐渐降低其表示的空间分辨率,同时增加通道数,以构造高性能的卷积神经网络
- 在传统的卷积神经网络中,卷积块编码得到的表征在输出之前需由一个或多个全连接层进行处理。