卷积网络图像分类特征提取部分调参技巧(pytorch)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积网络图像分类特征提取部分调参技巧(pytorch)相关的知识,希望对你有一定的参考价值。

参考技术A

  调参是深度学习过程中无法避免的一部分。不管是重现别人的论文还是对新的算法进行实现都要经历这一过程。为什么相似的网络结构下效果会差那么多呢?这就是调参的魅力了。对于简单一些的数据集,调参甚至能让测试集准确率提高百分之二十以上。根据我自己的调参经验,总结出以下技巧, 不定期更新
注:只是自己的经验记录,不一定全面也不一定准确。
@[toc]

  从数据处理到模型建立再到模型训练,都有一系列的参数可以调整,这些都可能是影响最终结果的因素。

  数据增强虽然实际上是在数据预处理过程中实现的,但是作为提高准确率的重要方法,还是把它单独列了出来。

  常见的数据增强方法有很多,网上资料也不少,我就不多赘述了。我主要用的数据增强方法是随机裁剪和随机旋转,需要强调的也只有一点。

  当然不同的问题需要不同的损失函数,一般在分类问题上我用的都是交叉熵损失函数 CrossEntropyLoss() 。有大神告诉我添加 ContrastiveLoss() 也可以对结果有帮助,我还没有试过。

   SGD 优化器似乎通常是提高效果的最佳选择,虽然有时收敛较慢。但是我在实验过程中发现 Adam 对效果的提高会更好,有时候甚至比 SGD 的准确率要高10%。应该也是需要具体问题具体分析,看哪个优化器适合了。

用卷积神经网络提取图像特征

参考技术A 前面讲到的都是基于知识的图像特征提取方法,除此之外还有另一条技术路线——基于深度学习的图像特征提取。

人在认知图像时是分层抽象的,首先理解的是颜色和亮度,然后是边缘、角点、直线等局部细节特征,接下来是纹理、几何形状等更复杂的信息和结构,最后形成整个物体的概念。
视觉神经科学(Visual Neuroscience)对于视觉机理的研究验证了这一结论,动物大脑的视觉皮层具有分层结构。眼睛将看到的景象成像在视网膜上,视网膜把光学信号转换成电信号,传递到大脑的视觉皮层(Visual cortex),视觉皮层是大脑中负责处理视觉信号的部分。1959年,David和Wiesel进行了一次实验,他们在猫的大脑初级视觉皮层内插入电极,在猫的眼前展示各种形状、空间位置、角度的光带,然后测量猫大脑神经元放出的电信号。实验发现,不同的神经元对各种空间位置和方向偏好不同。这一成果后来让他们获得了诺贝尔奖。
目前已经证明,视觉皮层具有层次结构。从视网膜传来的信号首先到达初级视觉皮层(primary visual cortex),即V1皮层。V1皮层简单神经元对一些细节、特定方向的图像信号敏感。V1皮层处理之后,将信号传导到V2皮层。V2皮层将边缘和轮廓信息表示成简单形状,然后由V4皮层中的神经元进行处理,它颜色信息敏感。复杂物体最终在IT皮层(inferior temporal cortex)被表示出来。

卷积神经网络可以看成是上面这种机制的简单模仿。它由多个卷积层构成,每个卷积层包含多个卷积核,用这些卷积核从左向右、从上往下依次扫描整个图像,得到称为特征图(feature map)的输出数据。网络前面的卷积层捕捉图像局部、细节信息,有小的感受野,即输出图像的每个像素只利用输入图像很小的一个范围。后面的卷积层感受野逐层加大,用于捕获图像更复杂,更抽象的信息。经过多个卷积层的运算,最后得到图像在各个不同尺度的抽象表示。

顾名思义,卷积层由一组卷积单元(又称"卷积核")组成,可以把这些卷积单元理解为过滤器,每个过滤器都会提取一种特定的特征,方法参见 图像卷积 。

卷积层的过滤器负责从图像中查找规律,过滤器越多则参数越多,这意味着卷积层的维度可能很庞大。我们需要一种方法来降低维数,这就是卷积网络中的池化层(又名"下采样层")所扮的角色。

池化主要有3种形式:一般池化,重叠池化和金字塔池化。

池化窗口的尺寸为n*n,一般情况下池化窗口都是正方形的。步长(stride)等于n。此时池化窗口之间是没有重叠的。对于超出数字矩阵范围的,只计算范围内的或者范围外的用0填充再计算。又可以分为最大值池化,均值池化。

池化窗口范围内的最大值作为采样的输出值。
假如输入是一个4×4矩阵,执行最大池化是一个2×2矩阵,每次滑动2步。执行过程非常简单,把4×4的输入拆分成不同的区域,把这些区域用不同颜色来标记。对于2×2的输出,输出的每个元素都是其对应颜色区域中的最大元素值。

普通均值池化就是将池化窗口范围内的平均值作为采样的输出值。这种池化不如最大池化常用。

池化窗口之间有重叠。也就是步长大于等于1小于n,计算和一般池化是一样的。

空间金字塔池化(Spatial Pyramid Pooling,简称SPP)可以将尺寸大小不一样的图片转换为同样的尺寸。
SPP首先把图片看成1块,对这1块进行最大值池化,得到1个值,分成4块,对这4块分别进行最大值池化,得到4个值;分成16块,对这16块分别进行最大值池化,得到16个值,以此类推。这样就可以保证对于不同尺寸的图片而言,最终得到的值的个数是一样的。因为是最大值池化,超出范围的用不用0填充不会影响结果。

直接对原始图像做卷积,会存在两个问题。一是每次卷积后图像(特征图)都会缩小,这样卷不了几次就没了; 二是相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少,导致边缘的信息易于丢失。
为了解决这个问题,我们可以采用填充的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。

比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。
能够保证输入的数据和输出的数据具有相同的空间尺寸,假设零填充个数为p,卷积核为f * f,卷积核滑动步长为s,则p应设置为

假设原始输入图像为m * m,输出图像为n * n,零填充个数为p,卷积核为f * f,卷积核滑动步长为s,则输出尺寸为

假设输入图像为(m,m,d),其中d为图像深度(通道数),卷积核为f * f,卷积核个数为n,则weight个数为

bias个数:

池化层很少使用零填充。假设原始输入图像为m * m,输出图像为n * n,卷积核为f * f,卷积核滑动步长为s,则输出尺寸为

以上是关于卷积网络图像分类特征提取部分调参技巧(pytorch)的主要内容,如果未能解决你的问题,请参考以下文章

06-01 DeepLearning-图像识别

卷积神经网络(Convolutional Neural Networks, CNN)——更有效率地提取特征

使用 PCA 进行图像分析/特征提取

CNN——卷积层

基于卷积神经网络(CNN)的深度学习图片分类

设计一个卷积神经网络模型用于遥感图像的场景分类