|
本帖最后由 winter 于 2020-6-28 09:47 编辑
CNN原理
CNN网络是一种用来处理局部和整体相关性的计算网络结构,被应用在图像识别(CV)、自然语言处理(NLP)甚至是语音识别领域,因为图像数据具有显著的局部与整体关系,其在图像识别领域的应用获得了巨大的成功。
其实说白了CNN能在CV领域取得巨大成功最重要的就两个点:
局部连接的思想,是受启发于生物学里的视觉系统结构,视觉皮层的神经元就是仅用局部接受信息。对于二维图像,局部像素关联性较强。这种局部连接保证了训练后的滤波器能够对局部特征有最强的响应,使神经网络可以提取数据的局部特征;下图是一个很经典的图示,左边是全连接,右边是局部连接。
权值共享,即计算同一深度的神经元时采用的卷积核参数是共享的。
总结:这里就体现了卷积神经网络的奇妙之处,使用少量的参数,却依然能有非常出色的性能。上述仅仅是提取图像一种特征的过程。如果要多提取出一些特征,可以增加多个卷积核,不同的卷积核能够得到图像不同尺度下的特征,称之为特征图(feature map)。
CNN的结构
以图像分类任务为例,CNN一般包含5种类型的网络层次结构:
- 输入层(input)。一般输入层都是对原始图像经过数据的预处理之后的像素矩阵,往往数据预处理的越好,结果就越好。
- 卷积层(conv2d)。局部连接,权值共享,说白了就是做特征提取,卷积层越深提取到的特征就越丰富,分类也就越准确。
- 批归一化层(Batch Normalization)。虽然我们对输入数据进行了归一化处理,但是输入数据经过 σ(WX+b) 这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。
- 激活层(ReLU)。激活层(Activation Layer)负责对卷积层抽取的特征进行激活,由于卷积操作是由输入矩阵与卷积核矩阵进行相差的线性变化关系,需要激活层对其进行非线性的映射。激活层主要由激活函数组成,即在卷积层输出结果的基础上嵌套一个非线性函数,让输出的特征图具有非线性关系。
- 池化层(Pooling)。作用是对感受域内的特征进行筛选,提取区域内最具代表性的特征,能够有效地降低输出特征尺度,进而减少模型所需要的参数量。
- 全连接(FC)。负责对卷积神经网络学习提取到的特征进行汇总,将多维的特征输入映射为二维的特征输出通常低维度特征对应任务的学习目标。
CNN卷积层的基本参数
卷积层中需要用到卷积核(滤波器或特征检测器)与图像特征矩阵进行点乘运算,利用卷积核与对应的特征感受域进行划窗式运算时,需要设定卷积核对应的大小、步长、个数以及填充的方式。以最简单的例子进行说明:输入信号的形式为 ( N , Cin , H , W ),N 表示batch size,Cin表示channel个数,H,W 分别表示特征图的高和宽。
① in_channels(int) – 输入信号的通道
② out_channels(int) – 卷积产生的通道
③ kerner_size(int or tuple) - 卷积核的尺寸
④ stride(int or tuple, optional) - 卷积步长
⑤ padding(int or tuple, optional) - 输入的每一条边补充0的层数
⑥ dilation(int or tuple, optional) – 卷积核元素之间的间距
⑦ groups(int, optional) – 从输入通道到输出通道的阻塞连接数
⑧ bias(bool, optional) - 如果bias=True,添加偏置
参数存在如下关系:
常见问题总结:
1. 深度学习为什么要“深”?
前提:在一定范围内。
① 深度神经网络是一种特征递进式的学习算法,浅层的神经元直接从输入数据中学习一些低层次的简单特征,例如边缘、纹理等。而深层的特征则基于已学习到的浅层特征继续学习更高级的特征,从计算机的角度学习深层的语义信息。
② 在神经元数量相同的情况下,深层网络结构具有更大容量,分层组合带来的是指数级的表达空间,能够组合成更多不同类型的子结构,这样可以更容易地学习和表示各种特征。同时也意味着由激活函数带来的非线性变换的嵌套层数更多,就能构造更复杂的映射关系。
2. CNN不适合哪些问题?
这个问题可是困惑了我好久好久。最终得出一个结论:理论指导实践
CNN之所以这么火,在其原理上:局部连接,权值共享,所以多用于图像领域,效果显著。原因就在于这“局部连接”,图片是像素你可以理解是相互独立的,没有关联的。而像文本、音频等数据是相互依赖的,解决思路更多的是RNN(TextCNN,LSTM等)。
由于本人一开始跟风,上来就直接来了个ResNet-18来对截面数据进行分类,结果准确率低得可伶……
综上:CNN更适合CV领域,RNN更适合NLP领域,机器学习更适合日志数据领域。
3. batch size的设置与网络的关系?
批次大小指定一次性流入模型的数据样本个数,根据任务和计算性能限制判断实际取值,在一些图像任务中往往由于计算性能和存储容量限制只能选取较小的值。在相同迭代次数的前提下,数值越大模型越稳定,泛化能力越强,损失值曲线越平滑,模型也更快地收敛。
① 内存利用率提高了,大矩阵乘法的并行化效率提高。
② 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
③ 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小,损失值曲线越平滑,模型也更快地收敛。
4. kernel_size的大小设置?
卷积核的大小定义了卷积的感受野,在早期的卷积神经网络中(如AlexNet、ZFNet),用到了一些较大的卷积核(11×11和7×7),这种大卷积核反而会导致计算量大幅增加,不利于训练更深层的模型,相应的计算性能也会降低。后来的卷积神经网络(VGG、GoogLeNet等),发现通过堆叠2个3×3卷积核可以获得与5×5卷积核相同的感受视野,同时参数量会更少,因此可以认为,在大多数情况下通过堆叠较小的卷积核比直接采用单个更大的卷积核会更加有效。
但是,这并不是表示更大的卷积核就没有作用,在某些领域应用卷积神经网络时仍然可以采用较大的卷积核。譬如在自然语言处理领域,由于文本内容不像图像数据可以对特征进行很深层的抽象,往往在该领域的特征提取只需要较浅层的神经网络即可。在将卷积神经网络应用在自然语言处理领域时,通常都是较为浅层的卷积层组成,但是文本特征有时又需要有较广的感受域让模型能够组合更多的特征(如词组和字符),此时直接采用较大的卷积核将是更好的选择。
总结:
- kernel_size不是越大越好,对于CV领域,应采取较小卷积核(3x3)来加深网络结构;对于NLP领域,较大卷积核效果更佳。
- 单独的1×1极小卷积核只能用作分离卷积而不能对输入的原始特征进行有效的组合,极大的卷积核通常会组合过多的无意义特征从而浪费了大量的计算资源。
5. 每层卷积是否只能用一种尺寸的卷积核?
事实上,同一层特征图可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,得到的新特征可以看作不同感受域提取的特征组合,相比于单一卷积核会有更强的表达能力。
|
|