YOLOv3损失函数个人见解
网络上对YOLOv3的讲解各有不同,还有用YOLOv1损失函数来代表YOLOv3函数的,这里我发表一下个人对YOLOv3损失函数的见解。
损失函数
在这里本人认为损失函数就像YOLOv3原作者在论文所说的:
- 边界框运用均方误差
- 置信度运用交叉熵
- 类别运用交叉熵
用公式表示如下:
在源码中边框坐标也有乘以scale(2-wh)。对于scale,我的理解是:wh越小,就表示面积越小,面积越小,在和anchor做比较的时候,iou也就会越小,scale便是用来弱化边界框尺寸对损失值的影响。而对于坐标,本人认为没这个必要,所以上述公式坐标那一块并没有乘以scale。
函数求导讲解
均方误差求导:
交叉熵函数求导:
logistic函数求导:
源码解释
本人认为项目源码中并没有直接给出损失函数的表达,而是直接跳过了这一步进行反向传播求梯度
源码中有一个很重要的变量delta,本人认为这便是存放梯度的
Delta =
- 类别:
delta[index + stride*n] = ((n == class_id) ? 1 : 0) - output[index + stride*n];
if (n == class_id && avg_cat) *avg_cat += output[index + stride*n];
- 置信度:
int obj_index = entry_index(l, b, n*l.w*l.h + j*l.w + i, 4);
avg_anyobj += l.output[obj_index];
l.delta[obj_index