跑实验技巧

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


 

复现论文

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

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

 

posted @ 2018-05-08 20:44  Lainey❤  阅读(582)  评论(0编辑  收藏  举报