在传统的前馈神经网络中,输入层的每一个神经元都与下一层的每一个输入神经元相连,我们称之为FC(fully-connected,全连接)层。但是,在CNNs中,我们直到网络中的最后一层才使用FC层。因此,我们可以将CNN定义为神经网络,该网络在专用的“卷积(convolutional)”层中交换,代替网络中至少一个层的“FC”层。
一个激活函数例如ReLU将紧跟在卷积层后处理,且这种卷积==>激活的处理过程将持续(中间伴随着其它层类型的处理,这些层帮助减少输入值的长宽大小且帮助降低过拟合)直到到达网络的最后层次,然后我们实施一到两个FC层获得最终的输出分类。
CNNs的每一层通常应用不同的过滤器集合,通常几百上千个,将这些结果组合起来,输入到下一层。在训练过程中,CNN自动的学习这些过滤器的值。
在图像分类背景下,我们的CNN可以用来:在第一层中从原始像素数据检测边缘、在第二层中使用这些边缘检测形状、在网络的更高层中使用这些形状检测更高级的特征,如面部结构、汽车部件等。在CNN的最后一层,使用这些更高层的特征做出关于图像内容的预测。
实际上CNN给我们带来两个关键好处:局部不变性和组合性(local invariance and compositionality)。局部不变性的概念允许我们将分类一副图像看作是包含特定目标的过程,而不管图像中该目标出现在什么地方。我们通过“pooling layer”的使用来获得这种局部不变性,pooling层用对特定过滤器的高响应来标识输入卷(input volume)的区域。第二个优势是组合性,每个过滤器都将底层特征的部分组合到一起构成高层表示,这种组合允许我们的网络可以在网络的更深层次上学习到更富有的特征。例如,我们的网络可以从原始像素构建边缘、由边缘构建形状、由形状构建复杂物体,所有这些都在训练过程中自然地自动发生。这种从底层构建高层特征的概念正是CNN应用于计算机视觉的强大原因。
一、CNN的引入
在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的 28×28 的手写数字图片,输入层的神经元就有784个,如下图所示:
若在中间只使用一层隐藏层,参数 ww 就有 784×15=11760 多个;若输入的是28×28 带有颜色的RGB格式的手写数字图片,输入神经元就有28×28×3=2352个…… 。这很容易看出使用全连接神经网络处理图像中的需要训练参数过多的问题。
而在卷积神经网络(Convolutional Neural Network,CNN)中,卷积层的神经元只与前一层的部分神经元节点相连,即它的神经元间的连接是非全连接的,且同一层中某些神经元之间的连接的权重 w 和偏移 b 是共享的(即相同的),这样大量地减少了需要训练参数的数量。
卷积神经网络CNN的结构一般包含这几个层:
输入层:用于数据的输入
卷积层:使用卷积核进行特征提取和特征映射
激励层:由于卷积也是一种线性运算,因此需要增加非线性映射
池化层:进行下采样,对特征图稀疏处理,减少数据运算量。
全连接层:通常在CNN的尾部进行重新拟合,减少特征信息的损失
输出层:用于输出结果
当然中间还可以使用一些其他的功能层:
归一化层(Batch Normalization):在CNN中对特征的归一化
切分层:对某些(图片)数据的进行分区域的单独学习
融合层:对独立进行特征学习的分支进行融合
二、CNN的层次结构
输入层:
在CNN的输入层中,(图片)数据输入的格式 与 全连接神经网络的输入格式(一维向量)不太一样。CNN的输入层的输入格式保留了图片本身的结构。
对于黑白的 28×28 的图片,CNN的输入是一个 28×28的二维神经元,如下图所示:
而对于RGB格式的28×28图片,CNN的输入则是一个 3×28×28 的三维神经元(RGB中的每一个颜色通道都有一个 28×28 的矩阵),如下图所示:
卷积层:
在卷积层中有几个重要的概念:
local receptive fields(感受视野)
shared weights(共享权值)
假设输入的是一个 28×28 的的二维神经元,我们定义5×5 的 一个 local receptive fields(感受视野),即 隐藏层的神经元与输入层的5×5个神经元相连,这个5*5的区域就称之为Local Receptive Fields,如下图所示:
可类似看作:隐藏层中的神经元 具有一个固定大小的感受视野去感受上一层的部分特征。在全连接神经网络中,隐藏层中的神经元的感受视野足够大乃至可以看到上一层的所有特征。
而在卷积神经网络中,隐藏层中的神经元的感受视野比较小,只能看到上一次的部分特征,上一层的其他特征可以通过平移感受视野来得到同一层的其他神经元,由同一层其他神经元来看:
设移动的步长为1:从左到右扫描,每次移动 1 格,扫描完之后,再向下移动一格,再次从左到右扫描。
可看出 卷积层的神经元是只与前一层的部分神经元节点相连,每一条相连的线对应一个权重 w 。
一个感受视野带有一个卷积核,我们将 感受视野 中的权重 w 矩阵称为 卷积核 ;将感受视野对输入的扫描间隔称为步长(stride);当步长比较大时(stride>1),为了扫描到边缘的一些特征,感受视野可能会“出界”,这时需要对边界扩充(pad),边界扩充可以设为 0 或 其他值。步长 和 边界扩充值的大小由用户来定义。
卷积核的大小由用户来定义,即定义的感受视野的大小;卷积核的权重矩阵的值,便是卷积神经网络的参数,为了有一个偏移项 ,卷积核可附带一个偏移项 b ,它们的初值可以随机来生成,可通过训练进行变化。
因此 感受视野 扫描时可以计算出下一层神经元的值为
对下一层的所有神经元来说,它们从不同的位置去探测了上一层神经元的特征。
我们将通过 一个带有卷积核的感受视野 扫描生成的下一层神经元矩阵 称为 一个feature map (特征映射图),如下图的右边便是一个 feature map:
因此在同一个 feature map 上的神经元使用的卷积核是相同的,因此这些神经元 shared weights,共享卷积核中的权值和附带的偏移。一个 feature map 对应 一个卷积核,若我们使用 3 个不同的卷积核,可以输出3个feature map:(感受视野:5×5,步长stride:1)
因此在CNN的卷积层,我们需要训练的参数大大地减少到了 (5×5+1)×3=78个。
假设输入的是 28×28 的RGB图片,即输入的是一个 3×28×28 的的二维神经元,这时卷积核的大小不只用长和宽来表示,还有深度,感受视野也对应的有了深度,如下图所示:
由图可知:感受视野: 3×2×2 ; 卷积核: 3×2×2 ,深度为3;下一层的神经元的值为:. 卷积核的深度和感受视野的深度相同,都由输入数据来决定,长宽可由自己来设定,数目也可以由自己来设定,一个卷积核依然对应一个 feature map 。
注:“stride=1”表示在长和宽上的移动间隔都为1,即 stridewidth=1 且 strideheight=1
激励层:
激励层主要对卷积层的输出进行一个非线性映射,因为卷积层的计算还是一种线性计算。使用的激励函数一般为ReLu函数:
卷积层和激励层通常合并在一起称为“卷积层”。
池化层:
当输入经过卷积层时,若感受视野比较小,布长stride比较小,得到的feature map (特征图)还是比较大,可以通过池化层来对每一个 feature map 进行降维操作,输出的深度还是不变的,依然为 feature map 的个数。
池化层也有一个“池化视野(filter)”来对feature map矩阵进行扫描,对“池化视野”中的矩阵值进行计算,一般有两种计算方式:
Max pooling:取“池化视野”矩阵中的最大值
Average pooling:取“池化视野”矩阵中的平均值
扫描的过程中同样地会涉及的扫描布长stride,扫描方式同卷积层一样,先从左到右扫描,结束则向下移动布长大小,再从左到右。如下图示例所示:
其中“池化视野”filter: 2×2;步长stride:2
最后可将 3 个 24×24 的 feature map 下采样得到 3 个 24×24 的特征矩阵:
归一化层:
1. Batch Normalization
Batch Normalization(批量归一化)实现了在神经网络层的中间进行预处理的操作,即在上一层的输入归一化处理后再进入网络的下一层,这样可有效地防止“梯度弥散”,加速网络训练。
Batch Normalization具体的算法如下图所示:
每次训练时,取 batch_size 大小的样本进行训练,在BN层中,将一个神经元看作一个特征,batch_size 个样本在某个特征维度会有 batch_size 个值,然后在每个神经元 xi 维度上的进行这些样本的均值和方差,通过公式得到 xi,再通过参数 γ 和 β 进行线性映射得到每个神经元对应的输出 yi 。在BN层中,可以看出每一个神经元维度上,都会有一个参数 γ 和 β ,它们同权重w一样可以通过训练进行优化。
在卷积神经网络中进行批量归一化时,一般对 未进行ReLu激活的 feature map进行批量归一化,输出后再作为激励层的输入,可达到调整激励函数偏导的作用。
一种做法是将 feature map 中的神经元作为特征维度,参数 γ 和 β 的数量和则等于 2×fmapwidth×fmaplength×fmapnum,这样做的话参数的数量会变得很多;
另一种做法是把 一个 feature map 看做一个特征维度,一个 feature map 上的神经元共享这个 feature map的 参数 γ 和 β ,参数 γ 和 β 的数量和则等于 2×fmapnum,计算均值和方差则在batch_size个训练样本在每一个feature map维度上的均值和方差。
注:fmapnum指的是一个样本的feature map数量,feature map 跟神经元一样也有一定的排列顺序。
Batch Normalization 算法的训练过程和测试过程的区别:
在训练过程中,我们每次都会将 batch_size 数目大小的训练样本 放入到CNN网络中进行训练,在BN层中自然可以得到计算输出所需要的 均值 和 方差 ;
而在测试过程中,我们往往只会向CNN网络中输入一个测试样本,这是在BN层计算的均值和方差会均为 0,因为只有一个样本输入,因此BN层的输入也会出现很大的问题,从而导致CNN网络输出的错误。所以在测试过程中,我们需要借助训练集中所有样本在BN层归一化时每个维度上的均值和方差,当然为了计算方便,我们可以在 batch_num 次训练过程中,将每一次在BN层归一化时每个维度上的均值和方差进行相加,最后再进行求一次均值即可。
2. Local Response Normalization
近邻归一化(Local Response Normalization)的归一化方法主要发生在不同的相邻的卷积核(经过ReLu之后)的输出之间,即输入是发生在不同的经过ReLu之后的 feature map 中。
LRN的公式如下:
其中:
a(i,x,y) 表示第i个卷积核的输出(经过ReLu层)的feature map上的 (x,y) 位置上的值。
b(i,x,y) 表示 a(i,x,y)经LRN后的输出。
N表示卷积核的数量,即输入的 feature map的个数。
n 表示近邻的卷积核(或feature map)个数,由用户决定。
k,α,β是超参数,由用户自己调整或决定。
与BN的区别:BN依据mini batch的数据,近邻归一仅需要自己来决定,BN训练中有学习参数;BN归一化主要发生在不同的样本之间,LRN归一化主要发生在不同的卷积核的输出之间。
切分层:
在一些应用中,需要对图片进行切割,独立地对某一部分区域进行单独学习。这样可以对特定部分进行通过调整 感受视野 进行力度更大的学习。
融合层:
融合层可以对切分层进行融合,也可以对不同大小的卷积核学习到的特征进行融合。
例如在GoogleLeNet 中,使用多种分辨率的卷积核对目标特征进行学习,通过 padding 使得每一个 feature map 的长宽都一致,之后再将多个 feature map 在深度上拼接在一起:
融合的方法有几种,一种是特征矩阵之间的拼接级联,另一种是在特征矩阵进行运算 (+,−,x,max,conv)。
全连接层和输出层
直观地说、FC 是连接卷积层和普通层的普通层,它将从父层(卷积层)那里得到的高维数据铺平以作为输入、进行一些非线性变换(用激活函数作用)、然后将结果输进跟在它后面的各个普通层构成的系统中。简单来说就是将上层抽取出来的特征向量在里面做一个权重计算,输出各个类别的概率。
全连接层主要对特征进行重新拟合,减少特征信息的丢失;输出层主要准备做好最后目标结果的输出。图片来自StackExchange
先看一下计算方式:全连接层将权重矩阵与输入向量相乘再加上偏置,将n个(−∞,+∞)的实数映射为K个(−∞,+∞)的实数(分数);Softmax将K个(−∞,+∞)的实数映射为K个(0,1)的实数(概率),同时保证它们之和为1。
从加权角度、模版匹配角度与几何角度对其进行理解
加权角度
通常将网络最后一个全连接层的输入,即上面的x,视为网络从输入数据提取到的特征。
将wj视为第j类下特征的权重,即每维特征的重要程度、对最终分数的影响程度,通过对特征加权求和得到每个类别的分数,再经过Softmax映射为概率。
模板匹配
也可以将wj视为第j类的特征模板,特征与每个类别的模板进行模版匹配,得到与每个类别的相似程度,然后通过Softmax将相似程度映射为概率。如下图所示,图片素材来自CS231n。
如果是只有一个全连接层的神经网络(相当于线性分类器),将每个类别的模板可以直接可视化如下,图片素材来自CS231n。
如果是多层神经网络,最后一个全连接层的模板是特征空间的模板,可视化需要映射回输入空间。
几何角度
仍将全连接层的输入x视为网络从输入数据提取到的特征,一个特征对应多维空间中的一个点。
如果是二分类问题,使用线性分类器y^=w⋅x+b,若y^>0即位于超平面的上方,则为正类,y^<0则为负类。
多分类怎么办?为每个类别设置一个超平面,通过多个超平面对特征空间进行划分,一个区域对应一个类别。wjwj为每个超平面的法向量,指向正值的方向,超平面上分数为0,如果求特征与每个超平面间的距离(带正负)为
dj=wj⋅x+bj||wj||
而分数zj=||wj||d,再进一步通过Softmax映射为概率。
如下图所示:
Softmax的作用
相比(−∞,+∞)范围内的分数,概率天然具有更好的可解释性,让后续取阈值等操作顺理成章。
经过全连接层,我们获得了K个类别(−∞,+∞)范围内的分数zj,为了得到属于每个类别的概率,先通过ezjezj将分数映射到(0,+∞),然后再归一化到(0,1),这便是Softmax的思想:
为什么需要有全连接层:
卷积块中的卷积的基本单元是局部视野,用它类比我们的眼睛的话、就是将外界信息翻译成神经信号的工具,它能将接收的输入中的各个特征提取出来;至于 NN(神经网络)块、则可以类比我们的神经网络(甚至说、类比我们的大脑),它能够利用卷积块得到的信号(特征)来做出相应的决策。概括地说、CNN 视卷积块为“眼”而视 NN 块为“脑”,眼脑结合则决策自成。
用机器学习的术语来说、则卷积块为“特征提取器”而 NN 块为“决策分类器”,
而他的作用就是:全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用
而事实上,CNN 的强大之处其实正在于其卷积块强大的特征提取能力上、NN 块甚至可以说只是用于分类的一个附属品而已。我们完全可以利用 CNN 将特征提取出来后、用之前介绍过的决策树、支持向量机等等来进行分类这一步而无须使用 NN 块。
unet网络的最后一层是一个 1 * 1 的卷积层,通过这一操作可以将64通道的特征向量转换为所需要的分类结果的数量(例如2分类)
原文链接:https://blog.csdn.net/cxmscb/article/details/71023576