miemie2013 / Pytorch-DIOU-YOLOv3

Pytorch复现YOLOv3,使用最新的DIOU loss训练
69 stars 28 forks source link

loss nan #1

Open jacke121 opened 4 years ago

jacke121 commented 4 years ago

您好,我只训练一个类别时,训练几个epoch后,就出现了loss nan的情况,减小学习率也不行

发现是这3根loss中有的数据为nan, ciou_loss = ciou_loss.sum((1, 2, 3, 4)).mean() # 每个样本单独计算自己的ciou_loss,再求平均值 conf_loss = conf_loss.sum((1, 2, 3, 4)).mean() # 每个样本单独计算自己的conf_loss,再求平均值 prob_loss = prob_loss.sum((1, 2, 3, 4)).mean() # 每个样本单独计算自己的prob_loss,再求平均值

我把数据加1e-8也不行 pos_loss = respond_bbox (0 - T.log(pred_conf+1e-8)) neg_loss = respond_bgd (0 - T.log(1 - pred_conf+1e-8))

后来:我把为nan的数据过滤掉,结果loss全部为0了

ciou_loss = ciou_loss[(ciou_loss != ciou_loss) == False].sum() # 每个样本单独计算自己的ciou_loss,再求平均值 conf_loss = conf_loss[(conf_loss != conf_loss) == False].sum() # 每个样本单独计算自己的conf_loss,再求平均值 prob_loss = prob_loss[(prob_loss != prob_loss) == False].sum() # 每个样本单独计算自己的prob_loss,再求平均值 请问一下,这个有办法吗?

miemie2013 commented 4 years ago

您好,我只训练一个类别时,训练几个epoch后,就出现了loss nan的情况,减小学习率也不行

发现是这3根loss中有的数据为nan, ciou_loss = ciou_loss.sum((1, 2, 3, 4)).mean() # 每个样本单独计算自己的ciou_loss,再求平均值 conf_loss = conf_loss.sum((1, 2, 3, 4)).mean() # 每个样本单独计算自己的conf_loss,再求平均值 prob_loss = prob_loss.sum((1, 2, 3, 4)).mean() # 每个样本单独计算自己的prob_loss,再求平均值

我把数据加1e-8也不行 pos_loss = respond_bbox (0 - T.log(pred_conf+1e-8)) neg_loss = respond_bgd (0 - T.log(1 - pred_conf+1e-8))

后来:我把为nan的数据过滤掉,结果loss全部为0了

ciou_loss = ciou_loss[(ciou_loss != ciou_loss) == False].sum() # 每个样本单独计算自己的ciou_loss,再求平均值 conf_loss = conf_loss[(conf_loss != conf_loss) == False].sum() # 每个样本单独计算自己的conf_loss,再求平均值 prob_loss = prob_loss[(prob_loss != prob_loss) == False].sum() # 每个样本单独计算自己的prob_loss,再求平均值 请问一下,这个有办法吗?

不介意的话群里找我把数据集发我试试