一些个人经验

2023-11-01

  1. 如果是运行时动态随机生成 dataset splitting(training / val / test),而不是事先生成静态 splitting,就保存一下 splitting indices,后面可能 case study 的时候会用到。数据集足够大的时候,用事先生成的 splitting 也挺好。 还是预先划分好一点,即类似 COCO 官方给的 train/val/test 划分一样,自己模型和所有 baseline 都用相同的划分,这样才能做 case study,主要是要用相同的 test set 做。就算要 k-fold,也可以预处理好几份划分 indices。
  2. training 要写 resuming,因为不知道几时、缘何会中断,可以每个 epoch(epoch-based)、每 n 个 iterations(iteration-based)、每 y 分钟存一次。PyTorch 可以同时保存 optimizer 的 state_dict,以便断点续炼,参考《PyTorch: What’s the purpose of saving the optimizer state?》。
  3. (参考 detectron2)python 函数返回多个结果时,可以用 dict 而不是 tuple / list,避免搞错顺序、typo 等。
  4. 同样,保存数据、结果时可以优先用 .mat / .h5 / .pth(PyTorch) 而不是 .npy,前三者每个数据都有名,这样就算一篇文被拒几次、很久之后还要面对旧代码时友好很多。
  5. 保存结果时,可以顺便记些元信息,如保存时间,可以帮助分辨这是旧代码、还是新代码的结果,这些都可以在存 .mat / .pth 时放进 dict 里(.h5 未试过但估计也可以?)。
  6. 用 .mat / .h5 还有个好处是:python、matlab 都可读、写,如果同时用到两者(如 baselines 有 python 又有 matlab 的)会比较方便。
  7. (参考 mmdetection)用 timeit.default_timer() 记录训练时间,比如每 z 个 iterations、每个 epoch,并估计剩余训练时间。可参考《python手写简易进度条》的计时进度条。(Q:不知道 mmdetection 在多卡训练的时候是怎么计时的,是不是只要在 rank = 0 的进程计时就行?)
  8. (参考 mmdetection)记录结果的 log 用 json / csv 等结构化的文件格式,而不是自己写 .txt,就不用自己解析 log 的格式。
  9. 记结果记得舍入,如 numpy.ndarray 用 round,或者 pandas.DataFrame.to_excel 写入 excel 时指定 float_format,参考:pandas写excel简例
  10. (参考 mmdetection)命令行参数、配置文件可以备份一份到 log 目录。
  11. 参考《CogVideo: Large-scale Pretraining for Text-to-Video Generation via Transformers》,用 Anonymous GitHub 发布匿名代码仓,可能是用于审稿时交代码验证。
  12. paper with code 查 state-of-the-art(SOTA):Browse State-of-the-Art
  13. Hugging Face 找预训练模型参数,尤其一些没有对应文章、但可能已经很多人用的改进模型,如 runwayml/stable-diffusion-v1-5
  14. python 显示进度除了用 tqdm、手写进度条,如果只是想打点东西,确保程序不是在卡住,也可以简单利用 \r 实现,如:
    for i, data in enumerate(dataloader):
        print(i, end='\r') # 就不会一直换行刷爆终端
        # do something ...
    
  15. (续 2)续断不仅限于 training,其它如数据处理、下载也可以加:
    • 如输出是文件夹,可以用临时文件夹(如加后缀 .tmp),处理完再改名。这样程序意外停掉要重新运行时,就可以略过已经存在的文件夹;
    • 输出是文件也类似。
  16. 处理数据、论文画图的时候保留必要的中间结果,比如 bbox、seg mask 这种处理大批量模型的时候很耗时,数据清洗的逻辑可能会改几次;论文画图可能也要调几次样式,留了必要的中间结果就不用每次都重跑。
  17. 及时手动释放显存,即 del + torch.cuda.empty_cache() 有用。试过跑生成模型时,为算 loss 生成的中间结果(image)可能挺大的,显存占用续渐变大,而且可能未及时自动释放,累积到下个 epoch 导致 OOM,用上手动释放显存之后解决了。
    • 后来发现 OOM 好像是因为别人也在跑,撞了……
  18. 如果不知道什么样的 loss 曲线、收敛范围是正常的(如在自己数据集上跑 GAN 的时候),也许可以用原文代码、在原文数据集上跑一次,用它的 loss 信息做参照。
  19. 别人的经验:pengsida/learning_research,尤其是《如何找到实验不work的原因》。
  20. 开完组会之后,把后续实验思路重新捋一次,重新组织语言写成文档,预期输出、实验目的也写上,再发出来跟导师 / 合作者对一次,防止无效实验。中途有改变的,也及时提出,把差异直接体现在文档中方便别人(和过两天之后忘记细节的自己)看懂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一些个人经验 的相关文章

