跑实验技巧
Posted lainey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跑实验技巧相关的知识,希望对你有一定的参考价值。
最近在复现一篇论文,遇到了很多坑,也因为自己的一些不熟练浪费了很多时间,特此记录下一些常见的问题和需要注意的点
复现论文
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出来的问题,看着都想打自己!!!
一定要分析源头,出现问题,先想为什么会出现这种情况,什么情况下可能导致这种问题发生
以上是关于跑实验技巧的主要内容,如果未能解决你的问题,请参考以下文章