跑实验技巧

最近在复现一篇论文,遇到了不少坑,也由于本身的一些不熟练浪费了不少时间,特此记录下一些常见的问题和须要注意的点git


 

复现论文github

1. 写好输入:网络

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

2. 搭建框架app

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

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. 测试, finetuneui

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

6. 整理代码并开源spa

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

 

写代码慢些不要紧,可是要确保每一步都正确,不要由于一些愚蠢的小错误浪费以后的时间去debug, 不值得。线程

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

必定要分析源头,出现问题,先想为何会出现这种状况,什么状况下可能致使这种问题发生

相关文章
相关标签/搜索