最近在復現一篇論文,遇到了不少坑,也由於本身的一些不熟練浪費了不少時間,特此記錄下一些常見的問題和須要注意的點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
必定要分析源頭,出現問題,先想爲何會出現這種狀況,什麼狀況下可能致使這種問題發生