CNN网络是一种用来处理局部和整体相关性的计算网络结构,被应用在图像识别(CV)、自然语言处理(NLP)甚至是语音识别领域,因为图像数据具有显著的局部与整体关系,其在图像识别领域的应用获得了巨大的成功。
其实说白了CNN能在CV领域取得巨大成功最重要的就两个点:
局部连接
局部连接的思想,是受启发于生物学里的视觉系统结构,视觉皮层的神经元就是仅用局部接受信息。对于二维图像,局部像素关联性较强。这种局部连接保证了训练后的滤波器能够对局部特征有最强的响应,使神经网络可以提取数据的局部特征;下图是一个很经典的图示,左边是全连接,右边是局部连接。
权值共享
权值共享,即计算同一深度的神经元时采用的卷积核参数是共享的。
以图像分类任务为例,CNN一般包含5种类型的网络层次结构:
输入层(input)。一般输入层都是对原始图像经过数据的预处理之后的像素矩阵,往往数据预处理的越好,结果就越好。
卷积层(conv2d)。局部连接,权值共享,说白了就是做特征提取,卷积层越深提取到的特征就越丰富,分类也就越准确。
批归一化层(Batch Normalization)。虽然我们对输入数据进行了归一化处理,但是输入数据经过 σ(WX+b) 这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。
激活层(ReLU)。激活层(Activation Layer)负责对卷积层抽取的特征进行激活,由于卷积操作是由输入矩阵与卷积核矩阵进行相差的线性变化关系,需要激活层对其进行非线性的映射。激活层主要由激活函数组成,即在卷积层输出结果的基础上嵌套一个非线性函数,让输出的特征图具有非线性关系。
池化层(Pooling)。作用是对感受域内的特征进行筛选,提取区域内最具代表性的特征,能够有效地降低输出特征尺度,进而减少模型所需要的参数量。
前提:在一定范围内。
② 在神经元数量相同的情况下,深层网络结构具有更大容量,分层组合带来的是指数级的表达空间,能够组合成更多不同类型的子结构,这样可以更容易地学习和表示各种特征。同时也意味着由激活函数带来的非线性变换的嵌套层数更多,就能构造更复杂的映射关系。
这个问题可是困惑了我好久好久。最终得出一个结论:理论指导实践
CNN之所以这么火,在其原理上:局部连接,权值共享,所以多用于图像领域,效果显著。原因就在于这“局部连接”,图片是像素你可以理解是相互独立的,没有关联的。而像文本、音频等数据是相互依赖的,解决思路更多的是RNN(TextCNN,LSTM等)。
由于本人一开始跟风,上来就直接来了个ResNet-18来对截面数据进行分类,结果准确率低得可伶……
综上:CNN更适合CV领域,RNN更适合NLP领域,机器学习更适合日志数据领域。
批次大小指定一次性流入模型的数据样本个数,根据任务和计算性能限制判断实际取值,在一些图像任务中往往由于计算性能和存储容量限制只能选取较小的值。在相同迭代次数的前提下,数值越大模型越稳定,泛化能力越强,损失值曲线越平滑,模型也更快地收敛。
① 内存利用率提高了,大矩阵乘法的并行化效率提高。
② 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
③ 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小,损失值曲线越平滑,模型也更快地收敛。
卷积核的大小定义了卷积的感受野,在早期的卷积神经网络中(如AlexNet、ZFNet),用到了一些较大的卷积核(11×11和7×7),这种大卷积核反而会导致计算量大幅增加,不利于训练更深层的模型,相应的计算性能也会降低。后来的卷积神经网络(VGG、GoogLeNet等),发现通过堆叠2个3×3卷积核可以获得与5×5卷积核相同的感受视野,同时参数量会更少,因此可以认为,在大多数情况下通过堆叠较小的卷积核比直接采用单个更大的卷积核会更加有效。
但是,这并不是表示更大的卷积核就没有作用,在某些领域应用卷积神经网络时仍然可以采用较大的卷积核。譬如在自然语言处理领域,由于文本内容不像图像数据可以对特征进行很深层的抽象,往往在该领域的特征提取只需要较浅层的神经网络即可。在将卷积神经网络应用在自然语言处理领域时,通常都是较为浅层的卷积层组成,但是文本特征有时又需要有较广的感受域让模型能够组合更多的特征(如词组和字符),此时直接采用较大的卷积核将是更好的选择。
总结:
单独的1×1极小卷积核只能用作分离卷积而不能对输入的原始特征进行有效的组合,极大的卷积核通常会组合过多的无意义特征从而浪费了大量的计算资源。
事实上,同一层特征图可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,得到的新特征可以看作不同感受域提取的特征组合,相比于单一卷积核会有更强的表达能力。
批归一化(BN)算法的优点:
减少了人为选择参数。在某些情况下可以取消 dropout 和 L2 正则项参数,或者采取更小的 L2 正则项约束参数;
减少了对学习率的要求。现在我们可以使用初始很大的学习率或者选择了较小的学习率,算法也能够快速训练收敛;
可以不再使用局部响应归一化。BN 本身就是归一化网络(局部响应归一化在 AlexNet 网络中存在)
破坏原来的数据分布,一定程度上缓解过拟合(防止每批训练中某一个样本经常被挑选到,文献说这个可以提高 1% 的精度)。
减少梯度消失,加快收敛速度,提高训练精度。
选择一个适合的激活函数并不容易,需要考虑很多因素,通常的做法是,如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者测试集上进行评价。然后看哪一种表现的更好,就去使用它。
① 如果输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,然后其它的所有单元都选择 Relu 函数。
② 如果在隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数,但 Relu的一个优点是:当是负值的时候,导数等于 0。
③ sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
④ tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
⑤ ReLu 激活函数:最常用的默认函数,如果不确定用哪个激活函数,就使用 ReLu 或者 Leaky ReLu(GANs),再去尝试其他的激活函数。如果遇到了一些死的神经元,我们可以使用 Leaky ReLU 函数。
池化操作通常也叫做子采样或降采样,在构建卷积神经网络时,往往会用在卷积层之后,通过池化来降低卷积层输出的特征维度,有效减少网络参数的同时还可以防止过拟合现象。
池化操作可以降低图像维度的原因,本质上是因为图像具有一种“静态性”的属性,这个意思是说在一个图像区域有用的特征极有可能在另一个区域同样有用。因此,为了描述一个大的图像,很直观的想法就是对不同位置的特征进行聚合统计。例如,可以计算图像在固定区域上特征的平均值 (或最大值)来代表这个区域的特征。
注意:但是池化层也不是越多越好,根据其原理可以发现,池化层增多在某种意义上会导致原始图像信息的损失,就像平均和最大并不完全能代表整体。
大多数神经网络中高层网络通常会采用全连接层(Full Connected Layer),通过多对多的连接方式对特征进行全局汇总,可以有效地提取全局信息。但是全连接的方式需要大量的参数,是神经网络中最占资源的部分之一,因此可能最需要使用局部连接(Local Connected Layer),仅在局部区域范围内产生神经元连接,能够有效地减少参数量。
原文链接:https://blog.csdn.net/qq_40195360/article/details/90233251
关于 Imagination微信号