问题:在第一个epoch中,前几个batch训练loss不为零,但是在迅速下降,并在几个batch后直接变为零
- 猜想1:数据集中全零标签太多。尝试删除全负样本标签,不管用×
- 猜想2:batch size太大,导致梯度消失。尝试修改小两个数量级,不管用×
- 答案:最后通过单步调试发现,输入到模型的标签label全为零,但是在文件夹中的标签数据是正常的。
最后将问题定位在了这一行代码中:
label = cv.imread(labelPath, cv.IMREAD_GRAYSCALE)
cv.IMREAD_GRAYSCALE模式尽管是读取为灰度图像,但是要求图像是8位,我的label是16位导致读取出来全为零,才出现这个问题:
修改cv.IMREAD_GRAYSCALE为支持所有其他位类型的 cv.IMREAD_ANYDEPTH即可
label = cv.imread(labelPath, cv.IMREAD_ANYDEPTH)
问题:在几个epoch内,loss迅速下降,最后变为零(之前遇到过的)
- 答案:当时的全负标签太多,并且dataset或者loss没有做类别样本平衡的处理,导致在几个epoch中,loss迅速下降,最后变为零。当时的解决办法是:
将全负标签删除,问题得到解决。当然,现在来看,对loss的计算或者在dataset的修改都可以,让模型更加专注于你指定的类别。