目录
深度学习中,从简单的分类任务,到复杂的检测任务,姿态估计等任何任务,都必须包含一个函数的定义:损失函数。
直观意思就是,模型预测出来的东西和实际ground truth区别有多大,只要设置的损失函数符合二者之间差别越大损失函数越大,差别越小损失函数越小,就挺好
损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。
0-1损失函数(zero-one loss)
- 对应分类判断错误的个数,但是是一个非凸函数
- 感知机用这种损失函数,有时Y=f(x)放宽为 |Y-f(x)|<T
log对数损失函数
(1) log对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。
(2)健壮性不强,相比于hinge loss对噪声更敏感。
(3)逻辑回归的损失函数就是log对数损失函数。
L2 Loss 、 L1 Loss
收敛速度快于L1 Loss
L1 loss在0处导数不唯一,可能影响收敛(可以用smooth L1 Loss替代,x<1时使用x平方)
相比于L2损失函数,L1对离群点、异常值(outlier)不敏感,梯度变化相对更小,训练时不容易跑飞。 Fast RCNN使用Smooth L1损失函数
1处导数相等,因而可以作为切换函数的分界线
几个概念:
L2 范数:
L2正则化
交叉熵损失函数 (Cross-entropy loss function)
二分类时loss=
注意公式中x 表示样本, y表示预测的输出, a 表示实际的输出,n表示样本总数量。
多分类时(输入数据是softmax或者sigmoid函数的输出):
import numpy as np
def cross_entropy(Y, P):
"""Cross-Entropy loss function.
以向量化的方式实现交叉熵函数
Y and P are lists of labels and estimations
returns the float corresponding to their cross-entropy.
"""
Y = np.float_(Y)
P = np.float_(P)
return -np.sum(Y * np.log(P) + (1 - Y) * np.log(1 - P)) / len(Y)
OpenPose中使用的损失函数:
其中
Faster RCNN中使用的损失函数:
Smooth L1 Loss,一般以x与1比大小为界限,faster中σ = 3
cls分类损失:
(一)训练RPN时二分类,RPN产生的anchor,背景为0,前景为1,训练时选256个anchor,
(二)Fast RCNN 多分类损失
多分类交叉熵损失
选出128个rois ,
cross_entropy = tf.reduce_mean(
tf.nn.sparse_softmax_cross_entropy_with_logits(
logits=tf.reshape(cls_score, [-1, self._num_classes]), labels=label))
reg回归损失:
这是一个向量,表示anchor,RPN训练时预测的偏移量
是与ti同维度的,是GT实际偏移量
R是smoothL1 函数,这里σ = 3,RPN训练(σ = 1,Fast RCNN训练)
对于每一个anchor 计算完Lreg部分后还要乘以P*,如前所述,P*有物体时(positive)为1,意味着只有前景才计算损失,背景不计算损失。inside_weights就是这个作用。
(之所以以RPN训练为前提因为此时batch size = 256,如果是fast rcnn,batchsize = 128)
Fast升级: SVM变成softmax ,每张图3s , SS每张图2s
Faster:region proposal和Fast RCNN统一
输入原图尺寸不限,有归一化尺度,网络输入尺度:输入特征检测网络的大小,在训练时设置,源码中为224*224。
只是在CNN上额外增加了2个卷积层(全卷积层cls和reg)
①将每个特征图的位置编码成一个特征向量(256d for ZF and 512d for VGG)。
②对每一个位置输出一个objectness score和regressedbounds for k个region proposal,即在每个卷积映射位置输出这个位置上多种尺度(3种)和长宽比(3种)的k个(33=9)区域建议的物体得分和回归边界。
RPN网络的输入可以是任意大小(但还是有最小分辨率要求的,例如VGG是228228)的图片。如果用VGG16进行特征提取,那么RPN网络的组成形式可以表示为VGG16+RPN。
4K个 reg layer层的参数
2k个softmax clslayer层的参数
Faster R-CNN卷积流程图
ssd中使用的损失函数:
loc的损失函数: smooth L1
y_true: shape: ( batch , n_boxes , 4 ) , 最后一个维度包括(xmin , xmax , ymin , ymax)
def smooth_L1_loss(self , y_true , y_pred):
absolute_loss = tf.abs(y_true - y_pred)
square_loss = 0.5*(y_true - y_pred)**2
l1_loss = tf.where(tf.less(absolute_loss , 1.0) , square_loss , absolute_loss-0.5)
return tf.reduce_sum(l1_loss , axis=-1)
conf损失函数: Log loss
y_true shape:(batch_size, n_boxes, n_classes)
def log_loss(self, y_true, y_pred):
# 确保y_pred中不含0,否则会使log函数崩溃的
y_pred = tf.maximum(y_pred, 1e-15)
# Compute the log loss
log_loss = -tf.reduce_sum(y_true * tf.log(y_pred), axis=-1)
return log_loss
来源:CSDN
作者:进击的煎饼果子
链接:https://blog.csdn.net/u012925946/article/details/103883410