在初次学习深度学习的时候,必不可少的接触卷积神经网络(CNN),本篇文章就记录一下通过应用CNN来做分类时,自己遇到的一些问题和踩到的一些坑。
CNN网络是一种用来处理局部和整体相关性的计算网络结构,被应用在图像识别(CV)、自然语言处理(NLP)甚至是语音识别领域,因为图像数据具有显著的局部与整体关系,其在图像识别领域的应用获得了巨大的成功。
其实说白了CNN能在CV领域取得巨大成功最重要的就两个点:
局部连接
局部连接的思想,是受启发于生物学里的视觉系统结构,视觉皮层的神经元就是仅用局部接受信息。对于二维图像,局部像素关联性较强。这种局部连接保证了训练后的滤波器能够对局部特征有最强的响应,使神经网络可以提取数据的局部特征; 下图是一个很经典的图示,左边是全连接,右边是局部连接。
权值共享
权值共享,即计算同一深度的神经元时采用的卷积核参数是共享的。
以图像分类任务为例,CNN一般包含5种类型的网络层次结构:
卷积层中需要用到卷积核(滤波器或特征检测器)与图像特征矩阵进行点乘运算,利用卷积核与对应的特征感受域进行划窗式运算时,需要设定卷积核对应的大小、步长、个数以及填充的方式。以最简单的例子进行说明:输入信号的形式为 ( N , C i n , H , W ) (N,C_in ,H,W) (N,Cin,H,W), N N N表示batch size, C i n C_in Cin表示channel个数, H , W H,W 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,添加偏置参数存在如下关系:
input: ( N , C i n , H i n , W i n ) (N,C_in,H_in,W_in) (N,Cin,Hin,Win)
output: ( N , C o u t , H o u t , W o u t ) (N,C_out,H_out,W_out) (N,Cout,Hout,Wout)
H o u t = f l o o r ( ( H i n + 2 p a d d i n g [ 0 ] − d i l a t i o n [ 0 ] ( k e r n e r l s i z e [ 0 ] − 1 ) − 1 ) / s t r i d e [ 0 ] + 1 ) H_{out}=floor((H_{in}+2padding[0]-dilation[0](kernerl_size[0]-1)-1)/stride[0]+1) Hout=floor((Hin+2padding[0]−dilation[0](kernerlsize[0]−1)−1)/stride[0]+1)
W o u t = f l o o r ( ( W i n + 2 p a d d i n g [ 1 ] − d i l a t i o n [ 1 ] ( k e r n e r l s i z e [ 1 ] − 1 ) − 1 ) / s t r i d e [ 1 ] + 1 ) W_{out}=floor((W_{in}+2padding[1]-dilation[1](kernerl_size[1]-1)-1)/stride[1]+1) Wout=floor((Win+2padding[1]−dilation[1](kernerlsize[1]−1)−1)/stride[1]+1)
前提:在一定范围内。
这个问题可是困惑了我好久好久。最终得出一个结论:理论指导实践
CNN之所以这么火,在其原理上:局部连接,权值共享,所以多用于图像领域,效果显著。原因就在于这“局部连接”,图片是像素你可以理解是相互独立的,没有关联的。而像文本、音频等数据是相互依赖的,解决思路更多的是RNN(TextCNN,LSTM等)。
由于本人一开始跟风,上来就直接来了个ResNet-18来对截面数据进行分类,结果准确率低得可伶……
综上:CNN跟适合CV领域,RNN跟适合NLP领域,机器学习更适合日志数据领域。
批次大小指定一次性流入模型的数据样本个数,根据任务和计算性能限制判断实际取值,在一些图像任务中往往由于计算性能和存储容量限制只能选取较小的值。在相同迭代次数的前提下,数值越大模型越稳定,泛化能力越强,损失值曲线越平滑,模型也更快地收敛。
卷积核的大小定义了卷积的感受野,在早期的卷积神经网络中(如AlexNet、ZFNet),用到了一些较大的卷积核(11×11和7×7),这种大卷积核反而会导致计算量大幅增加,不利于训练更深层的模型,相应的计算性能也会降低。后来的卷积神经网络(VGG、GoogLeNet等),发现通过堆叠2个3×3卷积核可以获得与5×5卷积核相同的感受视野,同时参数量会更少,因此可以认为,在大多数情况下通过堆叠较小的卷积核比直接采用单个更大的卷积核会更加有效。
但是,这并不是表示更大的卷积核就没有作用,在某些领域应用卷积神经网络时仍然可以采用较大的卷积核。譬如在自然语言处理领域,由于文本内容不像图像数据可以对特征进行很深层的抽象,往往在该领域的特征提取只需要较浅层的神经网络即可。在将卷积神经网络应用在自然语言处理领域时,通常都是较为浅层的卷积层组成,但是文本特征有时又需要有较广的感受域让模型能够组合更多的特征(如词组和字符),此时直接采用较大的卷积核将是更好的选择。
总结:
事实上,同一层特征图可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,得到的新特征可以看作不同感受域提取的特征组合,相比于单一卷积核会有更强的表达能力。
批归一化(BN)算法的优点:
选择一个适合的激活函数并不容易,需要考虑很多因素,通常的做法是,如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者测试集上进行评价。然后看哪一种表现的更好,就去使用它。
以下是常见的选择情况:
池化操作通常也叫做子采样或降采样,在构建卷积神经网络时,往往会用在卷积层之后,通过池化来降低卷积层输出的特征维度,有效减少网络参数的同时还可以防止过拟合现象。
池化操作可以降低图像维度的原因,本质上是因为图像具有一种“静态性”的属性,这个意思是说在一个图像区域有用的特征极有可能在另一个区域同样有用。因此,为了描述一个大的图像,很直观的想法就是对不同位置的特征进行聚合统计。例如,可以计算图像在固定区域上特征的平均值 (或最大值)来代表这个区域的特征。
注意:但是池化层也不是越多越好,根据其原理可以发现,池化层增多在某种意义上会导致原始图像信息的算是,就像平均和最大并不完全能代表整体。
大多数神经网络中高层网络通常会采用全连接层(Full Connected Layer),通过多对多的连接方式对特征进行全局汇总,可以有效地提取全局信息。但是全连接的方式需要大量的参数,是神经网络中最占资源的部分之一,因此可能具需要使用局部连接(Local Connected Layer),仅在局部区域范围内产生神经元连接,能够有效地减少参数量。
1.为什么随着网络结构的加深,模型的性能为什么会提升过后降低?
2.对于网络结构的建立,conv2d、BatchNorm2d、ReLU、MaxPooling等应该如何搭配?
3.CNN网络结构中卷积核的大小,channel的熟练设置或分布有什么依据可言?
……
……
……