|
总结:SSDLoss损失函数的定义
理论部分,请参考:http://www.ai111.vip/thread-910-1-1.html
ssd_loss = SSDLoss(neg_pos_ratio=3,
n_neg_min=1,
alpha=1.0)
model.compile(optimizer=adam, loss=ssd_loss.compute_loss)
SSD的损失:分类损失-log(实际类别对应的预测的概率值p)
交叉熵体现了模型输出的概率分布和真实样本的概率分布的相似程度
定位损失smooth_L1_loss
负样本:实际值中 类别为背景的边界框box
正样本:实际值中 类别为具体物体类别的边界框box
batch_size 表示多少张图片 每张图片中有n_boxes_total个样本(正样本 负样本 中立样本)
定位损失:只考虑每张图片中正样本的损失之和
分类损失:分为正样本的分类损失 + 部分数量的负样本的分类损失之和
限定负样本的数量(以batch_size张图片为单位的,而不是一张图片中满足条件):最多是正样本数量的neg_pos_ratio=3倍 最少是self.n_neg_min
如果在batch_size张图片中没有一个正样本,导致选取的负样本个数也为0,因为负样本数量最多是正样本数量的neg_pos_ratio=3倍,此时总的损失为0,导致模型无法学习
此时n_neg_min这个参数就开始起作用了,这个值确保每一次迭代梯度都有足够的负样本参与, 即便正样本的数量很小, 或者是0, 也想要使用负样本进行训练.
在batch_size张图片中只取负样本的分类损失前面最大的几个(控制负样本的数量)
体现了难例挖掘思想:找到某些负样本 其分类损失最大的 才是难例
alpha 越大 更多的考虑 正样本的定位损失
- 实际值: [[[ 1. 0. 0. 0. 0. 0. 16. 17. 18. 19. 26. 27. 28. 29. 36. 37. 38.
- 39.]
- [ 1. 0. 0. 0. 0. 0. 16. 17. 18. 19. 26. 27. 28. 29. 36. 37. 38.
- 39.]
- [ 1. 0. 0. 0. 0. 0. 16. 17. 18. 19. 26. 27. 28. 29. 36. 37. 38.
- 39.]]
- [[ 0. 0. 0. 0. 0. 1. 16. 17. 18. 19. 26. 27. 28. 29. 36. 37. 38.
- 39.]
- [ 1. 0. 0. 0. 0. 0. 16. 17. 18. 19. 26. 27. 28. 29. 36. 37. 38.
- 39.]
- [ 1. 0. 0. 0. 0. 0. 16. 17. 18. 19. 26. 27. 28. 29. 36. 37. 38.
- 39.]]]
- 实际值 shape: (2, 3, 18)
- 预测值: [[[4.26978000e-03 1.16064600e-02 8.57607900e-02 2.33122010e-01
- 3.15496300e-02 6.33691320e-01 1.50000000e+01 1.90000000e+01
- 8.00000000e+00 1.60000000e+01 2.20000000e+01 2.80000000e+01
- 2.50000000e+01 3.30000000e+01 3.40000000e+01 3.60000000e+01
- 4.00000000e+01 4.20000000e+01]
- [3.16350200e-02 1.57501000e-03 6.35406290e-01 8.59928900e-02
- 1.16378700e-02 2.33752910e-01 1.50000000e+01 1.90000000e+01
- 8.00000000e+00 1.60000000e+01 2.20000000e+01 2.80000000e+01
- 2.50000000e+01 3.30000000e+01 3.40000000e+01 3.60000000e+01
- 4.00000000e+01 4.20000000e+01]
- [6.02561205e-04 1.63793117e-03 2.43090540e-01 4.45235855e-03
- 6.60788597e-01 8.94280120e-02 1.50000000e+01 1.90000000e+01
- 8.00000000e+00 1.60000000e+01 2.20000000e+01 2.80000000e+01
- 2.50000000e+01 3.30000000e+01 3.40000000e+01 3.60000000e+01
- 4.00000000e+01 4.20000000e+01]]
- [[2.67614720e-01 6.63350570e-04 1.80317380e-03 6.63350570e-04
- 1.80317380e-03 7.27452231e-01 1.50000000e+01 1.90000000e+01
- 8.00000000e+00 1.60000000e+01 2.20000000e+01 2.80000000e+01
- 2.50000000e+01 3.30000000e+01 3.40000000e+01 3.60000000e+01
- 4.00000000e+01 4.20000000e+01]
- [2.78934145e-10 6.91408620e-13 9.99954601e-01 4.53978687e-05
- 1.87944349e-12 7.58221619e-10 1.50000000e+01 1.90000000e+01
- 8.00000000e+00 1.60000000e+01 2.20000000e+01 2.80000000e+01
- 2.50000000e+01 3.30000000e+01 3.40000000e+01 3.60000000e+01
- 4.00000000e+01 4.20000000e+01]
- [4.53978686e-05 2.06106005e-09 9.99954600e-01 9.35719813e-14
- 8.53266023e-17 3.44232082e-14 1.50000000e+01 1.90000000e+01
- 8.00000000e+00 1.60000000e+01 2.20000000e+01 2.80000000e+01
- 2.50000000e+01 3.30000000e+01 3.40000000e+01 3.60000000e+01
- 4.00000000e+01 4.20000000e+01]]]
- classification_loss: [[ 5.45619298 3.45349054 7.41432131]
- [ 0.31820694 22.0000454 10.0000454 ]]
- localization_loss: [[14. 14. 14.]
- [14. 14. 14.]]
- 原始的负样本mask: [[1. 1. 1.]
- [0. 1. 1.]]
- 正样本的mask: [[0. 0. 0.]
- [1. 0. 0.]]
- n_positive(正样本个数): 1.0
- 正样本的分类损失之和(每张图片中)pos_class_loss: [0. 0.31820694]
- neg_class_loss_all: [[ 5.45619298 3.45349054 7.41432131]
- [ 0. 22.0000454 10.0000454 ]]
- n_negative(负样本个数): 5
- n_negative_keep(只保留的负样本个数,正负样本的平衡): 3.0
- 下面开始求 每张图片中所有负样本的分类损失之和(难点)
- [ 5.45619298 3.45349054 7.41432131 0. 22.0000454 10.0000454 ]
- [4 5 2]
- 保留的负样本的mask(会丢掉一部分负样本): [[0. 0. 1.]
- [0. 1. 1.]]
- 负样本的分类损失之和(每张图片中)neg_class_loss: [ 7.41432131 32.0000908 ]
- end.... 每张图片中所有负样本的分类损失之和(难点)
- 总的分类损失(每张图片中)class_loss: [ 7.41432131 32.31829775]
- 总的分类损失(每张图片中)(错误class_loss): [16.32400483 32.31829775]
- 只考虑正样本的定位损失: [ 0. 14.]
- total_loss: [ 7.41432131 46.31829775]
- compute_loss= [14.82864263 92.63659549]
复制代码
|
|