前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >YOLOV3损失函数再思考 Plus

YOLOV3损失函数再思考 Plus

作者头像
BBuf
发布2020-05-26 14:03:15
7670
发布2020-05-26 14:03:15
举报
文章被收录于专栏:GiantPandaCVGiantPandaCV

1. 前言

看到这个题目想必大家都猜到了,昨天的文章又有问题了。。。今天,又和两位大佬交流了一下YOLOV3损失函数,然后重新再对源码进行了梯度推导我最终发现,我的理解竟然还有一个很大的错误,接下来我就直入主题,讲讲在昨天文章放出的YOLOV3 损失函数基础上还存在什么错误。

2. 回顾

上篇文章的地址是:你对YOLOV3损失函数真的理解正确了吗? ,然后通过推导我们将损失函数的表示形式定格为了下面的等式:

行云大佬的YOLOV3 损失函数

那么这个等式还存在什么问题呢?

答案就是DarkNet中坐标损失实际上是BCE(二元交叉熵)损失而不是这个公式写的MSE Loss。

3. 打个问号?

我们首先定位一下源码的forward_yolo_layer_gpu函数:

forward_yolo_layer_gpu 函数

可以看到

x,y,w,h

在计算损失函数之前先经过了Logistic回归,也就是一个Sigmoid函数进行激活然后再计算损失,如果这个损失如上面的公式所说是MSE Loss的话,那么我们来推导一下梯度。

按照上面的公式,坐标的损失函数可以表达为

loss=\frac{1}{2}(y-sigmoid(x))^2

其中

x

代表bbox中的任意一个变量(有x,y,w,h 4个),那么我们来求一下偏导,根据链式法则可以得到:

\frac{d loss}{dx}=-(y-sigmoid(x))*(1-x)*x

其中

x*(1-x)

sigmoid(x)

x

的倒数,进一步将其整理为:

\frac{d loss}{dx}=(sigmoid(x)-y)*(1-x)*x

又因为DarkNet是直接weights+lr*delta,所以是实际算的时候梯度是上面等式的相反数,所以:

\frac{d loss}{dx}=(y-sigmoid(x))*(1-x)*x

然后我们看一下官方DarkNet源码对每个坐标的梯度表达形式:

官方DarkNet源码对每个坐标的梯度表达形式

前面的scale就是

2-w*h

我们暂时不看,可以看到梯度的形式就是一个

y-sigmoid(x)

呀(注意在forward_yolo_layer_gpu函数中执行的是

x=sigmoid(x)

操作,这里为了方便大家理解我还是写成了

sigmoid(x)

),所以我就有了大大的问号?

Sigmoid函数的梯度去哪了???

4. 解除疑惑

Draw.大佬说其实YOLOV3的坐标损失依然是BCE Loss,这怎么和网上的博客不一样啊(所以啊,初期可以看博客,学习久了就要尝试脱离博客了),那么我们带着这个想法来推导一番。

我们知道对于BCE Loss来说:

loss = - y'*log(y)-(1-y')*log(1-y)

这里

y'

表示标签值,那么自然有

y=sigmoid(x)

所以这里我们就变成了求loss对

x

的导数:

\frac{\partial loss}{\partial x}=(\frac{-y'}{y}+\frac{1-y'}{1-y})\frac{\partial y}{\partial x}
\frac{\partial loss}{\partial x}=(\frac{-y'}{y}+\frac{1-y'}{1-y})*y*(1-y)
\frac{\partial loss}{\partial x}=y(1-y')-y'(1-y)
\frac{\partial loss}{\partial x}=y-y'

又因为DarkNet是直接weights+lr*delta,所以是实际算的时候梯度是上面等式的相反数,所以:

\frac{\partial loss}{\partial x}=y'-y

回过头看一下DarkNet在坐标损失上的梯度呢?

官方DarkNet源码对每个坐标的梯度表达形式

这不是一模一样?

根据梯度一致性来判断,DarkNet YOLOV3坐标损失是BCE损失没跑了吧。

5. 总结

通过对梯度的推导,我们发现DarkNet官方实现的YOLOV3里面坐标损失用的竟然是BCE Loss,而YOLOV3官方论文里面说的是MSE Loss,我个人觉得论文不能全信啊233。

至此DarkNet中YOLO V3的损失函数解析完毕,只需要将

行云大佬的YOLOV3 损失函数

这里面的MSE坐标损失替换成BCE坐标损失就可以获得最终的官方版本DarkNet YOLOV3的损失函数啦。有问题留言区交流哦。

6. 参考

  • https://blog.csdn.net/qq_34795071/article/details/92803741
  • https://pjreddie.com/media/files/papers/YOLOv3.pdf
  • https://github.com/pjreddie/darknet/blob/master/src/yolo_layer.c
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GiantPandaCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. 回顾
  • 3. 打个问号?
  • 4. 解除疑惑
  • 5. 总结
  • 6. 参考
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档