2 CNN
对图像(不同的数据窗口数据)和滤波矩阵做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作。
卷积神经网络由输入层、卷积层、激励层、池化层、全连接层组成。
① 最左边:
数据输入层,对数据做一些处理:
去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)
归一化(把所有的数据都归一到同样的范围)、PCA/白化等。CNN只对训练集做“去均值”这一步。
② 中间是:
CONV:卷积层,线性乘积 求和。
RELU:激励层,ReLU是激活函数的一种。
POOL:池化层,即取区域平均或最大。
③ 最右边是:
FC:全连接层
2.1 卷积神经网络的结构
池化层的作用:
减小图像尺寸即数据降维,缓解过拟合,保持一定程度的旋转和平移不变性。
2.2 Keras搭建CNN
总结: 通常情况下,一维CNN的架构与CV的二维CNN很相似, 它将 Conv1D 层和 MaxPooling1D 层堆叠在一起,最后是一个全局池化运算或展平操作。
RNN 在处理非常长的序列时计算代价很大,但一维CNN的计算代价很小, 所以在 RNN 之前使用一维CNN作为预处理步骤是一个好主意,这样可以使序列变短,并提取出有用的表示交给 RNN 来处理。
2.3 经典网络分类
2.2.1 LeNet
最早用于数字识别;针对灰度图进行训练的,输入图像大小为32*32*1,5*5卷积核,不包含输入层的情况下共有7层,每层都包含可训练参数。
输入的二维图像,先经过两次卷积层到池化层,再经过全连接层,最后使用softmax分类作为输出层。(conv1->pool->conv2->pool2再接全连接层)
2.2.2 AlexNet
用多层小卷积叠加来替换单个的大卷积。
输入尺寸:227*227*3
卷积层:5个
降采样层(池化层):3个
全连接层:2个(不包含输出层)
输出层:1个。1000个类别
AlexNet比LeNet表现更为出色的另一个原因是它使用了ReLu激活函数。
2.2.2.1 AlexNet 对比LeNet 的优势?
1.AlexNet比LeNet更深;
2.用多层的小卷积来替换单个的大卷积;
3.非线性激活函数:ReLU
4.防止过拟合的方法:Dropout,数据增强
5.大数据训练:百万级ImageNet图像数据
6.其他:GPU实现,LRN归一化层的使用
2.2.3 VGG
构筑了16~19层深的卷积神经网络,VGG-16中的16:含有参数的有16个层
VGGNet论文中全部使用了3*3的小型卷积核和2*2的最大池化层,通过不断加深网络结构来提升性能。
卷积层:CONV=3*3 filters, s = 1, padding = same convolution。
池化层:MAX_POOL = 2*2 , s = 2。
优点:简化了卷积神经网络的结构;缺点:训练的特征数量非常大。
随着网络加深,图像的宽度和高度都在以一定的规律不断减小,每次池化后刚好缩小一半,信道数目不断增加一倍。
2.2.3.1 VGG使用2个3*3卷积的优势在哪里?
①减少网络层参数:
用两个3*3卷积比用1个5*5卷积拥有更少的参数量,只有后者的2*3*3/(5*5)=0.72。但是起到的效果是一样的,两个33的卷积层串联相当于一个55的卷积层,感受野的大小都是5×5,即1个像素会跟周围5*5的像素产生关联.
②更多的非线性变换:
2个33卷积层拥有比1个55卷积层更多的非线性变换(前者可以使用两次ReLU激活函数,而后者只有一次),使得卷积神经网络对特征的学习能力更强。
2.2.3.2每层卷积是否只能用一种尺寸的卷积核?
可以,经典的神经网络一般都属于层叠式网络,每层仅用一个尺寸的卷积核,如VGG结构中使用了大量的3×3卷积层。
同一层特征图也可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来,得到的特征往往比使用单一卷积核的要好。比如GoogLeNet、Inception系列的网络。
2.2.4 Inception(GoogLeNet)
增加了卷积神经网络的宽度,在多个不同尺寸的卷积核上进行卷积后再聚合,并使用1*1卷积降维减少参数量。
2.2.4.1 inception结构能不能缓解梯度消失?
可以,因为inception结构额外计算了两个中间loss,防止了较深网络传播过程中的梯度消失问题。
2.2.5 ResNet
残差网络解决了网络退化的问题(随着网络的深度增加,准确度反而下降了)
2.2.5.1 ResNet为什么不用Dropout?
BN在训练过程对每个单个样本的forward均引入多个样本(Batch个)的统计信息,相当于自带一定噪音,起到正则效果,所以也就基本消除了Dropout的必要。 (ResNet训练152层深的神经网络)
2.2.5.2 ResNet网络越来越深,准确率会不会提升?
训练精度和测试精度迅速下降。
神经网络在反向传播过程中要不断地传播梯度,而当网络层数加深时,梯度在传播过程中会逐渐消失,导致无法对前面网络层的权重进行有效的调整。
2.2.5.3 ResNet v1 与 ResNet v2的区别?
通过ResNet 残差学习单元的传播公式,发现前馈和反馈信号可以直接传输,
因此 捷径连接 的非线性激活函数(如ReLU)替换为 Identity Mappings。
同时,ResNet V2 在每一层中都使用了 Batch Normalization。这样处理之后,新的残差学习单元将比以前更容易训练且泛化性更强。
2.2.5.4 Resnet代码
2.2.6 DenseNet
因为我们是直接跨通道直接做concat,所以这里要求不同层concat之前他们的特征图大小应当是相同的,所以DenseNet分为了好几个Dense Block,每个Dense Block内部的feature map的大小相同.而每个Dense Block之间使用一个Transition模块来进行下采样过渡连接
含义:前面所有层与后面层的密集连接, 每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入
优点:缓解梯度消失问题,特征复用,加强特征传播,减少参数量
缺点:内存占用高
梯度消失原因:每一层都直接连接input和loss。
参数量少原因:每一层已经能够包含前面所有层的输出,只需要很少的特征图就可以了。
2.2.6.1 DenseNet 比 ResNet 好?
1.ResNet连接方式可能会阻碍信息的流动,但是DenseNet每层的输出都和最终的输出直接相连,梯度可以直接从末端流到之前的所有的层。
2.DensetNet连接有正则化的作用,可以减少过拟合。
3.DenseNet直接连接不同层的特征图,而不是像ResNet一样element-wise sum。
2.2.6.2为什么 DenseNet 比 ResNet 更耗显存?
DenseNet的特征图像比ResNet大很多,导致卷积过程的计算量比resnet大很多。
2.3 卷积层有哪些基本参数?
①卷积核大小 (Kernel Size):
定义了卷积的感受野 在过去常设为5,如LeNet-5;现在多设为3,通过堆叠3×33×3的卷积核来达到更大的感受域。
②卷积核步长 (Stride):
常见设置为1,可以覆盖所有相邻位置特征的组合;当设置为更大值时相当于对特征组合降采样。
③填充方式 (Padding)
④输入通道数 :指定卷积操作时卷积核的深度
⑤输出通道数 :指定卷积核的个数
感受野:CNN每一层输出的特征图上的像素点在原始图像上映射的区域大小。
2.4 如何计算卷积层的输出的大小?
K 是过滤器尺寸,P 是填充,S 是步幅
2.5 如何计算卷积层参数数量?
卷积层参数量 = (filter size * 前一层特征图的通道数)* 当前层filter数量 + 当前层filter数量。 (卷积核长度*卷积核宽度*通道数+1)*卷积核个数
假设输入层矩阵维度是 96×96×3,第一层卷积层使用尺寸为 5×5、深度为 16 的过滤器(卷积核尺寸为 5×5、卷积核数量为 16),那么这层卷积层的参数个数为 5×5×3×16 + 16=1216个。
2.6 有哪些池化方法?
池化操作也叫做子采样(Subsampling)或降采样(Downsampling),往往会用在卷积层之后,通过池化来降低卷积层输出的特征维度,有效减少网络参数的同时还可以防止过拟合现象。
①最大池化 和 ②平均池化
以最大池化为例,池化范围(2×2)(2×2)和滑窗步长(stride=2)(stride=2) 相同,仅提取一次相同区域的范化特征。
2.7 1*1卷积的作用?
①加入非线性函数。卷积层之后经过激励层,提升网络的表达能力;
②对卷积核通道数进行降维和升维,减小参数量。
2.8 卷积层和池化层有什么区别?
①卷积层有参数,池化层没有参数;
②经过卷积层节点矩阵深度会改变。池化层不会改变节点矩阵的深度,但是它可以缩小节点矩阵的大小。
2.9 卷积核是否一定越大越好?
不一定,缺点:会导致计算量大幅增加,不利于训练更深层的模型,相应的计算性能也会降低。
卷积神经网络(VGG、GoogLeNet等),发现通过堆叠2个3×3卷积核可以获得与5×5卷积核相同的感受视野,同时参数量会更少(3×3×2+1 < $ 5×5×1+1$)
优点:
文本特征有时需要有较广的感受域让模型能够组合更多的特征(如词组和字符)
卷积核的大小并没有绝对的优劣,需要视具体的应用场景而定,但是极大和极小的卷积核都是不合适的,单独的1×1极小卷积核只能用作分离卷积而不能对输入的原始特征进行有效的组合,极大的卷积核通常会组合过多的无意义特征从而浪费了大量的计算资源。
2.10 卷积在图像中有什么直观作用?
用来提取图像的特征,但不同层次的卷积操作提取到的特征类型是不相同的:
浅层卷积: 边缘特征
中层卷积: 局部特征
深层卷积: 全局特征
2.11 CNN中空洞卷积的作用是什么?
空洞卷积也叫扩张卷积,在保持参数个数不变的情况下增大了卷积核的感受野,同时它可以保证输出的特征映射的大小保持不变。一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,但参数数量仅为9个。
2.12 怎样才能减少卷积层参数量?
①使用堆叠小卷积核代替大卷积核:
VGG网络中2个3×3的卷积核可以代替1个5×5的卷积核
②使用分离卷积操作:
将原本K×K×C的卷积操作分离为K×K×1和1×1×C的两部分操作
③添加1×1的卷积操作:与分离卷积类似,但是通道数可变,在K×K×C1卷积前添加1×1×C2的卷积核(满足C2<C1)
④在卷积层前使用池化操作:池化可以降低卷积层的输入特征维度
2.13 在进行卷积操作时,必须同时考虑通道和区域吗?
①标准卷积同时考虑通道和区域
②通道分离(深度分离)卷积网络(Xception网络):
首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道特征矩阵之后,再对这批新通道特征进行标准的1×1跨通道卷积操作。
2.14 采用宽卷积,窄卷积的好处有什么?
宽卷积、窄卷积其实是一种填充方式。
①宽卷积('SAME’填充):
对卷积核不满足整除条件的输入特征进行补全,以使卷积层的输出维度保持与输入特征维度一致。
②窄卷积('VALID’填充):
不进行任何填充,在输入特征边缘位置若不足以进行卷积操作,则对边缘信息进行舍弃,因此在步长为1的情况下该填充方式的卷积层输出特征维度可能会略小于输入特征的维度。
2.15 介绍反卷积(转置卷积)
正向传播时乘以卷积核的转置矩阵,反向传播时乘以卷积核矩阵,由卷积输出结果近似重构输入数据,上采样。
输入:2x2, 卷积核:4x4, 滑动步长:3, 输出:7x7
过程如下:
①输入图片每个像素进行一次full卷积,根据full卷积大小计算可以知道每个像素的卷积后大小为 1+4−1==4, 即4x4大小的特征图,输入有4个像素所以4个4x4的特征图。
②将4个特征图进行步长为3的相加; 输出的位置和输入的位置相同。步长为3是指每隔3个像素进行相加,重叠部分进行相加,即输出的第1行第4列是由红色特阵图的第一行第四列与绿色特征图的第一行第一列相加得到,其他类推。
可以看出反卷积的大小是由卷积核大小与滑动步长决定, in是输入大小, k是卷积核大小, s是滑动步长, out是输出大小 得到 out=(in−1)*s + k 上图过程就是 (2 - 1) * 3 + 4 = 7。
特别详细的反卷积:反卷积(Transposed Convolution)详细推导 - 知乎
2.16 如何提高卷积神经网络的泛化能力?
2.17 卷积神经网络在NLP与CV领域应用的区别?
自然语言处理对一维信号(词序列)做操作,输入数据通常是离散取值(例如表示一个单词或字母通常表示为词典中的one hot向量)
计算机视觉则是对二维(图像)或三维(视频流)信号做操作。输入数据是连续取值(比如归一化到0,1之间的- 灰度值)。
2.18 全连接、局部连接、全卷积与局部卷积的区别?
2.19 卷积层和全连接层的区别?
1.卷积层是局部连接,所以提取的是局部信息;全连接层是全局连接,所以提取的是全局信息;
2.当卷积层的局部连接是全局连接时,全连接层是卷积层的特例;
2.20 Max pooling如何工作?还有其他池化技术吗?
1.Max pooling:选取滑动窗口的最大值
2.Average pooling:平均滑动串口的所有值
3.Global average pooling:平均每页特征图的所有值
2.21 卷积神经网络的优点?为什么用小卷积核?
多个小的卷积核叠加使用要远比一个大的卷积核单独使用效果要好的多。
1.局部连接
这个是最容易想到的,每个神经元不再和上一层的所有神经元相连,而只和一小部分神经元相连。这样就减少了很多参数。
2.权值共享
一组连接可以共享同一个权重,而不是每个连接有一个不同的权重,这样又减少了很多参数。
3.下采样
Pooling层利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息。通过去掉Feature Map中不重要的样本,进一步减少参数数量。
2.22 CNN拆成3x1 1x3的优点?
为了压缩模型参数量(这里参数由3x3=9降低到1x3+3x1=6),但是计算量基本没变(乘数目没变)。
2.23 BN、LN、IN、GN和SN的区别?
将输入的 feature map shape 记为[N, C, H, W],其中N表示batch size,即N个样本;C表示通道数;H、W分别表示特征图的高度、宽度。
为什么需要卷积?不能使用全连接层吗?
2.24 为什么降采用使用max pooling,而分类使用average pooling?
2.25 CNN是否抗旋转?如果旋转图像,CNN的预测会怎样?
分析:CNN应该具有一定的平移不变性(等变性),由于conv层的卷积核对于特定的特征才会有较大激活值,所以不论上一层feature map中的某一特征平移到何处,卷积核都会找到该特征并在此处呈现较大的激活值。这应该就是“等变性”。CNN中的max pooling导致这种平移不变性变差
CNN应该不具有旋转不变性,数据增强中可以使用旋转来增加模型的泛化能力
CNN不具有尺度不变性:
2.26 什么是数据增强?为什么需要它们?你知道哪种增强?
作用:1. 避免过拟合。当数据集具有某种明显的特征,例如数据集中图片基本在同一个场景中拍摄,使用Cutout方法和风格迁移变化等相关方法可避免模型学到跟目标无关的信息。
2. 提升模型鲁棒性,降低模型对图像的敏感度。当训练数据都属于比较理想的状态,碰到一些特殊情况,如遮挡,亮度,模糊等情况容易识别错误,对训练数据加上噪声,掩码等方法可提升模型鲁棒性。3. 增加训练数据,提高模型泛化能力。4. 避免样本不均衡。在工业缺陷检测方面,医疗疾病识别方面,容易出现正负样本极度不平衡的情况,通过对少样本进行一些数据增强方法,降低样本不均衡比例。
分类:根据数据增强方式,可分为两类:在线增强和离线增强。这两者的区别在于离线增强是在训练前对数据集进行处理,往往能得到多倍的数据集,在线增强是在训练时对加载数据进行预处理,不改变训练数据的数量。
方式:
几何和像素变化这都属于单样本变换方式:
几何变换方法主要有:翻转,旋转,裁剪,缩放,平移,抖动。值得注意的是,在某些具体的任务中,当使用这些方法时需要主要标签数据的变化,如目标检测中若使用翻转,则需要将gt框进行相应的调整。
比较常用的像素变换方法有:加椒盐噪声,高斯噪声,进行高斯模糊,调整HSV对比度,调节亮度,饱和度,直方图均衡化,调整白平衡等
离线增强一般用于小型数据集,在训练数据不足时使用,在线增强一般用于大型数据集
多样本数据增强:利用多个样本来产生新的样本;
SMOTE: 人工合成新样本来处理样本不平衡问题,第一步,定义好特征空间,将每个样本对应到特征空间中的某一点,根据样本不平衡比例确定好一个采样倍率N;第二步,对每一个小样本类样本(x,y),按欧氏距离找出K个最近邻样本,从中随机选取一个样本点,假设选择的近邻点为(xn,yn)。在特征空间中样本点与最近邻样本点的连线段上随机选取一点作为新样本点;第三步,重复以上步骤,直到达到平衡
SamplePairing: 从训练集中随机抽取两张图片分别经过基础数据增强操作(如随机翻转等)处理后经像素以取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。这两张图片甚至不限制为同一类别,这种方法对于医学图像比较有效.
Mixup: mixup是Facebook人工智能研究院和MIT在“Beyond Empirical Risk Minimization”中提出的基于邻域风险最小化原则的数据增强方法,它使用线性插值得到新样本数据
无监督的数据增强:通过模型学习数据的分布,随机生成与训练数据集分布一致的图片,代表方法GAN;通过模型,学习出适合当前任务的数据增强方法,代表方法AutoAugment
如何选择要使用的增强?
2.27 什么是迁移学习?它是如何工作的?
分析:在机器学习中,把一次某一次训练的模型(也就是训练结果)中的一部分拿去用在一个相关但不同的问题上。
初衷:降低资源,比如显卡、比如训练时间、比如大量训练数据
注意点:本来预训练的神经网络,要和当前的任务差距不大,不然迁徙学习的效果会很差
如何微调:逐层对网络中每个节点的权重进行微调另一种迁移学习的方法是对整个网络进行微调,假设你已训练好了识别猫品种的神经网络,你的网络能对50种猫按品种进行分类。接下来你想对网络进行升级,让其能够识别100种猫,这时你不应该只训练网络的最后一层,而应该逐层对网络中每个节点的权重进行微调。显然,只训练最后几层,是迁移学习最简单的1.0版,而对节点权重进行微调(fine turing),就是更难的2.0版,通过将其他层的权重固定,只训练一层这样的逐层训练,可以更好的完成上述任务;