【pytorch】nn.SmoothL1Loss 函数使用


1、Smooth L1 Loss

本方法由微软rgb大神提出,Fast RCNN论文提出该方法

1)假设x为预测框和真实框之间的数值差异,常用的 L1 loss、L2 Loss 和 smooth L1 loss 定义分别为:

在这里插入图片描述

2)上述的3个损失函数对x的导数分别为:

在这里插入图片描述

从损失函数对 x 的导数可知:

  • L 1 L1 L1 损失函数对 x x x 的导数为常数,在训练后期, x x x很小时,如果 learning rate 不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。
  • L 2 L2 L2 损失函数对x的导数在x值很大时,其导数也非常大,在训练初期不稳定。
  • s m o o t h L 1 smooth_{L1} smoothL1 完美的避开了 L 1 L1 L1 L 2 L2 L2损失的缺点。

3)实际目标检测框回归任务中的损失 loss 为: L l o c ( t u , v ) = ∑ i ∈ ( x , y , w , h ) s m o o t h L 1 ( t i u − v i ) L_{loc(t^u, v)} = \sum_{i \in (x, y, w, h)}smooth_{L1}(t_i^u - v_i) Lloc(tu,v)=i(x,y,w,h)smoothL1(tiuvi)

其中:

  • v = ( v x , v y , v w , v h ) v = (v_x, v_y,v_w, v_h) v=(vx,vy,vw,vh) :表示GT 的框坐标,
  • t u = ( t x u , t y u , t x w , t h u ) t^u = (t^u_x, t^u_y, t^w_x, t^u_h) tu=(txu,tyu,txw,thu):表示预测的框坐标,即分别求4个点的loss,然后相加作为Bounding Box Regression Loss。

在这里插入图片描述


2、nn.SmoothL1Loss 函数使用

在这里插入图片描述

torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction='mean', beta=1.0)

参数:

  • size_averagereduce已经被弃用,具体功能可由reduction替代
  • reduction:指定损失输出的形式,有三种选择:none|mean|sum。
    • none:损失不做任何处理,直接输出一个数组
    • mean:将得到的损失求平均值再输出,会输出一个数
    • sum:将得到的损失求和再输出,会输出一个数
  • beta:指定该损失在 L 1 ∼ L 2 L1\sim L_2 L1L2 之间变化的阈值,默认为1.0
import torch.nn as nn
import torch

loss1 = nn.SmoothL1Loss(reduction='none')
loss2 = nn.SmoothL1Loss(reduction='mean')

y = torch.randn(3)
y_pred = torch.randn(3)
loss_value1 = loss1(y, y_pred)
loss_value2 = loss2(y, y_pred)

print(y)   # tensor([ 1.6938, -0.3617, -1.2738])
print(y_pred)   # tensor([ 0.3932,  0.8715, -0.2410])
print(loss_value1)   # tensor([0.8007, 0.7332, 0.5328])
print(loss_value2)   # tensor(0.6889)

猜你喜欢

转载自blog.csdn.net/weixin_37804469/article/details/129106438