构建CNN网络需要注意问题
数据预处理(均值,方差, 人脸归一化。。。), 数据增强【放射变换、运动模糊、高斯滤波模糊类,增加噪声类, 色彩/饱和度/亮度调整类、 Flip类,Crop类】 这些都是根据实际的应用场景选择。
1.参数多少问题 [卷积核大小,通道数,卷积方式:conv / depthwiseconv / 空洞卷积 激活函数 PRelu]
2.Flops计算量问题 【参数多并一定是运算量多, 网络前期的运算量一般较大】 卷积核数量、输入大小
3.模型深度【泛化能力】 【pooling网络的时候记得 增加filter数量,防止数据过多丢失】
4.Batch Normalize 利于网络收敛 【解决梯度消失/爆炸问题, 后期BN直接融合到 Conv 里面】
5.Loss函数选择 【Logisic / 交叉熵 / SmoothL1/ 平方差 交叉熵其实原本是KL离散度,因为信息熵固定】
6.正则化选择 L2 / L1 【L2 是权重W的值都比较小,减小输出跳变,值更稳定所以泛化能力更好,L1导致W更稀疏, 从(0-1)的梯度介绍区分】
7.优化函数、SGD / SGD+momument / Adam 【一般选择 SGD+Momument 避免鞍点不下降 。 无脑用Adam下降速度较快,但是目前的Adam还存在问题,效果没有SGD+Momument的效果好】
8.权重初始化方法 、 学习率大小
备注:
计算视觉数据增强
计算视觉领域的数据增强算法大致可以分为两类:第一类是基于基本图像处理技术的数据增强,第二个类别是基于深度学习的数据增强算法。
下面先介绍基于基本图像处理技术的数据增强方法:
- 几何变换(Geometric Transformations):由于训练集与测试集合中可能存在潜在的位置偏差,使得模型在测试集中很难达到训练集中的效果,几何变换可以有效地克服训练数据中存在的位置偏差,而且易于实现,许多图像处理库都包含这个功能。
- 颜色变换(Color Space):图片在输入计算机之前,通常会被编码为张量(高度×宽度×颜色通道),所以可以在色彩通道空间进行数据增强,比如将某种颜色通道关闭,或者改变亮度值。
- 旋转 | 反射变换(Rotation/Reflection):选择一个角度,左右旋转图像,可以改变图像内容朝向。关于旋转角度需要慎重考虑,角度太大或者太小都不合适,适宜的角度是1度 到 20度。
- 噪声注入(Noise Injection):从高斯分布中采样出的随机值矩阵加入到图像的RGB像素中,通过向图像添加噪点可以帮助CNN学习更强大的功能。
- 内核过滤器(Kernel Filters):内核滤镜是在图像处理中一种非常流行的技术,比如锐化和模糊。将特定功能的内核滤镜与图像进行卷积操作,就可以得到增强后的数据。直观上,数据增强生成的图像可能会使得模型面对这种类型的图像具有更高的鲁棒性。
- 混合图像(Mix):通过平均图像像素值将图像混合在一起是一种非常违反直觉的数据增强方法。对于人来说,混合图像生成的数据似乎没有意义。虽然这种方法缺乏可解释性,但是作为一种简单有效的数据增强算法,有一系列的工作进行相关的研究。Inoue在图像每个像素点混合像素值来混合图像,Summers和Dinneen又尝试以非线性的方法来混合图像,Takahashi和Matsubara通过随机图像裁剪和拼接来混合图像,以及后来的mixup方法均取得了不错的成果。
- 随机擦除(Random Erasing):随机擦除是Zhong等人开发的数据增强技术。他们受到Dropout机制的启发,随机选取图片中的一部分,将这部分图片删除,这项技术可以提高模型在图片被部分遮挡的情况下性能,除此之外还可以确保网络关注整个图像,而不只是其中的一部分。
- 缩放变换(Zoom):图像按照一定的比例进行放大和缩小并不改变图像中的内容,可以增加模型的泛化性能。
- 移动(Translation):向左,向右,向上或向下移动图像可以避免数据中的位置偏差,比如在人脸识别数据集合中,如果所有图像都居中,使用这种数据增强方法可以避免可能出现的位置偏差导致的错误。
- 翻转变换(Flipping):通常是关于水平或者竖直的轴进行图像翻转操作,这种扩充是最容易实现的扩充,并且已经证明对ImageNet数据集有效。
- 裁剪(Cropping):如果输入数据集合的大小是变化的,裁剪可以作为数据预处理的一个手段,通过裁剪图像的中央色块,可以得到新的数据。在实际使用过程之中,这些数据增强算法不是只使用一种,而是使用一套数据增强策略,在AutoAugment这篇文章中,作者尝试让模型自动选择数据增强策略。
感受野计算方式
K代表卷积核的大小, S代表步长