tensorflow - 对象检测上的 Sigmoid 与 Softmax 交叉熵
问题描述
我正在使用 MobileNetv1+SSD 进行对象检测。我很难为分类选择正确的损失函数。
在 Liu、Wei 等人的 SSD 论文中,作者在多类置信度上使用了 softmax 损失tf.nn.softmax_cross_entropy_with_logits
。但是,使用来自 Tensorflow管道 的 sigmoid 损失,我得到了更好的结果tf.nn.sigmoid_cross_entropy_with_logits
。
我的问题是:
- 物体检测的两种损失之间的主要区别是什么?
- 使用不同损失导致结果差异的原因可能是什么?
解决方案
如果只有一个类可以为“真” ,您将使用 softmax 交叉熵损失。您的任务中一个示例(例如一张图像)的基本事实可能如下所示[0,0,0,1,0,0]
。例如,这 6 个值可以表示 6 个不同的类,例如['cat', 'dog', 'house', 'fish', 'shoe', 'boat']
.
网络的最终输出将是输出向量中每个标量的“概率”分数列表。概率总和为 1,例如[0.05, 0.1, 0.15, 0.55, 0.15]
。
如果您尝试解决的问题涉及多个值为“真”的可能性,您将使用 sigmoid 损失函数,例如基本事实可能是[0,1,0,1,0,0]
.
推荐阅读
- ios - 我们如何在 Swift 中使用 firebase 发送位置信息
- python - 重定向快捷方式不起作用,不在浏览器上重定向我
- java - 后端从数据库中获取所有数据但返回一个结果
- numpy - “建立强混合整数规划公式的几何方法”中的定理 1
- python - flask-admin 自定义表单操作并启动后台进程
- c - 将可变数量的参数传递给 C 中的函数
- javascript - 如何在使用位置时将表列 A 中的 div 放在其余列的顶部:React 应用程序中的粘性
- algorithm - 将 N 个矩形打包成一个更大的矩形的算法
- python - Graphistry 图表并不总是正确显示
- java - 运行 maven clean install 时未解决的 java.net.http 类