损失函数的学习与选择

隐身守侯 提交于 2020-01-11 01:04:35


深度学习中,从简单的分类任务,到复杂的检测任务,姿态估计等任何任务,都必须包含一个函数的定义:损失函数。
直观意思就是,模型预测出来的东西和实际ground truth区别有多大,只要设置的损失函数符合二者之间差别越大损失函数越大,差别越小损失函数越小,就挺好

损失函数分为经验风险损失函数结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。

0-1损失函数(zero-one loss)

L(Y,f(X))={1,Yf(X)0,Y=f(X) L(Y, f(X))=\left\{\begin{array}{l}{1, Y \neq f(X)} \\ {0, Y=f(X)}\end{array}\right.

  1. 对应分类判断错误的个数,但是是一个非凸函数
  2. 感知机用这种损失函数,有时Y=f(x)放宽为 |Y-f(x)|<T

log对数损失函数

L(Y,P(YX))=logP(YX) L(Y, P(Y | X))=-\log P(Y | X)
(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=
C=1nx[ylna+(1y)ln(1a)] C=-\frac{1}{n} \sum_{x}[y \ln a+(1-y) \ln (1-a)]
注意公式中x 表示样本, y表示预测的输出, a 表示实际的输出,n表示样本总数量。
多分类时(输入数据是softmax或者sigmoid函数的输出):

loss=1niyilnai \text {loss}=-\frac{1}{n} \sum_{i} y_{i} \ln a_{i}

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中使用的损失函数:

1
其中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Faster RCNN中使用的损失函数:

Smooth L1 Loss,一般以x与1比大小为界限,faster中σ = 3
smoothL1(x)={0.5x2×1/σ2 if x<1/σ2x0.5 otherwise  \operatorname{smooth}_{L_{1}}(x)=\left\{\begin{array}{ll}{0.5 x^{2} \times 1 / \sigma^{2}} & {\text { if }|x|<1 / \sigma^{2}} \\ {|x|-0.5} & {\text { otherwise }}\end{array}\right.
在这里插入图片描述
cls分类损失:
(一)训练RPN时二分类,RPN产生的anchor,背景为0,前景为1,训练时选256个anchor,N cls =256N~cls~ =256
在这里插入图片描述
(二)Fast RCNN 多分类损失
多分类交叉熵损失
选出128个rois ,N cls =128N~cls~ =128

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训练时预测的偏移量
ti2t_{i}^{2}是与ti同维度的,是GT实际偏移量
Lreg(t,ti)=R(titi) L_{r e g}\left(t, t_{i}^{*}\right)=R\left(t_{i}-t_{i} *\right)
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是228
228)的图片。如果用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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!