• 跑实验技巧


    最近在复现一篇论文,遇到了很多坑,也因为自己的一些不熟练浪费了很多时间,特此记录下一些常见的问题和需要注意的点


    复现论文

    1. 写好输入:

    • 一定要确保模型的输入和测试时的输入一模一样  (愚蠢的我曾经训练了个Identity mapping)
    • 输入的一些约束:  不能为全零等,都得事先check好, 特别是如果有作为分母,保证不能为0,要不就NAN了
    • 输入数据的预处理: 先resize再crop, 归一化到[-1,1], 注意常见的网络都是归一化到[-1,1], VGG的网络直接减均值就行,如果是用的别人pretrained的模型,注意一定要和他的输入保持一致
    • 效率问题: 可以用nvidia-smi和top查看电脑运行状态,逐渐加大可用线程数和queue-size, buffer-size也尽量大些
    • 在训练初期把输入也summary进行查看,看是否和你预期的输入一致 

    2. 搭建框架

    • 按照设计一步一步做
    • 有些中间结果也可以在训练初期进行可视化验证模型的正确性
    • 模型的输出可视化结果在训练过程中可以看到它的逐渐变化

    3. 定义loss

    • 注意计算loss时,输出和输入的尺度要保持一致,常见的做法是 input = input/127.5 -1   output = tf.saturate_cast((output+1)*127.5,tf.uint8)
    • 可以通过看loss summary中的大小反过来计算出绝对数值,比如说 l1_loss 0.02   因为做了归一化  0.02*255 = 5 pix 所以说应该与原图相差不大 
    • 计算的时候,如果涉及到比如两个图逐像素做差之和,注意除以图像大小,要不然loss尺度会特别大

    4. 训练(多卡并行)

    • 最好先初期训练下,此时可以buffer size设置小一些,快点, 保存ckpt500步这样子,可以先进行简易测试,确定模型的输出是合理的,测试代码也是正确的, 初期训练时,多设置几个summary看相关结果
    • 初期训练正确了,再开始正常训练, 最好设置几套参数并行训练,节省时间,训练过程中要多关注summary中的 loss曲线,相关结果
    • 最好还是写好多GPU并行的代码,如果急需看结果的时候,多卡并行可以很快就能出结果
    • 注意如果是用BN+ tensorflow的话,training_op要放在update_op的依赖下
    • 用了BN确实比没有BN跑的快多了

    5. 测试, finetune

    • 测试时注意和训练时输入保持一致
    • 关掉BN
    • 测试下finetune代码有没有写错,以防不正常终止后可以恢复

    6. 整理代码并开源

    • 还是放在github上方便些,写readme的时候可以帮助再把整个project理一遍
    • 下次写别的project时,需要找相关代码也方便些

    写代码慢些没关系,但是要确保每一步都正确,不要因为一些愚蠢的小错误浪费之后的时间去debug, 不值得。

    前期写代码,最好边写边check,良好的coding习惯是会写好附加test代码的。有时候debug出来的问题,看着都想打自己!!!

    一定要分析源头,出现问题,先想为什么会出现这种情况,什么情况下可能导致这种问题发生

  • 相关阅读:
    mysql 8 nodejs连不上
    render与vue组件和注册
    0424 前端笔记
    0423
    任务
    使用async await 封装 axios
    [Java] Spring 3.0 01/02/03/04/05 -自设源代码
    [Java] Spring3.0 360百科介绍
    [Java] Spring3.0
    [Java] Spring3.0 面向抽象(接口)编程
  • 原文地址:https://www.cnblogs.com/lainey/p/9010849.html
Copyright © 2020-2023  润新知