zoukankan      html  css  js  c++  java
  • 跑实验技巧

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


    复现论文

    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出来的问题,看着都想打自己!!!

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

  • 相关阅读:
    C# 图片与Base64的相互转化
    LeetCode 303. Range Sum Query – Immutable
    LeetCode 300. Longest Increasing Subsequence
    LeetCode 292. Nim Game
    LeetCode 283. Move Zeroes
    LeetCode 279. Perfect Squares
    LeetCode 268. Missing Number
    LeetCode 264. Ugly Number II
    LeetCode 258. Add Digits
    LeetCode 257. Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/lainey/p/9010849.html
Copyright © 2011-2022 走看看