提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
基本概念
参考链接https://oldtang.com/6775.html
卷积
深度学习里面所谓的卷积运算,其实它被称为互相关(cross-correlation)运算:将图像矩阵中,从左到右,由上到下,取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,最后的结果组成一个矩阵,其中没有对核进行翻转。
一般说的边缘信息缺失就是指卷积操作后,边缘的像素点在移动的过程中只被抽取1-3次。因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外。丢失一些边缘信息,后续边缘检测会对边缘特征做增强(高通滤波,锐化)
注意:一般卷积核的维度是奇数
(1)更容易padding
(2)更容易找到卷积锚点
在CNN中,进行卷积操作时一般会以卷积核模块的一个位置为基准进行滑动,这个基准通常就是卷积核模块的中心。若卷积核为奇数,卷积锚点很好找,自然就是卷积模块中心,但如果卷积核是偶数,这时候就没有办法确定了,让谁是锚点似乎都不怎么好。
卷积核大小的选择
多个小的卷积核叠加使用要远比一个大的卷积核单独使用效果要好的多,在连通性不变的情况下,大大降低了参数个数和计算复杂度。当然,卷积核也不是越小越好,对于特别稀疏的数据比如下图所示,当使用比较小的卷积核的时候可能无法表示其特征,如果采用较大的卷积核则会导致复杂度极大的增加。总而言之,我们应该选择多个相对小的卷积核来进行卷积。
填充(Padding)
除了边缘信息被修剪,我们还希望输入和输出的大小应该保持一致。为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“0”来进行填充的。
步长(Stride)
滑动卷积核时,我们会先从输入的左上角开始,每次往左滑动一列或者往下滑动一行逐一计算输出,我们将每次滑动的行数和列数称为Stride
维度计算
W
o
u
t
=
[
(
W
i
n
−
F
+
2
∗
P
)
/
S
]
+
1
W_{out} = [(W_{in} - F + 2*P) / S] + 1
Wout=[(Win−F+2∗P)/S]+1
F: 卷积核大小
P: 填充层数(指从单边往外延伸了几层,例如上图P=1)
S: 步长
如果需要输出与输入维度是一样的,则填充层数的计算
P
=
(
(
S
−
1
)
W
+
F
−
S
)
/
2
P = ((S - 1)W + F - S) / 2
P=((S−1)W+F−S)/2
特别地,如果S=1(一般也是1)
P
=
(
F
−
1
)
/
2
P = (F-1) / 2
P=(F−1)/2
这也是为什么卷积核是奇数的原因,如果是偶数,P就不是整数,总不能往外填充1.5层吧
如卷积核为3时 padding 选择1
如卷积核为5时 padding 选择2
如卷积核为7时 padding 选择3
backbone
翻译为主干网络的意思,这个主干网络大多时候指的是提取特征的网络,其作用就是提取图片中的信息,共后面的网络使用。
什么是fine-tuning?
在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新fine-tuning(也叫微调),或者当做特征提取器。
四个场景
1、新数据集比较小且和原数据集相似。因为新数据集比较小,如果fine-tune可能会过拟合;又因为新旧数据集类似,我们期望他们高层特征类似,可以使用预训练网络当做特征提取器,用提取的特征训练线性分类器。
2、新数据集大且和原数据集相似。因为新数据集足够大,可以fine-tune整个网络。
3、新数据集小且和原数据集不相似。新数据集小,最好不要fine-tune,和原数据集不类似,最好也不使用高层特征。这时可是使用前面层的特征来训练SVM分类器。
4、新数据集大且和原数据集不相似。因为新数据集足够大,可以重新训练。但是实践中fine-tune预训练模型还是有益的。新数据集足够大,可以fine-tine整个网络。
下采样(池化层)
与卷积操作一样,下采样的卷积核为只取对应位置的最大值、平均值等(最大池化、平均池化),并且不经过反向传播的修改。
上采样
FCN
Resnet网络
图像分割
模型输出维度为:image=【batchsize, classes, width, height】这里取(1,2,4,4)
模型label维度为:label=【batchsize, width, height】这里取(1,4,4)
4*4是图片的长宽
_,index = image.max(dim=1)
此时index维度变为(1,4,4),该操作即对每个像素点分类(模型输出已经是概率图)