本文是对 YOLO2 的学习笔记,下面是我对 YOLO2 的理解,本文将 YOLO2 中涉及的一些知识放到了文末,可以选择性阅读。相关参考我已给出链接,个人理解的内容肯定有不够准确的地方,希望能和大家交流讨论。
文章目录
升级方案
https://blog.csdn.net/Jesse_Mx/article/details/53925356
YOLO2网络
参考
https://www.jianshu.com/p/032b1eecb335
http://www.mamicode.com/info-detail-2232517.html
https://blog.csdn.net/Jesse_Mx/article/details/53925356
在YOLO2中的 anchor box
怎么预设的 anchor box(锚框)
在 Faster R-CNN 和 SSD 中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2 采用 k-means 聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与 ground truth 的 IOU 更好,所以聚类分析时选用 box 与聚类中心 box 之间的 IOU 值作为距离指标:
d
(
b
o
x
,
c
e
n
t
r
o
i
d
)
=
1
−
I
O
U
(
b
o
x
,
c
e
n
t
r
o
i
d
)
d(box, centroid) = 1 - IOU(box, centroid)
d(box,centroid)=1−IOU(box,centroid)
怎么得到的预测框
YOLO2 结合一代的网格思想,和 Faster R-CNN 的相对锚框偏移的思想。在 Faster R-CNN 中,候选框的偏移量 t i t_i ti 取值没有限制,这回使候选框离锚框很远,显然越远越难控制候选框的准确度,而且效率也会变低,所以 YOLO2 引入 **Sigmoid函数 ** 将偏移量限制在 0 到 1 之间。
YOLO2 通过锚框预测的是预测框,而不是像 RPN 那样粗略的预测出候选框,所以需要对预测框更细致的控制,这里延续了 YOLO1 的思想,最终输出的特征图是 13*13 将其视为在原图上划分了 13*13 的网格,与 RPN 一样,每一个网格对应最终输出的特征图上的一点。一个网格将生成5 个锚框(5 是聚类得出的值 ,这里的锚框被称为预选预测框,bounding box prior,意为预测框的初始状态)。之后神经网络会生成相对于锚框的偏移值,间接生成预测框,通过梯度下降,预测框将将逐渐向真实框趋近。
预测框的位置:
每一个锚框预测五个值: ( t x , t y , t w , t h , t o ) (t_x,t_y,t_w,t_h,t_o) (tx,ty,tw,th,to) 分别代表(中心点横坐标偏移,中心点纵坐标偏移,宽偏移,高偏移,置信度)
预测框的位置信息由下面公式运算得到:
b
x
=
σ
(
t
x
)
∗
c
w
+
c
x
b
y
=
σ
(
t
y
)
∗
c
h
+
c
y
b
w
=
p
w
e
t
w
b
h
=
p
h
e
t
h
b_x = \sigma(t_x)*c_w+c_x\\ b_y = \sigma(t_y)*c_h+c_y\\ b_w = p_we^{t_w}\\ b_h = p_he^{t_h}\\
bx=σ(tx)∗cw+cxby=σ(ty)∗ch+cybw=pwetwbh=pheth
c
x
,
c
y
c_x,c_y
cx,cy 是负责该锚框的网格的左上角坐标,
c
w
,
c
h
c_w,c_h
cw,ch 是每个网格的框和高,
t
x
,
t
y
,
t
w
,
t
h
,
t
o
t_x,t_y,t_w,t_h,t_o
tx,ty,tw,th,to 是神经网络输出的值,
p
w
,
p
h
p_w,p_h
pw,ph 是锚框的宽和高,
σ
(
⋅
)
\sigma(\cdot)
σ(⋅) 是 Sigmoid 函数,可将
t
x
,
t
y
,
t
o
t_x,t_y,t_o
tx,ty,to 的值限制在 0 到 1 之间,
b
x
,
b
y
,
b
w
,
b
h
b_x,b_y,b_w,b_h
bx,by,bw,bh 表示预测框在原图上的(中心点横坐标,中心点纵坐标,宽,高)。
注:这里的公式是我个人理解的,原公式没有 c w , c h c_w,c_h cw,ch,论文也没有介绍 σ ( ⋅ ) \sigma(\cdot) σ(⋅) ,网上有博文认为 σ ( ⋅ ) \sigma(\cdot) σ(⋅) 是将归一化的 t x , t y t_x,t_y tx,ty 还原为原始图片上的坐标,我不认可,因为 t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th 如果已经被归一化了,那 b w b_w bw 的取值只能在 ( p w , p w e ) (p_w,p_we) (pw,pwe) 之间,那预测框的长宽也太不灵活了。所以我认为 σ ( ⋅ ) \sigma(\cdot) σ(⋅) 应该还是指 Sigmoid 函数 t x , t y , t w , t h t_x,t_y,t_w,t_h tx,ty,tw,th 是未归一化的量。
同时如果没有 c w c_w cw , 即 b x = σ ( t x ) + c x b_x = \sigma(t_x)+c_x bx=σ(tx)+cx 那相当于预测框的中心坐标最多比锚框多偏移 1 像素,那这样预测框的位置也太不灵活了,根据作者论文描述 “This bounds the ground truth to fall between 0 and 1. “,”this“ 代指相对于网格位置的方法,所以推测应该是 σ ( t x ) = 0 , σ ( t x ) = 1 \sigma(t_x)=0,\sigma(t_x)=1 σ(tx)=0,σ(tx)=1 应该分别表示在网格的最左边还是最右边。所以在 σ ( t x ) \sigma(t_x) σ(tx) 后应该乘上网格的宽度。
用图像表示上面的公式就是:
图中虚线框是锚框,蓝色框是预测框。同样,我认为图中公式里 σ ( t x ) \sigma(t_x) σ(tx) 后应该乘上网格的宽度。
预测框的置信度
置信度沿用 YOLO1 的思想 t o t_o to 是神经网络输出值, σ ( t o ) \sigma(t_o) σ(to) 表示置信度,经过梯度下降,它的值应该趋近 P r ( o b j ) ∗ I O U ( b b o x , g t ) Pr(obj)*IOU(bbox,gt) Pr(obj)∗IOU(bbox,gt) 同样, P r ( o b j ) Pr(obj) Pr(obj) 当预测框含物体等于1,不含等于0 ; I O U ( b b o x , g t ) IOU(bbox,gt) IOU(bbox,gt) 是预测框与真实框的交并比。
YOLO1 和 YOLO2 关于预测框的对比
YOLO1 和 YOLO2 特征提取器不一样,YOLO2 的提取器更加轻便
YOLO1 提取特征后,一个网格内的两个预测框需要用所有网格的特征来生成
YOLO2 提取特征后,一个网格内的 5 个预测框,只需要这个网格的特征来生成
YOLO2 中一个网格内预测框有不同形状的预设值
passthrough layer
最终输出的特征图尺寸为 13*13 这对于大物体足以,但是对小物体相对困难,所以将卷积过程中最近的一个 26*26 特征图取出来,对该特征图分别按行、案列进行隔样取样,得到 4 个 13*13 的特征图,将 4 个特征图堆叠起来,最终合成一个 13*13*1024 的特征图,在生成预测框前,把这个特征图堆叠到 1*1 卷积之前的特征图。
如此操作之后,进行预测框提取的时候,就相当于也考虑到了 26*26 特征图的特征,间接等于小物体放大 4 倍
网络结构
Darknet-19 分类网络
YOLOv2 使用了一个新的分类网络作为特征提取部分,参考了前人的先进经验,比如类似于 VGG,作者使用了较多的 3 * 3 卷积核,在每一次池化操作后把通道数翻倍。借鉴了 network in network 的思想,网络使用了全局平均池化(global average pooling),把 1 * 1 的卷积核置于 3 * 3 的卷积核之间,用来压缩特征。也用了 batch normalization 稳定模型训练。最终得出的基础模型就是 Darknet-19,如下图,其包含19个卷积层、5个最大值池化层(maxpooling layers ),下图展示网络具体结构。
检测网络
网络结构如下(输入416,5个类别,5个anchor box):
作者将 Darknet-19 移除最后一个1x1的层,在最后添加3个3x3x1024的卷积层,再接上输出是类别个数的1x1卷积.
添加跨层跳跃连接(passthrough layer,借鉴ResNet等思想),第25层为 route 层,拿到第 16 层 26 * 26 * 512 的输出,并由第 26 层的 reorg 层把 26 * 26 * 512 变形为13 * 13 * 2048,再由第 27 层的 route 层连接 24 层和 26 层的输出,堆叠为 13 * 13 * 3072,由最后一个卷积核为 3 * 3 的卷积层进行跨通道的信息融合并把通道降维为1024。第 30 层通过对特征图中的每一个点进行全连接得到 13*13*50 的最终输出信息。13*13 是由因为输入图片大小为 416*416 经过5次池化,每次池化大小除二,最终得到 13*13 ,13*13 的特征图中的每一点是一组特征向量,特征向量由 n 组 *(4 个预测框的坐标点信息 + 1个置信度信息 + m 个类别概率 = 5 + m 个数)组成,这里 n 是 anchor 框的数目 = 5,m 是识别的类别数目 = 5 ,所以每一组特征向量长度 = 5 * (4+1+5) = 50
损失函数
训练函数基本和 YOLO1 一样,了解 RPN 和 YOLO1 后,可以说是一目了然。
https://www.cnblogs.com/demian/p/9252038.html
https://www.cnblogs.com/WSX1994/p/11226012.html
YOLO2的相关的知识
Faster RCNN 中的 Anchor Boxes
什么是 Anchor Boxes 与 RPN 网络
参考:https://www.jianshu.com/p/cbfaa305b887RPN网络结构
假设原图 M M M 经过一些列卷积层(如 VGG16 等卷积神经网络的卷积层)得到特征图 M ∗ M^* M∗。
将特征图 M ∗ M^* M∗,通过等宽卷积(Faster RCNN 论文中是 3*3*256 等宽卷积)生成的新的特征图记为 M ∗ ∗ M^{**} M∗∗
从总体来看 M ∗ ∗ M^{**} M∗∗ 是由原图 M M M 通过一系列卷积运算而来,那么特征图 M ∗ ∗ M^{**} M∗∗ 上的一个点就对应原图的一个区域,原图上每个区域的中心称之为锚点(Anchor ),以锚点为中心的按照 k 个固定的大小比例和长宽比策略可以生成 k 个框,生成的每个框被称为 Anchor 框 (Anchor Box,锚框) 。
为什么特征图上的一个点,可对应原图的一个区域?具体如何对应?
卷积神经网络示意图如下,
由图可见,原图中的一块区域通过一系列卷积层可以被压缩为一个点,反之一个点也一定是全图的一块区域生成的。
对于 VGG16 而言,它的卷积都是等宽卷积,RPN里的也是等宽卷积,所以 M ∗ ∗ M^{**} M∗∗ 中的每个点,对应在原图 M M M 中的区域的中心点,一定是均匀分布在原图上的,通过对 VGG16 分析可知改变尺寸的主要是池化层,看经历几个池化层就能知道一个点对应区域的大小了,总之通过对卷积和池化层的分析,肯定能找到这个区域就是了。
同时,假设 M ∗ M^* M∗ 尺寸为 H ∗ W H*W H∗W,等宽卷积核数量为 D D D,则 M ∗ ∗ M^{**} M∗∗ 为 W ∗ H ∗ D W*H*D W∗H∗D 的特征图, M ∗ ∗ M^{**} M∗∗ 上的每一点也是一个 D D D 维特征向量。将 M ∗ ∗ M^{**} M∗∗ 上的一点,即将一个 D D D 维向量平行地通过两个独立的全连接层可以分别得到 2k 维向量 和 4k 维向量,k是超参数,表示 M ∗ ∗ M^{**} M∗∗ 上每一点生成的锚框的数目。
M ∗ ∗ M^{**} M∗∗ 上的一个点,生成的 2k 维向量中包含的是 k 个 ( p i , 1 − p i ) (p_i,1-p_i) (pi,1−pi) 对,每个 $ p_i $ 代表第 i 个锚框包含物体的概率,因为用的 sortmax 所以输出的是两个值。
M ∗ ∗ M^{**} M∗∗ 上的一个点,生成的 4k 维向量中包含的是 k 个 ( t i , x , t i , y , t i , w , t i h ) (t_{i,x},t_{i,y},t_{i,w},t_{ih}) (ti,x,ti,y,ti,w,tih) 对, t i , ? t_{i,?} ti,? 表示第 i 个锚框与预测的候选框的偏移量,如 t 1 , x t_{1,x} t1,x 表示第一个锚框相中心点横坐标对于预测的候选框的中心点横坐标的偏移量, ( t i , x , t i , y , t i , w , t i h ) (t_{i,x},t_{i,y},t_{i,w},t_{ih}) (ti,x,ti,y,ti,w,tih) 也统称为 t i t_i ti ,这样 RPN 网络通过输出偏移量,间接实现输出一个候选框。
注意,在 RPN 网络不断学习的过程中,随学习程度改变的是偏移量而非锚框,之所称之为锚点、锚框,就是因为这玩意不变动。
锚:停船用具,铁质。一段用铁链固定在船上,另一端成倒钩的爪形,抛到水底或岸上,以稳定船体。
顺便提一嘴,对于一张图里的每一个点进行全连接操作,等价于对这张图进行 1*1 的卷积操作,卷积核的数目此时等于每一个点(特征向量)经过全连接操作后的输出维度,所以可以将上述过程理解为对 M ∗ ∗ M^{**} M∗∗ 平行地进行 1*1*2k 卷积操作和 1*1*4k 的卷积操作。
总的来说 RPN网络 输入的是深度任意、尺寸为 W ∗ H W*H W∗H 特征图,输出的是 W ∗ H ∗ k W*H*k W∗H∗k 个(锚框包含物体的概率,锚框到候选框的偏移量)。
RPN的损失函数
L ( p i , t i ) = 1 N c l s ∑ i L c l s ( p i , p i ∗ ) + λ 1 N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) L({p_i},{t_i})=\frac{1}{N_{cls}} \sum_i L_{cls}(p_i, p_i^*) + \lambda \frac{1}{N_{reg}}\sum_i p_i^* L_{reg}(t_i, t_i^*) L(pi,ti)=Ncls1i∑Lcls(pi,pi∗)+λNreg1i∑pi∗Lreg(ti,ti∗)
p i p_i pi 是第 i 个锚框预测包含物体的概率,由RPN输出
p i ∗ p_i^* pi∗ 由人为标注,表示第 i 个锚框是正样本则等于 1 ;是负样本则等于 0
什么是正样本与负样本
满足以下条件的Anchor是正样本:
- 与Ground Truth Box的IOU(Intersection-Over-Union) 的重叠区域最大的Anchor;
- 与Gound Truth Box的IOU的重叠区域>0.7;
满足以下条件的Anchor是负样本:
- 与Gound Truth Box的IOU的重叠区域 <0.3;
既不属于正样本又不属于负样本的Anchor不参与训练。
t i t_i ti 第 i 个锚框与预测的候选框的偏移
t i ∗ t_i^* ti∗ 第i 个锚框与真实的标注框的偏移
t i ∗ t_i^* ti∗ 的计算方法:
t x ∗ = ( x ∗ − x a ) / w a t_x^*=(x^*-x_a)/w_a tx∗=(x∗−xa)/wa
t y ∗ = ( y ∗ − y a ) / h a t_y^*=(y^*-y_a)/h_a ty∗=(y∗−ya)/ha
t w ∗ = l o g ( w ∗ / w a ) t_w^*=log(w^*/w^a) tw∗=log(w∗/wa)
t h ∗ = l o g ( h ∗ / h a ) t_h^*=log(h^*/h^a) th∗=log(h∗/ha)
其中 x ∗ , x a x^*,x^a x∗,xa 分别是真实框的中心点 x 坐标,和锚框的中心点 x 坐标
总之,由损失函数可知,RPN网络通过不断的梯度下降,最终使它预测数的、包含物体的候选框不断与真实框接近。
关于损失函数更多的内容可参见:
https://www.jianshu.com/p/7be554193a24
RPN网络的输出
RPN 网络诞生的目的就是给 Fast RCNN 提供候选框的,所以 RPN 网络输出的就是原图上的候选框,注意这里的锚框和候选框不是一回事,锚框是生成完大小和位置就不变的,候选框是根据锚框偏移得来的,在 RPN 网络过程中,会丢弃一些锚框(如超出边界的锚框)和候选框(被非极大抑制的)具体的可以参考 Faster RCNN 论文。
顺便一提,候选框与RPN输出的偏移值以及锚框的关系
x
=
t
x
∗
w
a
+
x
a
y
=
t
y
∗
h
a
+
y
a
w
=
e
t
w
∗
w
a
h
=
e
t
h
∗
h
a
x=t_x*w_a+x_a\\ y=t_y*h_a+y_a\\ w=e^{t_w}*w_a\\ h=e^{t_h}*h_a
x=tx∗wa+xay=ty∗ha+yaw=etw∗wah=eth∗ha
其中
x
,
y
,
w
,
h
x,y,w,h
x,y,w,h 是预测出的候选框的中心坐标与宽长,
x
a
,
y
a
,
w
a
,
h
a
x_a,y_a,w_a,h_a
xa,ya,wa,ha 是锚框的。
批标准化 Batch Normalization
参考:
https://www.cnblogs.com/guoyaohua/p/8724433.html
https://blog.csdn.net/pipisorry/article/details/52247379
论文 《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
什么是Batch Normalization(BN)
Batch (批)Normalization (标准化),即对一批数据进行标准化。
一个神经元可以表示为
z
=
w
x
+
b
a
=
f
(
z
)
z=\pmb w \pmb x + b\\ a=f(z)
z=wwwxxx+ba=f(z)
其中
x
\pmb x
xxx,
w
\pmb w
www ,
b
b
b, 分别被称为特征向量、权重向量、偏置值,
z
z
z 是一个标量,被称为净输入,
f
(
⋅
)
f(\cdot)
f(⋅) 是一个非线性激活函数,
f
(
z
)
f(z)
f(z) 的值
a
a
a 被称为活性值。
当一批特征向量输入神经元时,此时特征向量加上批维度变成了特征矩阵,净输入也变成了净输入矩阵,则上述表达式可以变为
z
=
W
X
+
b
\pmb z = \pmb W \pmb X +\pmb b
zzz=WWWXXX+bbb
当数据成批输入的时候,净输入也成为了净输入向量,批大小为
m
m
m 时,净输入向量
z
=
(
z
1
,
.
.
.
,
z
m
)
\pmb z=(z_1,...,z_m)
zzz=(z1,...,zm)
定义函数
B
N
(
z
)
=
z
−
m
e
a
n
(
z
)
s
t
d
(
z
)
BN(\pmb z)= \frac{\pmb z - mean(\pmb z)}{std(\pmb z)}
BN(zzz)=std(zzz)zzz−mean(zzz)
其中,
m
e
a
n
(
⋅
)
,
s
t
d
(
⋅
)
mean(\cdot),std(\cdot)
mean(⋅),std(⋅) 分别是平均值函数和标准差函数,他们返回一批净输入的平均值和标准差, 函数
B
N
(
⋅
)
BN(\cdot)
BN(⋅) 就是 Batch Normalization 即对这一批净输入(净输入向量)标准化
B
N
(
z
)
BN(\pmb z)
BN(zzz) 使一批净输入压缩到均值为 0 ,方差为 1,对于大多数非线性激活函数而言,这会使大多数值落入线性区间,因为非线性函数决定了神经元的拟合能力,所以为了不弱化神经元的拟合能力还有需要对
B
N
(
z
)
BN(\pmb z)
BN(zzz) 微调,定义函数
B
N
γ
,
β
(
z
)
=
γ
B
N
(
z
)
+
β
BN_{\gamma,\beta}(\pmb z)=\gamma BN(\pmb z)+ \beta
BNγ,β(zzz)=γBN(zzz)+β
这里的
γ
,
β
\gamma,\beta
γ,β 和普通神经元的
w
i
w_i
wi 一样都是可学习参数,最终经过 BN 处理的神经元应该表达为:
z
=
W
X
+
b
a
=
f
(
B
N
γ
,
β
(
z
)
)
\pmb z = \pmb W \pmb X +\pmb b\\ a=f(BN_{\gamma,\beta}(\pmb z))
zzz=WWWXXX+bbba=f(BNγ,β(zzz))
这里
X
\pmb X
XXX 是形如
(
m
,
.
.
.
)
(m,...)
(m,...) 的张量,
m
m
m 是批大小。
当 BN 应用在卷积神经网络中,和应用在神经元类似,设
X
\pmb X
XXX 是图或者特征图,它是形如
(
h
,
w
,
c
)
(h,w,c)
(h,w,c) 的张量,
h
,
w
,
c
h,w,c
h,w,c 分别表示图片的高、宽、通道数。定义
∗
*
∗ 为卷积操作,
W
\pmb W
WWW 为一个卷积核,则:
Z
=
X
∗
W
+
b
\pmb Z = \pmb X * \pmb W + b
ZZZ=XXX∗WWW+b
由卷积运算性质可知,图或特征图经过一个卷积核后,将形如
(
p
,
q
,
1
)
(p,q,1)
(p,q,1) 此时可将
Z
\pmb Z
ZZZ 视为一个平面图,
Z
\pmb Z
ZZZ 中的值视为像素值。
上述是一个特征图经过一个卷积核的情况,当引入批和多个卷积核的概念后,即 m 个特征图、每个特征图经过 n 个卷积核,此时卷积层净输入结果可表示为矩阵形式
[
Z
11
…
Z
1
n
⋮
⋱
⋮
Z
m
1
…
Z
m
n
]
m
×
n
\begin{bmatrix} \pmb Z_{11} & \dots & \pmb Z_{1n}\\ \vdots & \ddots & \vdots\\ \pmb Z_{m1} & \dots & \pmb Z_{mn} \end{bmatrix}_{m \times n}
⎣⎢⎡ZZZ11⋮ZZZm1…⋱…ZZZ1n⋮ZZZmn⎦⎥⎤m×n
该矩阵的一行,表示为一批中的一个特征图,经过 n 个卷积核后的输出;该行的一列表示,一批特征图经过一个卷积核的输出。
BN 在卷积层使用的时候,是求一批特征图经过一个卷积核的后的平均值和标准差,也就是说将上述矩阵视为列向量组:
设
b
i
=
[
Z
i
1
⋮
Z
i
m
]
\pmb b_i=\begin{bmatrix} \pmb Z_{i1} \\ \vdots \\ \pmb Z_{im} \end{bmatrix}\\
bbbi=⎣⎢⎡ZZZi1⋮ZZZim⎦⎥⎤
则
[
Z
11
…
Z
1
n
⋮
⋱
⋮
Z
m
1
…
Z
m
n
]
=
[
b
1
,
…
,
b
n
]
\begin{bmatrix} \pmb Z_{11} & \dots & \pmb Z_{1n}\\ \vdots & \ddots & \vdots\\ \pmb Z_{m1} & \dots & \pmb Z_{mn} \end{bmatrix} = \begin{bmatrix} \pmb b_1 ,\dots ,\pmb b_n \end{bmatrix}\\
⎣⎢⎡ZZZ11⋮ZZZm1…⋱…ZZZ1n⋮ZZZmn⎦⎥⎤=[bbb1,…,bbbn]
所以
B
N
(
[
Z
11
…
Z
1
n
⋮
⋱
⋮
Z
m
1
…
Z
m
n
]
)
=
[
B
N
(
b
1
)
,
…
,
B
N
(
b
n
)
]
BN(\begin{bmatrix} \pmb Z_{11} & \dots & \pmb Z_{1n}\\ \vdots & \ddots & \vdots\\ \pmb Z_{m1} & \dots & \pmb Z_{mn} \end{bmatrix}) = \begin{bmatrix} BN(\pmb b_1) ,\dots ,BN(\pmb b_n) \end{bmatrix}\\
BN(⎣⎢⎡ZZZ11⋮ZZZm1…⋱…ZZZ1n⋮ZZZmn⎦⎥⎤)=[BN(bbb1),…,BN(bbbn)]
其中
B
N
(
b
i
)
=
b
i
−
m
e
a
n
(
b
i
)
s
t
d
(
b
i
)
BN(\pmb b_i)=\frac{\pmb b_i - mean(\pmb b_i)}{std(\pmb b_i)}
BN(bbbi)=std(bbbi)bbbi−mean(bbbi)
那么接下来的问题就是一批特征图经过一个卷积核的后的平均值和标准差怎么求,还记得吗,批里的每个元素是形如
(
p
,
q
,
1
)
(p,q,1)
(p,q,1) 的平面图,所以可以理解为一批特征图经过一个卷积核后,得到的是一批平面图,这里一批平面图的均值就是其实求一批里每一张图片的每一个像素值的均值,即
m
e
a
n
(
[
Z
i
1
⋮
Z
i
m
]
)
=
∑
i
=
1
m
∑
j
=
1
p
∑
k
=
1
q
Z
i
[
j
]
[
k
]
m
×
p
×
q
mean(\begin{bmatrix} \pmb Z_{i1} \\ \vdots \\ \pmb Z_{im} \end{bmatrix}) = \frac{\sum_{i=1}^m\sum_{j=1}^p\sum_{k=1}^q\pmb Z_i[j][k]}{m\times p \times q}
mean(⎣⎢⎡ZZZi1⋮ZZZim⎦⎥⎤)=m×p×q∑i=1m∑j=1p∑k=1qZZZi[j][k]
标准差也同理。
最终还要为每一个
B
N
(
b
i
)
BN(\pmb b_i)
BN(bbbi) 加上两个可学习的系数,即
B
N
γ
i
,
β
i
(
b
i
)
=
γ
i
B
N
(
b
i
)
+
β
i
BN_{\gamma_i,\beta_i}(\pmb b_i)=\gamma_i BN(\pmb b_i) + \beta_i
BNγi,βi(bbbi)=γiBN(bbbi)+βi ,这里注意,不同的
B
N
(
b
i
)
BN(\pmb b_i)
BN(bbbi) 所加的系数是不共享的,所以 BN 最终输出为 :
[
B
N
γ
1
,
β
1
(
b
1
)
,
…
,
B
N
γ
n
,
β
n
(
b
n
)
]
\begin{bmatrix} BN_{\gamma_1,\beta_1}(\pmb b_1) ,\dots ,BN_{\gamma_n,\beta_n}(\pmb b_n) \end{bmatrix}\\
[BNγ1,β1(bbb1),…,BNγn,βn(bbbn)]
其中 n 为卷积核个数。
总结一下就是 M 个图片经过一个卷积网络 ,需要执行 M/m 次 BN ,m是批大小。一次 BN 涉及 n 个卷积核就需要 n 组 ( γ , β ) (\gamma,\beta) (γ,β) 可学习系数
为什么提出 BN
梯度消失问题
一批数据经过多层网络后,其数据所在区间可能会发生位移,以Sigmoid函数为例,如果数据不断向激活函数的两端位移,可能会导致梯度越来越小,导致反向传播时低层神经网络的梯度消失。
BN 在每次输入神经网络前都把数据拉回均值为 0 ,方差为 1 的分布情况,这样大多数数据都在一个梯度比较大的区间,不但解决了梯度消失问题,还提高了收敛速度。
Internal Covariate Shift 问题
Internal Covariate Shift (ICS,内部协变量位移)深度学习网络拥有多层神经网络,每层神经网络的输出值相较于其输入值都会略微改变数据的分布,当层数多了以后,输入数据的分布情况出现略微的改变,对于深层神经网络而言就是翻天覆地的变化。
根据经验,训练数据满足独立同分布的条件训练出的模型才具有更好的泛化能力,当网络层数多了以后,因为浅层网络的分布异常可能在深层网络中扩大,所以处于深层的网络接受的每一批数据所服从的分布可能相差比较大,深层网络的参量为了收敛一直在变来变去企图适应这种变化(所以称之为内部协变量位移,内部就是指深层网络),这会导致收敛速度非常慢。
BN 就是一种解决办法,通过 BN 把每层神经网络的输入重新拉会均值为 0 ,方差为 1 的分布情况,对于数据分布的改变起到一定的抑制作用,当然保证均值和方差一致也不能保证分布就一直,但是聊胜于无。
Train 和 Inference 过程中的 BN
训练过程中,不可把 BN 中的均值和方差视为常量,实际上他们也是关于参量的函数
每次训练时,会从每个Mini-Batch里m个训练实例获得的均值和方差,记住这些均值和方差,推断时,把这些均值和方差的期望作为推断的输入数据的均值和方差进行 BN 。