Debug日记:为什么神经网络测试精度远低于验证精度??都是模式“P”惹的祸!!

博主在进行图像分割项目时,发现模型在测试阶段精度极低,经过排查确定问题源于PIL库中图像模式“P”的转换。在将RGB图像直接转化为“P”模式与先转为“L”模式再转“P”模式时,结果不一致,导致训练与测试数据不匹配,从而影响模型性能。这个问题浪费了几天时间,但具体原因尚不清楚。
摘要由CSDN通过智能技术生成

事情背景

最近在做一个图像分割的项目,数据集是自己制作的VOC格式的分割数据集,在之前的博客中,我发现了VOC数据集的ground turth是8位的彩色图像

后来查了很多资料,暂时只找到PIL.Image有的调色板模式“P”是8位的彩色图像。于是将训练集、验证集都转换为模式“P”之后就开始训练了

经过了艰苦的调参,模型终于不会过拟合了,但是在测试的时候却发现,测试的精度接近于瞎猜(二分类)。
在这里插入图片描述
起初以为是模型的问题或者验证集的标签泄露。但是冷静分析一下,肯定不是过拟合,原因有二:

  1. 如果验证集的标签泄露,那么不可能需要那么小心地设计学习率,它才不会过拟合,而是随便设计学习率都可以完美地拟合
  2. 就算它泄露了,就算模型泛化能力极差,也不至于完全是瞎猜的状态。

在仔细检查了代码之后,感觉可能是因为模式“P”的原因!经过了实验,终于定位了问题,就是模式"P"惹的祸!!

>>> import numpy as np
>>> test = np.zeros((2,2,3),dtype="uint8")
>>> test[0][1]=[1,1,1]
>>> test
array([[[0, 0, 0],
        [1, 1, 1]],

       [[0, 0, 0],
        [0, 0, 0]]], dtype=uint8)
>>> import numpy as np
>>> test = np.ones((2,2,3),dtype="uint8")
>>> test[0][1]=[0,0,0]
>>> test
array([[[1, 1, 1],
        [0, 0, 0]],

       [[1, 1, 1],
        [1, 1, 1]]], dtype=uint8)
>>> from PIL import Image
>>> img1 = Image.fromarray(test)
>>> L1 = img1.convert("L")
>>> P1 = L1.convert("P")
>>> img2 = Image.fromarray(test)
>>> P2 = img2.convert("P")
>>> P1 == P2
False
>>> np.array(P1.convert("RGB"))
array([[[1, 1, 1],
        [0, 0, 0]],

       [[1, 1, 1],
        [1, 1, 1]]], dtype=uint8)
>>> np.array(P2.convert("RGB"))
array([[[0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0]]], dtype=uint8)

see?一张RGB的图像,用PIL.Image.Open.convert直接转化为模式“P”的结果,和先转化为模式“L”再转化为模式“P”是不一样的!!!

我在生成训练集和验证集的时候,将RGB的图像转化为模式“L”,再转化为模式“P”。而在生成验证集的时候,直接将RGB的图像直接转化为了模式“P”。就是这一个不起眼的失误浪费了几天的时间!

至于为什么二值的RGB直接转模式P会得到全0的矩阵,小弟还没想明白,希望评论区有高人解答!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值