下面是训练集的效果,
# 训练集dice: 0.9219 - iou: 0.8611 - loss: 0.0318 - mae: 0.0220 - total: 0.8915
basnet_model.evaluate(train_dataset) 损失我只用了二元交叉熵,主要比较损失的影响
上面就是模型在训练集上的效果,可见,模型在训练集上拟合的非常好,既学到了一些有用的信息,但是也学习到了一些在训练集上特有,在验证集上没有的信息,这样的模型训练出来意义不大,我们需要的是能预测未知的模型,希望的是模型学习到通用特征,然而,由于数据集自身问题,模型学到的特征未必都有用,或者有些不但没用,反而起反作用,比如,一个只有半截身子的人在其中一个图片是掩码,但是在其他图片确是背景,这样模型在遇到这样情况时,它就不知所措,因为你得猜它是掩码还是背景,有些被裁剪的半截身子的人在训练集中是掩码,在验证集中可能只是背景,所以如果有自相矛盾的数据集,那肯定没法训练好模型,必须确定好,整个身子出现的人是前景,半截的是背景,不能这个里面是掩码前景,那个里面是背景,别说模型,让你猜,你能猜到它应该是啥吗
这种图像分割不好做图像增强,比如裁剪,如果一张图片是一整个人做前景,你裁剪了之后,这个人半截身子了,但是他还是前景,这样模型就会觉得半截身子的人也可以做前景,但是还是我说的,给你一个半截身子的人图片,你是该当它前景好呢,还是背景好呢,难道要让模型去学习瞎猜,还有随机旋转和缩放,你图片这样做了,掩码也得这样做同样的变换,事实上,在随机旋转后,那片空白区域是要填充的,,默认附近填充,或者填充背景,但是可能都不好,我见过一张图片旋转后,因为图片在图像的边角位,所以旋转后填充了一些,你总不能掩码也填充吧,反正能用的增强未必多,所以我决定用dropout,随机丢弃一些噪音信息
下面是在验证集的表现
# 验证集504个样本,dice: 0.8096 - iou: 0.7138 - loss: 0.1267 - mae: 0.0429 - total: 0.7617
len(val_dataset)*BATCH_SIZE
可以看到评估效果,这种就是明显过拟合,拟合了太多在验证集并不适用的信息,还有如果模型是在拆分的数据集上拆分得到的,你下次重启内核,再评估就不准确了,因为这时的评估集如果变了,评估集中有一些训练集数据,那模型评估效果肯定好,还有k交叉,其实没用,因为你这次评估的数据你总不是丢了,你是再次放入训练集了,这样做多次训练后,你验证集上的评估效果和训练集是一样的,因为都被模型拿来拟合了,这样的模型在未见过的数据上有效果才怪呢
我好无语,上面那个是什么?模型竟然还会去做预测,看来这个数据集太杂,啥都拿来当掩码,这就是我说的,没有准则,你比如提取就得有个框框,你要让模型预测什么,而且在这里面不能有相反的逻辑,比如我说的,一张图片里,半截身子的人是掩码,结果在另一张图片里是背景,你说它应该拿半截身子的人当前景掩码,还是背景好呢?也就是不能自相矛盾,不能出现同一种事物既是掩码,又是背景的情况,你让人预测也不好预测
总感觉没有结构化损失少点什么?一会把结构化损失加上看看
dropout后:# dropout后:dice: 0.9143 - iou: 0.8488 - loss: 0.0335 - mae: 0.0236 - total: 0.8816
下面验证集效果dice: 0.8113 - iou: 0.7135 - loss: 0.1024 - mae: 0.0409 - total: 0.7624
看到没有,左边图片中的那个半截身子的人,在真实掩码里是有的,模型预测没有,这就是那种自相矛盾的真实掩码