最近在复现一篇论文,遇到了不少坑,也由于本身的一些不熟练浪费了不少时间,特此记录下一些常见的问题和须要注意的点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
必定要分析源头,出现问题,先想为何会出现这种状况,什么状况下可能致使这种问题发生