随机推荐

  • 数据结构与算法—二分查询

    一 二分查询的概念 二 算法思想 程序的非递归实现 int binaryFind int nums int n int key int left 0 right n 1 int mid 0 int pos 1 while left lt r
  • Python实现双端队列

    Python实现双端队列 关于双端队列的介绍 请参考 https blog csdn net weixin 43790276 article details 104033337 双端队列的数据存储结构可以是顺序表 也可以是链表 本篇文章使用
  • java计算机毕业设计基于springboo+vue的准妈妈孕期育儿婴幼儿交流平台

    项目介绍 随着科学技术的飞速发展 社会的方方面面 各行各业都在努力与现代的先进技术接轨 通过科技手段来提高自身的优势 准妈妈孕期交流平台当然也不能排除在外 准妈妈孕期交流平台是以实际运用为开发背景 运用软件工程原理和开发方法 采用sprin
  • Python学习----不同分类器的Calibration比较

    Well calibrated classifiers are probabilistic classifiers for which the output of predict proba can be directly interpre
  • Visual C++ 6.0 如何添加一个对话框

    1 创建一个MFC单文档应用程序 2 为IDR MAIN FRAME主窗口添加新的菜单 关于 介绍 其中介绍菜单ID ID TELL 3 添加一个新的对话框IDD DIALOG1 并为它添加一个类 类名为Tell 4 为菜单 介绍 添加消息
  • 程序员去大公司面试,Java岗大厂面试官常问的那些问题,进阶学习

    前言 这段时间一直在学习Netty相关知识 因为涉及知识点比较多 也走了不少弯路 目前网上关于Netty学习资料琳琅满目 不知如何下手 其实大家都是一样的 学习方法和技巧都是总结出来的 我们在没有找到很好的方法之前不如按部就班先从基础开始
  • 我希望我知道的七个JavaScript技巧 译(转)

    23 April 2014 如果你是一个JavaScript新手或仅仅最近才在你的开发工作中接触它 你可能感到沮丧 所有的语言都有自己的怪癖 quirks 但从基于强类型的服务器端语言转移过来的开发人员可能会感到困惑 我就曾经这样 几年前
  • networkx报错:TypeError: object of type 'dictionary-keyiterator' has no len()

    TypeError object of type dictionary keyiterator has no len 这是networkx1 x和network2 x不同导致的 在node集合的基础上加list 即可 更多 https bl
  • Sigmoid激活函数和ReLU激活函数的区别:

    Sigmoid激活函数和ReLU激活函数的区别 特性 Sigmoid 激活函数 ReLU 激活函数 梯度弥散 只有在0附近的时候有比较好的激活性 在正负饱和区 其梯度都接近于0 导致梯度弥散 在大于0的部分梯度为常数 不会出现梯度弥散 单侧
  • 第一篇:UE4如何输出全景图,和自定义截图

    首先 向大家介绍一下UE4的两种输出全景图的方法 一种是利用UE4自带的输出插件 一种是NVIDIA的插件 一 UE4自带插件 1 打开Edit gt Plugins 选择Stereo Panoramic Movie Capture插件导入
  • QT 学习之键盘事件( keyPressEvent)

    Qt keyPressEvent keyPressEvent是QWidget里面的函数 所以凡是继承自QWidget的类都可以通过实现这个函数来完成对按键事件的响应 要让当前的widget能够响应按键事件 最先需要做的事情是 调用 setF
  • golang知识点

    一 Go的GC机制 1 Go的垃圾回收机制采用了标记 清除算法和三色标记法 垃圾回收器会在程序运行期间定期地扫描堆上的对象 并将其标记为 活动对象 或 垃圾对象 当所有的活动对象都被标记后 垃圾回收器会清除所有未标记的对象 这个过程被称为
  • MyBatis的动态SQL语句

    文章目录 1 动态SQL之
  • win10 修改java环境变量不生效

    Microsoft Windows 版本 10 0 19045 2728 c Microsoft Corporation 保留所有权利 C Users Administrator gt java version C Users Admini
  • 宝塔linux面板,修改root密码

    root 密码忘记了 但宝塔vps的密码没忘记 翻完宝塔linux面板都没看到有修改系统root密码的选项 后来尝试定时任务shell 也没成功 最终快绝望的时候 发现通过添加插件成功修改密码并登陆终端 详情如下 系统工具 linux工具箱
  • 现阶段Java高可用集群架构与微服务架构的简单分析

    可能大部分读者都在想 为什么在这以 dubbo spring cloud 为代表的微服务时代 我们还要整理这种已经 过时 高可用集群架构 本人工作上大部分团队都是7 15人编制的开发团队 对应的公司项目也大都是中小型项目 最大的项目 PV
  • 【猿人学WEB题目专解】猿人学第20题

    据说 看我文章时 关注 点赞 收藏 的 帅哥美女们 心情都会不自觉的好起来 前言 作者简介 大家好我是 user from future 意思是 来自未来的用户 寓意着未来的自己一定很棒 个人主页 点我直达 在这里肯定能找到你想要的 专栏介
  • 如何排查工程中的死代码(devops为例)

    前言 死代码 Dead Code 指的是在程序中没有被执行过或者已经不会被执行到的代码 它们可能会导致程序体积变大 影响程序的性能和可维护性 为了减少死代码的存在 我们需要在工程中进行死代码的排查和清理 本文将介绍一些排查工程中死代码的方法
  • Linux中glob()、globfree()、getcwd()函数

    Linux中glob 与globfree 函数 文章目录 一 glob 函数 二 globfree 函数 三 getcwd 函数 四 代码演示 总结 一 glob 函数 glob 函数作用 glob 函数用于文件系统中路径名称的模式匹配 函
  • 一些个人经验

    如果是运行时动态随机生成 dataset splitting training val test 而不是事先生成静态 splitting 就保存一下 splitting indices 后面可能 case study 的时候会用到 数据集足