pytorch模型构建(四)——常用的回归损失函数

pytorch模型构建(四)——常⽤的回归损失函数
抗石击涂料
⼀、简介
损失函数的作⽤: 主要⽤于深度学习中predict与True label “距离”度量或者“相似度度量”,并通过反向传播求梯度,进⽽通过梯度下降算法更新⽹络参数,周⽽复始,通过损失值和评估值反映模型的好坏。
损失函数的分类: 主要分为回归损失函数和分类损失函数。
回归损失函数: reg_loss(回归预测⼀个具体的数值,真实的⼀个具体值),⽐如我要预测⼀个矩形框的宽⾼,⼀般来说可以使任意值。⼀般的回归会将预测的值设计到⼀个较⼩的范围⽐如0~1范围内,这样可以加速模型收敛,要不然模型前期预测的数值“乱跳”,出现波动的情况。⼀般有L1 Loss、L2 Loss、Smooth L1 Loss,以及在⼀些任务如⽬标检测中根据场景设置的loss如,IOU Loss、GIOU Loss、DIOU Loss、CIOU Loss。
分类损失函数: reg_loss(回归预测⼀个具体的数值,真实的⼀个具体值),⽐如我要预测⼀个矩形框的宽⾼,⼀般来说可以使任意值。⼀般的回归会将预测的值设计到⼀个较⼩的范围⽐如0~1范围内,这样可以加速模型收敛,要不然模型前期预测的数值“乱跳”,出现波动的情况。⼀般有CrossEntropy Loss、NLL Loss、KLDiv Loss、BCE Loss、BCE With Logits Loss、Margin Ranking Loss、Hinge Embedding Loss、Huber Loss等。
需要注意的:
假牙清洁剂pytorch损失函数中⼀般有size_average、size_average、reduction这三个参数。
这三个参数决定损失函数是1.只求是loss; 2. 对loss求和;3. 对loss求平均。
(deprecated表⽰此⽅法已废弃、暂时可⽤,但以后该⽅法不会再更新,建议后来⼈不要调⽤此⽅法。)
size_average 和reduce 是deprecated,两个之间是有关系的。⽬前使⽤的reduction。
uv喷涂工艺Reduce size_average result
False-  1. 只是求loss(忽略size_average参数)
True False  2. 对loss求和
True True  3. 对loss求平均值
Reduce result
‘None’  1. 只是求loss(忽略size_average参数)
‘sum’  2. 对loss求和
‘mean’  3. 对loss求平均值
⼆、回归损失函数
回归问题就是预测出具体的数值,⽐如我要预测电池电压的具体值,具体值不是固定的,分类问题就是我要预测电池电压值处于故障状态类别还是正常状态类别,类别数⽬是固定的。
1. L1 Loss(绝对值损失)
介绍
L1 Loss即平均绝对误差(Mean Absolute Error, MAE),公式为:
就是求预测值和真实值误差的绝对值。l(x,y)=∣x−
N
1
i=1
∑N
i y∣i
代码
loss = nn .L1Loss () # 这⾥的default 值是‘mean’即求平均的,因为反向传播、梯度计算损失值要求是标量值input  = torch .randn (3, 5, requires_grad =True )target = torch .randn (3, 5)output = loss (input , target )
output .backward () # 如果损失值是⼀个向量,则此处会报错
2. L2 Loss (MSE Loss)(平⽅损失)
介绍:
L2 Loss即均⽅差(Mean Squred Error, MSE),公式为:
就是求预测值和真实值误差的绝对值。
代码:
loss = nn .MSELoss () # 这⾥的default 值是‘mean’即求平均的,因为反向传播、梯度计算损失值要求是标量值input  = torch .randn (3, 5, requires_grad =True )target = torch .randn (3, 5)output = loss (input , target )
output .backward () # 如果损失值是⼀个向量,则此处会报错
⼩结: 1. L1 Loss:0处导数不连续,收敛速度慢。 对异常值不敏感,因为是求平均,会忽略掉异常值的作⽤,⼀般可⽤于有少许数据错误的值,这样就可以忽略掉这些错误的离值。
2. 1. L2 Loss:收敛速度快,对异常值敏感,如果是需要进⾏异常检测,就不能忽略掉离值。
假如数据集多数为1000,少数为10,那么L1会偏向1000(因为更偏向于平均),L2则会偏向于10,因为对离值更敏感,所以实际中这两种都不太可取,所以Smooth L1 Loss可以同时利⽤两者的优点。
3. Smooth L1 Loss
披肩按摩器
介绍:
平滑的L1损失(Smooth L1 Loss, SLL),在Faster RCNN中被提出来,公式为:
代码:
beta的作⽤:控制什么范围的误差使⽤MSE,什么范围内的误差内使⽤MAE。Smooth L1 Loss的优点:
l (x ,y )=(x −N 1i =1∑
N
i y )i 2
l (x ,y )=
⎩⎨
⎧,if ∣x −y ∣<beta beta 0.5(x −y )i i 2i i ∣x −y ∣−0.5∗beta ,otherwise
i i
结合了L1 Loss对离点、异常值不敏感的优点。
结合了L2 Loss在0处可导数,收敛速度快、训练不容易跑飞的优点。
4. Huber L1 Loss
介绍:
公式为:
代码:
SmoothL1Loss和HuberLoss区别:
当beta趋于0时,SmoothL1Loss 收敛于L1Loss , HuberLoss 收敛于常数0;当beta趋于⽆穷时,SmoothL1Loss 收敛于常数0,HuberLoss 收敛于MSELoss
随着beta的变化,SmoothL1Loss 中平均绝对误差段的斜率恒定为1;⽽HuberLos 中平均绝对误差段的斜率是beta
4. IOU Loss
介绍:
在之前的⽬标检测中,回归损失都是回归矩形框的四个变量,这样做就默认将四个变量认为是相互独⽴的,这样“粗暴”的直接回归效果往往不会太好,引⼊交并⽐损失(IOU Loss)则可以把四个变量关联起来。公式:
通常也是⽤如下公式:
代码:
HuberL 1Loss =beta ∗SmoothL 1Loss l (x ,y )={
0.5(x −y ),if ∣x −y ∣<beta
i i 2i i beta ∗(∣x −y ∣−0.5∗beta ),otherwise
陶瓷纤维管
i i L (iou )=−ln (iou )
L (iou )=1−iou
1. 先将bbox坐标转换为
2. 求出交集区域⾯积:
宽=两个bbox中最⼩的 - 两个bbox中最⼤的(需要使⽤clamp成0,防⽌越界)⾼ = 两个bbox中最⼩的 - 两个bbox中最⼤的(需要使⽤clamp成0,防⽌越界)然后交集区域⾯积3. 求出并集区域⾯积:
union = (w1h1 + w2h2) - inter,因为并集union要作为分母,所以要考虑是0的情况,所以需要加⼀个很⼩的常数4. 计算iou,import  torch
def  bbox_iou (box1, box2, x1y1x2y2=True , eps =1e -7):  """⽤计算回归损失
:params box1: 预测框      shape:(4, n)  :params box2: 预测框      shape:(n, 4)  :return box1和box2的IoU  shape:(1, n)  """
box2 = box2.T  # 转换为(4, n)
# Get the coordinates of bounding boxes    # 1. 转换为xyxy
if  x1y1x2y2:  # x1, y1, x2, y2 = box1
b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3]      b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3]  else :  # transform from xywh to xyxy
b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2      b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2      b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2      b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2  # 2. 计算交集区域⾯积
# Intersection area  tensor.clamp(0): 将矩阵中⼩于0的元数变成0  inter = (torch .min (b1_x2, b2_x2) - torch .max (b1_x1, b2_x1)).clamp (0) * \          (torch .min (b1_y2, b2_y2) - torch .max (b1_y1, b2_y1)).clamp (0)  # 3. 计算并集区域⾯积  # Union Area
w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps    w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps    union = w1 * h1 + w2 * h2 - inter + eps    # 4. 计算iou    iou = inter / union
return  iou
5. GIOU Loss (Generalized-IoU Loss )
介绍
IOU Loss的缺点:
1 两box⽆相交,IOU=0,不能反映两者的距离⼤⼩(重合度),同时Loss为0,没有梯度回传,⽆法进⾏训练。
2 IOU在⼀些情况下⽆法精确反映两box的重合度⼤⼩。⽐如,IOU相同的情况下,有的效果好,有的效果差,但是使⽤IOU则⽆法进⾏精确的区分哪个更好,因为IOU都⼀致。GIOU:
x y 11x y 22x 2x 1y 2y 1inter =宽∗⾼eps iou =union
inter
公式:
其中为两个框最⼩闭包区域⾯积,。总体来说为:IOU-
特性:
1. GIOU有对称区间,取值范围为[-1, 1]。两者重合时取最⼤值1,⽆交集且⽆限远时候取最⼩值-1。
2. IOU只关注重叠区域,GIOU不仅关注重叠区域,还关注其他⾮重合区域。
代码
def  bbox_GIoU (box1, box2, x1y1x2y2=True , eps =1e -7):    """⽤计算回归损失
:params box1: 预测框      shape:(4, n)    :params box2: 预测框      shape:(n, 4)    :return box1和box2的GIoU  shape:(1, n)    """
box2 = box2.T  # 转换为(4, n)
# Get the coordinates of bounding boxes    # 1. 转换为xyxy
口香糖电池if  x1y1x2y2:  # x1, y1, x2, y2 = box1
b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3]        b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3]    else :  # transform from xywh to xyxy
b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2        b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2        b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2        b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2    # 2. 计算交集区域⾯积
# Intersection area  tensor.clamp(0): 将矩阵中⼩于0的元数变成0    inter = (torch .min (b1_x2, b2_x2) - torch .max (b1_x1, b2_x1)).clamp (0) * \            (torch .min (b1_y2, b2_y2) - torch .max (b1_y1, b2_y1)).clamp (0)    # 3. 计算并集区域⾯积    # Union Area
w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps    w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps    union = w1 * h1 + w2 * h2 - inter + eps    # 4. 计算iou    iou = inter / union    # ---开始计算GIoU---    # 两个框的最⼩闭包区域的width(最⼤的X2 - 最⼩的X1)    cw = torch .max (b1_x2, b2_x2) - torch .min (b1_x1, b2_x1)    # 两个框的最⼩闭包区域的height(最⼤的Y2 - 最⼩的Y1)    ch = torch .max (b1_y2, b2_y2) - torch .min (b1_y1, b2_y1)    # 最⼩闭包区域⾯积A_c
c_area = cw * ch + eps  # convex area    # GIoU
return  iou - (c_area - union ) / c_area
GIOU =IOU −∣A ∣
c ∣A −U ∣
c A c U =两个框的并集闭包区域
闭包区域中不属于两个框的区域
L (GIOU )=1−GIOU

本文发布于:2024-09-22 06:39:08,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/117401.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:损失   回归   区域   模型
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议