赞
踩
卷积神经网络(Convolution Neural Network)可以简单理解为包含卷积操作且具有深度结构的网络,通过权值共享和局部连接的方式对数据进行特征提取并进行预测的过程。在实际应用中往往采用多层网络结构,因此又被称为深度卷积神经网络。卷积神经网络通过反馈修正卷积核和偏置参数使输出与预测偏差减小。所以,构建卷积神经网络进行深度学习开发其实并不复杂。可以从四个方面展开:输入输出、网络结构、损失函数、评价指标。
卷积神经网络的输入分为两部分,一是数据,二是标签。针对计算机视觉任务来说,通常数据指的是图像数据。标签是针对图像的真实值,针对不同任务有着不同的标签,例如图像分类任务的标签是图像的类别,目标检测任务的标签是图像中的目标的类别和坐标信息等。这类标签信息一般通过人工标定方式(或者自动标定工具)生成。例如VIA标注工具。
卷积神经网络的基本结构由以下几个部分组成:输入层(input layer),卷积层(convolution layer),池化层(pooling layer),激活函数层和全连接层(full-connection layer)。下面以图像分类任务简单介绍一下卷积神经网络结构,具体结构如下图所示。
图像分类任务是输入层是 H ∗ W ∗ C H*W*C H∗W∗C的图像,其中H是指图像的长度,W是图像的宽度,C指的是图像的channel数,一般灰度图的channel数为1,彩色图的channel数为3。
卷积神经网络的核心是卷积层,卷积层的核心部分是卷积操作。
卷积层有四个重要的超参数:卷积核的大小F、卷积核的个数K、卷积的步长S和零填充数量P。
假设输入的参数为:
H
×
W
×
D
H×W×D
H×W×D的一个Tensor,则经过一个大小为、个数为K,步长为S和零填充数量为P的卷积操作后输出的参数为:
H
′
=
(
H
−
F
+
2
P
)
/
S
+
1
W
′
=
(
W
−
F
+
2
P
)
/
S
+
1
D
′
=
K
关于卷积计算可以参考这篇文章,我的下面图片就引自该问文,链接: 原来卷积是这么计算的_月来客栈。
其中卷积层的操作可分为四种,分别为:
channel数为1的图像的单一卷积核的计算过程如下图所示:
具体计算过程如下图:
channel数为3的图像的单一卷积核的计算过程如下图所示:
具体计算过程如下图:
channel数为3的图像的多卷积核的计算过程如下图所示:
计算得到的结果如下图:
# With square kernels and equal stride
m = nn.Conv2d(16, 33, 3, stride=2)
# non-square kernels and unequal stride and with padding
m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
# non-square kernels and unequal stride and with padding and dilation
m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1))
input = torch.randn(20, 16, 50, 100)
output = m(input)
一些轻量级的网络,如mobilenet中,会有深度可分离卷积depthwise separable convolution,由depthwise(DW)和pointwise(PW)两个部分结合起来,用来提取特征feature map。
相比常规的卷积操作,其参数数量和运算成本比较低。
普通卷积的计算图如下:
输入为3个channel,输出为4个channel,共需要4个filter,每个filter中都有3个channel,与输入的feature map channel一致。每个channel的卷积核大小为
3
×
3
3\times3
3×3。它的计算量如下:
N_std = 4 × 3 × 3 × 3 = 108
Separable Convolution在Google的Xception以及MobileNet论文中均有描述。它的核心思想是将一个完整的卷积运算分解为两步进行,分别为Depthwise Convolution与Pointwise Convolution。
Depthwise Convolution的计算图如下:
输入同样为3个channel,Depthwise Convolution首先采用3个Filter分别对3个channel进行卷积操作,得到3个feature map。
参数量为:
N_depthwise = 3 × 3 × 3 = 27
它可以实现每个channel上的卷积,但无法利用不同channel上相同位置的信息。因此,后续需要Pointwise Convolution来将不同channel上的相同位置的信息融合到一起。
Pointwise Convolution的计算图如下:
Pointwise Convolution的运算与常规卷积运算非常相似,它类似于
1
×
1
1\times1
1×1卷积,channel数为输入feature map的channel,Filter数量为输出feature map的数量。其参数量为:
N_pointwise = 1 × 1 × 3 × 4 = 12
经过Depthwise Convolution与Pointwise Convolution,得到了与普通卷积一样的结果,下面让我们分析一下参数量上的差异。
参数对比
常规卷积的参数个数为:
N_std = 4 × 3 × 3 × 3 = 108
Separable Convolution的参数由两部分相加得到:
N_depthwise = 3 × 3 × 3 = 27
N_pointwise = 1 × 1 × 3 × 4 = 12
N_separable = N_depthwise + N_pointwise = 39
相同的输入,同样是得到4张Feature map,Separable Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Separable Convolution的神经网络层数可以做的更深。
池化操作将输入矩阵某一位置相邻区域的总体统计特征作为该位置的输出,主要有平均池化(Average Pooling)、最大池化(Max Pooling)等。卷积的作用为:对每一个特征响应图独立进行, 降低特征响应图组中每个特征响应图的宽度和高度,减少后续卷积层的参数的数量, 降低计算资源耗费,进而控制过拟合,简单来说池化就是在该区域上指定一个值来代表整个区域。
池化层的超参数:池化窗口和池化步长。
池化操作也可以看做是一种卷积操作,下面我们以最大池化来解释池化操作,具体操作如下图所示:
卷积的作用:
激活函数(非线性激活函数,如果激活函数使用线性函数的话,那么它的输出还是一个线性函数。)但使用非线性激活函数可以得到非线性的输出值。常见的激活函数有Sigmoid、tanh和Relu等。激活函数主要分为饱和激活函数(Saturated Neurons)和非饱和函数(One-sided Saturations)。Sigmoid和Tanh是饱和激活函数,而ReLU以及其变种为非饱和激活函数。非饱和激活函数主要有如下优势:
一般我们使用Relu作为卷积神经网络的激活函数。
Relu激活函数提供了一种非常简单的非线性变换方法,它的公式为:
f
(
u
)
=
m
a
x
(
0
,
u
)
f(u)= max(0,u)
f(u)=max(0,u)
函数图像如下所示:
ReLU激活函数相比Sigmoid、tanh等有的优点为:
1、速度快,和sigmoid函数需要计算指数和倒数相比,relu函数其实就是一个
m
a
x
(
0
,
u
)
max(0,u)
max(0,u),计算代价小。
2、稀疏性,通过对大脑的研究发现,大脑在工作的时候只有大约5%的神经元是激活的,而采用sigmoid激活函数的激活率大约是50%。有论文声称人工神经网络在15%-30%的激活率时是比较理想的。因为Relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率。
3、ReLU的求导特性也非常的好。当输⼊为负时, ReLU函数的导数为0,⽽当输⼊为正时, ReLU函数的导数为1。这就意味着要么让参数消失,要么让参数通过。并且ReLU减轻了困扰以往神经⽹络的梯度消失问题。
注意: ReLU函数有许多变体,包括参数化ReLU(Parameterized ReLU, pReLU)函数。该变体为ReLU增减了一个线性项,因此即使参数是负的,某些信息仍然可以通过:
p
R
e
L
U
=
m
a
x
(
0
,
x
)
+
α
m
i
n
(
0
,
x
)
pReLU = max(0,x)+\alpha min(0,x)
pReLU=max(0,x)+αmin(0,x)
全连接层在卷积神经网络中起到分类器的作用,如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。
Batch Normalization(简称BN),是在深度学习中普遍使用的一项技术,通常用于解决多层神经网络中间层的**协方差偏移(Internal Covariate Shift)**问题,类似于对网络输入进行零均值化和方差归一化的操作,只不过是在中间层的输入中操作。
注意图中最后的公式
y
i
←
γ
x
^
i
+
β
y_i \gets \gamma\hat{x}_i+\beta
yi←γx^i+β,它代表着放射(affine),引入这一步的主要设设计一个通道,使得输出至少能够回到输入的状态(当
γ
=
1
,
β
=
0
\gamma=1,\beta=0
γ=1,β=0时),使得BN的引入至少不会掉地模型的表现。
注意: BN中一共有4个参数需要我们考虑:
weight
和bias
表示。running_mean
与running_var
表示,这里的running
指的就是当前的统计参数不一定只与当前输入的mini-batch决定,还可能与历史的输入batch有关。nn.BatchNorm2d()
,实际中的BN是针对channel进行的,当我们输入的特征为
X
∈
R
B
×
C
×
W
×
H
X \in \mathbb{R}^{B \times C\times W\times H}
X∈RB×C×W×H,其中
μ
B
∈
R
C
,
σ
B
2
∈
R
C
,
γ
∈
R
C
,
β
∈
R
C
\mu_B \in \mathbb{R}^C, \sigma_B^2 \in \mathbb{R}^C, \gamma \in \mathbb{R}^C,\beta \in \mathbb{R}^C
μB∈RC,σB2∈RC,γ∈RC,β∈RC,我们发现无论是学习参数还是统计参数都与通道数有关,通过pytorch中的_NormBase
层的部分初始代码可以发现这一现象。class _NormBase(Module): """Common base of _InstanceNorm and _BatchNorm""" _version = 2 __constants__ = ['track_running_stats', 'momentum', 'eps', 'num_features', 'affine'] def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True, track_running_stats=True): super(_NormBase, self).__init__() self.num_features = num_features self.eps = eps self.momentum = momentum self.affine = affine self.track_running_stats = track_running_stats if self.affine: self.weight = Parameter(torch.Tensor(num_features)) self.bias = Parameter(torch.Tensor(num_features)) else: self.register_parameter('weight', None) self.register_parameter('bias', None) if self.track_running_stats: self.register_buffer('running_mean', torch.zeros(num_features)) self.register_buffer('running_var', torch.ones(num_features)) self.register_buffer('num_batches_tracked', torch.tensor(0, dtype=torch.long)) else: self.register_parameter('running_mean', None) self.register_parameter('running_var', None) self.register_parameter('num_batches_tracked', None) self.reset_parameters()
Pytorch中的BatchNorm的API主要有:
torch.nn.BatchNorm1d(num_features,
eps=1e-05,
momentum=0.1,
affine=True,
track_running_stats=True)
pytorch中的模型都是继承自nn.Module
类,都有一个training
属性判断是否处于训练状态,训练状态与否将影响到某些层的参数是否是固定的,比如BN
与Dropout
层。通常model.train()
用于指定当前model
为训练状态,而model.eval()
用于指定当前模型为验证状态。
BN的API中有几个参数需要关心,具体如下:
affine
指定是否需要仿射,若affine=False
,则
γ
=
1
,
β
=
0
\gamma=1,\beta=0
γ=1,β=0,并且不能学习与更新。track_running_stats=True
用于跟踪整个训练过程中的batch的统计特性,得到均值和方差,而不仅仅依赖当前输入的batch的统计特性。如果在模型的推理阶段,track_running_stats=False
,此时如果batch_size较小,则其统计特性和全局统计特性有着较大的差异,导致结果不太好。momentum
是用于在对统计参数进行更新过程中,进行指数平滑时使用,使用该参数后统计参数的更新策略变为:
x
^
n
e
w
=
(
1
−
m
o
m
e
n
t
u
m
)
×
x
^
+
m
o
m
e
n
t
u
m
×
x
t
\hat{x}_{new}=(1-momentum) \times \hat{x}+momentum \times x_t
x^new=(1−momentum)×x^+momentum×xt 默认的momentum=0.1
,该参数只有在training=True
与 track_running_stats=True
的情况下才会进行。running_mean
和running_var
的更新是在forward()
操作中进行的,而不是optimizer.step()
中进行的,因此如果处于训练状态,就算你不进行手动step(),BN的统计特性也会变化的。model.eval()
转到测试阶段,才可以固定BN层中的running_mean
和running_var
。import torch import torch.nn as nn from torch.nn import init from torchvision import models from torch.autograd import Variable from apex.fp16_utils import * def fix_bn(m): classname = m.__class__.__name__ if classname.find('BatchNorm') != -1: m.eval() model = models.resnet50(pretrained=True) model.cuda() model = network(model) model.train() model.apply(fix_bn) # fix batchnorm input = Variable(torch.FloatTensor(8, 3, 224, 224).cuda()) output = model(input) output_mean = torch.mean(output) output_mean.backward()
总结来说,在某些情况下,即便整体的模型处于model.train()的状态,但是某些BN层也可能需要按照需求设置为model_bn.eval()的状态。
在卷积神经网络中,我们会使用如梯度下降法(Gradient Descent) 等方法去最小化目标函数。但怎样来衡量优化目标函数的好坏呢,这就用到了损失函数。卷积神经网络中损失函数是用于衡量模型所作出的预测值和真实值(Ground Truth)之间的偏离程度,大致可分为两种:分类损失(针对离散型量)和回归损失(针对连续型变量)。
即“熵”,熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在信息论里面, 熵是用于描述对事件不确定性的度量,它的计算公式如下:
E
n
t
r
o
p
y
,
H
(
p
)
=
−
Σ
p
(
x
i
)
∗
l
o
g
2
(
p
(
x
i
)
)
Entropy,H(p) = -\varSigma p(x_i)*log_2(p(x_i))
Entropy,H(p)=−Σp(xi)∗log2(p(xi))
其中
p
(
i
)
p(i)
p(i)为事件的概率分布,下面以一个例子来解释一下该公式。
假设气象台告知我们明天晴天的概率为25%,下雨的概率为75%,则气象站传输给我们的信息熵为:
−
(
0.25
∗
l
o
g
2
(
0.25
)
+
0.75
∗
l
o
g
2
(
0.75
)
)
=
0.81
-(0.25*log2(0.25) + 0.75*log2(0.75)) =0.81
−(0.25∗log2(0.25)+0.75∗log2(0.75))=0.81
如下图所示:
在卷积神经网络中,比如分类任务中,其实也是在做一个判断一个物体到底是不是属于某个类别,其中不确定性就越大,其信息量越大,它的熵值就越高。
相对熵又称KL散度,用于衡量对于同一个随机变量x的两个分布p(x)和q(x)之间的差异。在机器学习中,p(x)常用于描述样本的真实分布,例如[1,0,0,0]表示样本属于第一类,而q(x)则常常用于表示预测的分布,例如[0.7,0.1,0.1,0.1]。显然使用q(x)来描述样本不如p(x)准确,q(x)需要不断地学习来拟合准确的分布p(x)。
KL散度的计算公式为:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
2
(
p
(
x
i
)
q
(
x
i
)
)
D_{KL}(p||q) = \displaystyle\sum_{i=1}^n p(x_i) log_2(\frac {p(x_i)} {q(x_i)})
DKL(p∣∣q)=i=1∑np(xi)log2(q(xi)p(xi))
KL散度的值越小表示两个分布越接近。
我们将KL散度的公式进行变形,得到:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
(
x
i
)
l
o
g
2
(
p
(
x
i
)
)
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
2
(
q
(
x
i
)
)
=
−
H
(
p
(
x
)
)
+
[
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
2
(
q
(
x
i
)
)
]
D_{KL}(p||q) = \displaystyle\sum_{i=1}^n p(x_i) log_2(p(x_i))- \displaystyle\sum_{i=1}^n p(x_i) log_2(q(x_i)) =-H(p(x))+[-\displaystyle\sum_{i=1}^n p(x_i) log_2(q(x_i))]
DKL(p∣∣q)=i=1∑np(xi)log2(p(xi))−i=1∑np(xi)log2(q(xi))=−H(p(x))+[−i=1∑np(xi)log2(q(xi))]
前半部分就是p(x)的熵,它是一个定值,后半部分就是我们的交叉熵:
C
r
o
s
s
E
n
t
r
o
p
y
,
H
(
p
,
q
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
2
(
q
(
x
i
)
)
Cross Entropy,H(p,q) = -\displaystyle\sum_{i=1}^n p(x_i) log_2(q(x_i))
CrossEntropy,H(p,q)=−i=1∑np(xi)log2(q(xi))
我们常常使用KL散度来评估predict和label之间的差别,但是由于KL散度的前半部分是一个常量,所以我们常常将后半部分的交叉熵作为损失函数。假设我们当前做一个3个类别的图像分类任务,如猫、狗、猪。给定一张输入图片其真实类别是猫,模型通过训练用Softmax分类后的输出结果为:{“cat”: 0.3, “dog”: 0.45, “pig”: 0.25},那么此时交叉熵为:-1 * log(0.3) = 1.203。当输出结果为:{“cat”: 0.5, “dog”: 0.3, “pig”: 0.2}时,交叉熵为:-1 * log(0.5) = 0.301。可以发现,当预测值接近真实值时,损失将接近0。
Focal loss是最初由何恺明提出的,最初用于图像领域解决数据不平衡造成的模型性能问题。
具体介绍可以参考:https://zhuanlan.zhihu.com/p/266023273
也称为Mean Absolute Error,即平均绝对误差(MAE),它衡量的是预测值与真实值之间距离的平均误差幅度,作用范围为0到正无穷。其公式如下:
l
o
s
s
=
∑
i
=
1
n
∣
y
i
−
y
^
i
∣
loss = \displaystyle\sum_{i=1}^n|y_i - \hat y_i|
loss=i=1∑n∣yi−y^i∣
MAE在
y
−
f
(
x
)
y-f_{(x)}
y−f(x)处不可导,求导计算困难,由于其呈现V状,大部分情况下梯度都是相等的,这意味着对于较小损失梯度也很大,不利于模型的学习与损失函数收敛。
为了简化讨论,忽略下标 i,m = 1,以 y-f(x) 为横坐标,MSE 为纵坐标,绘制其损失函数的图形:
也称为Mean Squred Error,即均方差(MSE),它衡量的是预测值与真实值之间距离的平方和,作用范围同为0到正无穷。其公式如下:
l
o
s
s
=
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
loss = \displaystyle\sum_{i=1}^n(y_i - \hat y_i)^2
loss=i=1∑n(yi−y^i)2
为了简化讨论,忽略下标 i,m = 1,以 y-f(x) 为横坐标,MSE 为纵坐标,绘制其损失函数的图形:
MSE是二次函数,其特点是光滑连续、可导。同时当误差大于1时,可以给予更大的惩罚,对与误差小于1给予更小的惩罚。
从训练的角度来讲,模型更加偏向于惩罚较大的点,赋予的权重也更大。但如果存在离群点,MSE会赋予更高的权重,但却牺牲了正常数据的预测作为代价。
L1损失函数相比于L2损失函数的鲁棒性更好,因为L2将误差平方化(如果误差大于1,则误差会放大很多),模型的误差会比L1范数大的多,因此模型会对这种类型的样本更加敏感,这就需要调整模型来最小化误差。
但L2收敛速度快,能够对梯度给予合适的惩罚权重,而不是“一视同仁”,使梯度更新的方向可以更加精确。
即平滑的L1损失(SLL),出自Fast RCNN。SLL通过综合L1和L2损失的优点,在0点处附近采用了L2损失中的平方函数,解决了L1损失在0点处梯度不可导的问题,使其更加平滑易于收敛。此外,在|x|>1的区间上,它又采用了L1损失中的线性函数,使得梯度能够快速下降。
s
m
o
o
t
h
L
(
x
)
=
x
=
{
0.5
x
2
if
∣
x
∣
<
1
∣
x
∣
−
0.5
otherwise
smooth_L(x) = x =
Huber loss具有MAE与MSE的优点,通过一个超参数
δ
\delta
δ来控制:
L
δ
(
y
,
f
(
x
)
)
=
{
1
/
2
(
y
−
f
(
x
)
)
2
∣
y
−
f
(
x
)
∣
≤
δ
δ
∣
y
−
f
(
x
)
∣
−
1
/
2
(
δ
)
2
∣
y
−
f
(
x
)
∣
>
δ
L_{\delta}(y,f{(x)}) =
Huber Loss 是对二者的综合,包含了一个超参数
δ
\delta
δ 。
δ
\delta
δ 值的大小决定了 Huber Loss 对 MSE 和 MAE 的侧重性,当
∣
y
−
f
(
x
)
∣
≤
δ
|y-f(x)|\leq \delta
∣y−f(x)∣≤δ时,变为 MSE;当
∣
y
−
f
(
x
)
∣
>
δ
|y-f(x)|>\delta
∣y−f(x)∣>δ时,则变成类似于 MAE,因此 Huber Loss 同时具备了 MSE 和 MAE 的优点,减小了对离群点的敏感度问题,实现了处处可导的功能。
通常来说,超参数
δ
\delta
δ可以通过交叉验证选取最佳值。下面,分别取
δ
=
0.1
、
δ
=
10
\delta=0.1、\delta=10
δ=0.1、δ=10,绘制相应的 Huber Loss,如下图所示:
评价指标是用来定量衡量模型的性能的,是作为各种模型比较的一个标准。卷积神经网络评价指标分为分类任务评价指标和回归任务评价指标。
混淆矩阵是最基础的概念,也是最重要的概念。混淆矩阵如下表所示:
正例(预测值) | 反例(预测值) | |
---|---|---|
正例(真实值) | TP(True Positive) | FN(False Negative) |
反例(真实值) | FP(False Positive) | TN(True Negative) |
准确率(Accuracy):
A
c
c
u
r
a
c
y
=
(
T
P
+
T
N
)
(
T
P
+
F
N
+
F
P
+
T
N
)
=
预测正确样本数
总的样本数
Accuracy = \frac {(TP+TN)} {(TP+FN+FP+TN)} = \frac {预测正确样本数}{总的样本数}
Accuracy=(TP+FN+FP+TN)(TP+TN)=总的样本数预测正确样本数
精确度:
P
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
=
预测正确的正样本数
预测为正的样本数
Precision = \frac {TP}{TP+FP} =\frac {预测正确的正样本数}{预测为正的样本数}
Precision=TP+FPTP=预测为正的样本数预测正确的正样本数
或
P
r
e
c
i
s
i
o
n
=
T
N
T
N
+
F
N
=
预测正确的正样本数
预测为负的样本数
Precision = \frac{TN}{TN+FN} =\frac {预测正确的正样本数}{预测为负的样本数}
Precision=TN+FNTN=预测为负的样本数预测正确的正样本数
召回率:
R
e
c
a
l
l
=
T
P
T
P
+
F
N
=
预测正确的正样本数
真实标签为正确的样本数
Recall = \frac {TP}{TP+FN} = \frac {预测正确的正样本数}{真实标签为正确的样本数}
Recall=TP+FNTP=真实标签为正确的样本数预测正确的正样本数
F1-score:
F
1
s
c
o
r
e
=
2
∗
P
r
e
c
i
s
i
o
n
∗
R
e
c
a
l
l
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
F1score = \frac {2*Precision*Recall }{Precision+Recall }
F1score=Precision+Recall2∗Precision∗Recall
Precision/Recall曲线也叫做P-R曲线,其代表的是精准率(查准率)与召回率(查全率)的关系,Precision与Recall是一对矛盾的变量。如下图所示:
其中,曲线与坐标值面积越大,性能越好(能更大的提升精确度和召回率);但是有时面积不好计算,那么就选择
y
=
x
y = x
y=x与P-R曲线的交点也叫作平衡点(BEP)比较BEP,越大的学习器越优。
但PR曲线对正负样本不均衡问题较敏感。
ROC曲线的横坐标是false positive rate(FPR):
F
P
R
=
F
P
F
P
+
T
N
=
将反例预测为正例的样本数
标签为反的样本数
FPR = \frac {FP}{FP+TN} = \frac {将反例预测为正例的样本数}{标签为反的样本数}
FPR=FP+TNFP=标签为反的样本数将反例预测为正例的样本数
纵坐标为true positive rate(TPR):
T
P
R
=
T
P
T
P
+
F
N
=
将正例预测为正例的样本数
标签为正的样本数
TPR = \frac {TP}{TP+FN} = \frac {将正例预测为正例的样本数}{标签为正的样本数}
TPR=TP+FNTP=标签为正的样本数将正例预测为正例的样本数
其中ROC曲线对正负样本不均衡问题不敏感。
IOU多用于检测、分割任务中,它的计算公式如下所示:
I O U = A ⋂ B A ⋃ B IOU = \frac {A \bigcap B}{A \bigcup B} IOU=A⋃BA⋂B
PR曲线下的面积就定义为AP,由于计算积分相对困难,因此引入插值法,计算AP公式如下:
A
P
=
∑
k
=
1
N
max
k
′
≥
k
P
(
k
′
)
Δ
r
(
k
)
AP= \displaystyle\sum_{k=1}^N \max _{ k' \geq k}P(k') \varDelta{ r(k)}
AP=k=1∑Nk′≥kmaxP(k′)Δr(k)
计算面积:
计算公式:
在这篇文章中,亦岚君首先引入了卷积的四个主要知识:输入输出、网络结构、损失函数和评价指标。然后围绕着这五个问题依次做了简单介绍。本次内容就到此结束,感谢您的阅读!如果你觉得上述内容对你有所帮助,欢迎关注并传播本文!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。