深度学习笔记(10)——卷积神经网络
卷积神经网络
回顾:
- 线性分类器 f ( x , W ) = W x + b f(x,W)=Wx+b f(x,W)=Wx+b
- 损失函数和优化
L
(
W
,
b
)
=
1
N
∑
i
=
1
N
L
i
+
R
(
W
)
L(W,b)=\frac{1}{N}\sum_{i=1}^{N}L_i+R(W)
L(W,b)=N1∑i=1NLi+R(W)
优化模型来降低模型在数据上的损失:SGD,SGD+Momentum,RMSProp,Adam - 计算图加反向传播
方向梯度直方图:0~180°,每20°一个间隔,共九个数。
词袋:提取随机图像块,聚类图像块,形成“visual words”的codebook
卷积神经网络
全连接层(参数量,优化,空间信息):参数量多,空间信息损失
卷积层:滤波器的深度始终与输入的深度相同
将滤波器与图像卷积,即"在图像上空间滑动,计算点积"
GPU适合并行运算,卷积神经网络适合并行运算。
在采用batch的时候,每个batch里的图尺寸必须一样
卷积输出的空间尺寸:(N+2P-F)/S+1,N是输入尺寸,P是padding的大小,F是滤波器尺寸,S是步长(必须要理解这个公式),N+2P为padding之后的尺寸宽。
为了保持输出的空间尺寸大小,conv层的步幅为1,滤波器大小为F*F,零填充为(F-1)/2(这边需要取整)
对于大图像,我们需要使用很多卷积层,才能"看到"整个图像
解决方案:
- 大步长
- 池化层
池化层:使特征更小,更易于处理,独立操作每个激活图,池化没有可学习参数,引入空间不变性,且池化一般不用padding。
对于stride=1,每次连续的卷积都会使感受野大小增加(K-1),对于L层,感受野大小为1+L*(K-1),此处注意区分在前一层上的感受野和在输入图像上的感受野。
对于核大小为K的卷积,输出中的每个元素都取决于输入中的K*K感受野。
注意要区分:在前一层上的感受野和在输入图像上的感受野
感受野计算公式:
R
n
=
R
n
−
1
+
[
(
F
n
−
1
)
×
∏
i
=
1
n
−
1
s
i
]
R_n=R_{n-1}+[(F_n-1)\times \prod_{i=1}^{n-1} s_i]
Rn=Rn−1+[(Fn−1)×∏i=1n−1si]
感受野中心为:
s
t
a
r
t
l
=
s
t
a
r
t
l
−
1
+
(
k
−
1
2
−
p
l
)
×
j
l
−
1
,
j
l
=
∏
i
=
1
n
−
1
s
i
start_l=start_{l-1}+(\frac{k-1}{2}-p_l)\times j_{l-1},j_l=\prod_{i=1}^{n-1}s_i
startl=startl−1+(2k−1−pl)×jl−1,jl=∏i=1n−1si
批归一化层
以下输入会导致网络难以优化:
输入不以零为中心(有较大的偏置)
输入的每个元素具有不同的缩放比例
解决方案:对输入进行缩放(归一化)
x
i
,
j
=
x
i
,
j
−
μ
j
σ
j
2
+
ϵ
,
y
i
,
j
=
γ
j
x
i
,
j
+
β
j
x_{i,j}=\frac{x_{i,j}-\mu_j}{\sqrt{\sigma_j^2+\epsilon}},y_{i,j}=\gamma_jx_{i,j}+\beta_j
xi,j=σj2+ϵxi,j−μj,yi,j=γjxi,j+βj,
μ
j
\mu_j
μj是第j个通道的均值,
σ
j
2
\sigma_j^2
σj2是第j个通道的方差,
ϵ
\epsilon
ϵ是防止除0的常数,
γ
j
\gamma_j
γj和
β
j
\beta_j
βj是可学习的参数,
γ
j
\gamma_j
γj是缩放因子,
β
j
\beta_j
βj是偏移因子,这两个参数的加入是因为归一化后的输入丢失了大量数据信息(均值、方差)。
批归一化层的作用:
- 使深度网络更容易训练
- 改善梯度流
- 允许更高的学习率,更快的收敛
- 网络对初始化变得更加稳健
- 在训练过程中起到正则化的作用
注意:训练时从数据集中学习,测试时候使用训练得到的参数
经典卷积网络架构
AlexNet
卷积,池化,BN,卷积,池化,BN,卷积,卷积,卷积,池化,全连接
首次使用ReLU,大量使用数据增强,dropout, batch_size 128 ,SGD+Momentum 0.9,L2 weight decay 5e-4
ZFNet
在AlexNet的基础上进行超参数优化
VGG
更小的滤波器,更深的网络,只使用
3
×
3
3\times3
3×3的滤波器,和
2
×
2
2\times2
2×2的Max Pooling,突出网络深度的重要性
为什么只使用
3
×
3
3\times3
3×3的滤波器:多个
3
×
3
3\times3
3×3相对一个
7
×
7
7\times7
7×7的Conv,相同的感受野,更少的参数量,更深、更多的非线性变化
GoogLeNet
使用Inception模块,并联多个不同的算子,突出网络宽度的重要性
具体solution:使用
1
×
1
1\times1
1×1Conv降低计算量、参数量、通道数
ResNet
残差神经网络,残差连接可以改善梯度消失问题,可以训练极深卷积网络,使用了BottleNeck:减少计算量,减少参数量(核心思想还是用小的卷积核来模拟大卷积核从而减少参数量)
1
×
1
1\times1
1×1卷积可以很方便地改变维度,灵活设计网络,减少计算量
SENet
通道注意力机制,通过学习的方式,自适应地调整每个通道的权重,使模型更加关注对分类任务更重要的特征,从而提高模型的性能。
网络退化问题:网络的可用自由度对这些范数的贡献非常不均衡,也就是每个层中只有少量的隐藏单元对不同的输入改变它们的激活值,而大部分隐藏单元对不同的输入都是相同的反应,此时整个权重矩阵的秩不高。
迁移学习
将在分类任务上训练好的模型,用于新的任务,比如在ImageNet上训练好的模型,用于新的分类任务。
- 分类任务数据量大,标注难度低,标注成本低
- 其他任务数据量小,标注难度高,标注成本低
- 直接在小数据上训练网络,性能很差
后续的研究发现与训练并不是必须的,更长的训练时长+tricks可以达到相同的性能,但是使用合适的预训练模型一定不会得到更差的结果,所以要合适的预训练!