python 关于训练集loss不降问题的经验分享

训练集loss不降那点事 -- 标签错误?

  • 引言
  • 一、标签错误
  • 二、其它情况
  • 三、一些建议
  • 四、参考链接

引言

一般情况,我们不会从0开始搭建自己的神经网络。开源时代,我们往往站在巨人的肩膀上写代码。 – 对大佬开源的项目进行增删改查。遇到一些问题也可以和正确的代码进行对比,但是想要大改或者从0开始写一个工程时,不可避免的会遇到很多问题。对于搭建神经网络来说,最初且最直观的问题就是训练loss不降,代码从一开始就不work,但是自己又感觉代码逻辑并没有问题。
本文只讨论遇到的一些坑(pytorch)

模型参数or训练策略等问题可参考1:如何解决神经网络训练时loss不下降的问题

一、标签错误

现在的框架已经很成熟,训练loss不降很多情况都是标签错误,或者说训练集和真实标签没有对应(图像分类:输入是狗但是对应的真实标签是猫),算出来的loss是错的,训练模型也是跑偏的…产生的原因是代码不够鲁棒 - - 举个例子:

def getTrainData(path: str) -> list:
    """ 得到所有训练数据的路径

    :param path: 数据的路径(文件夹)
    :return: 所有数据的路径(文件)
    """
    paths = []
    for root, _, filenames in sorted(os.walk(path)):  # 遍历
        for filename in filenames:
            tmp = os.path.join(root, filename)        # 拼接
            paths.append(tmp)                         # 存入
    return paths

用以上函数可以得到path路径下所有文件的路径,注意遍历时候的sorted 文件是经过排序
同样用以上函数获取标签所有的标签文件,也是经过排序的,那么两个都经过排序的序列应该是一一对应的。在我的电脑上(win10-python3.7)可以正常运行
但是在服务器(linux-python3.5)上,我发现sorted函数并没有起作用(因为训练loss不降) 我没有继续深究是系统问题还是库的版本问题,我修改获取标签的文件的代码,与上述代码类似:

def getGtData(path: str, data_paths: str) -> list:
    """ 得到所有训练标签的路径

    :param path: 标签的路径 (文件夹)
    :param data_paths: 所有数据的路径(文件)
    :return: 所有标签的路径(文件)
    """
    paths = []
    for in_path in data_paths:
        tmp = os.path.join(path, ntpath.split(in_path)[1].replace('_img', '_gt'))
        paths.append(tmp)
    return paths

重点:我遍历所有的数据文件,使用replace更改其为标签的文件路径,确保训练数据与真实标签的对应关系

二、其它情况

可参考关于随机数的详细解读2:不同PyTorch版本训练同一个代码结果差异巨大
还有一些未解之谜 3: pytorch1.10版本训练结果很差

三、一些建议

如何尽量避免这种问题的出现:
大部分情况是函数默认参数不同、或者是代码所处环境不同产生的bug

  1. 使用相同的环境:系统、库的版本要一致
  2. 设定固定的随机种子,可以规避一些不确定性问题
  3. 在函数调用时主动填写默认参数(后续看代码也方便)

四、参考链接


  1. 如何解决神经网络训练时loss不下降的问题 ↩︎

  2. 不同PyTorch版本训练同一个代码结果差异巨大 ↩︎

  3. pytorch1.10版本训练结果很差 ↩︎

你可能感兴趣的:(#,python,python,pytorch,深度学习,loss,损失不降)