模型和訓練參數,數據預處理方式都是相同的,但是PyTorch的實現相對TF實現低了十幾個點,排查了很久都沒有找到原因,請大家幫幫忙,非常感謝!

project:

Tramac/awesome-semantic-segmentation-pytorch?

github.com圖標


不同框架間怎麼做到嚴格對齊(不僅僅是loss曲線長的差不多,而是保證一樣的輸入一樣的輸出)是一個極其挑戰和辛苦的事,框架內部的變化太多了,有些小trick 是靠海量用戶量積累起來的。這也是我們在研發oneflow過程中克服的一個挑戰之一,我們做到了和tensorflow 嚴格對齊,箇中滋味只有嘗過才能理解,我同事近期會寫一篇文章,總結出來對齊過程各種稀奇古怪的坑。

r=x+y+z

r=x+z+y

結果不一樣,在迭代多次以後就差別很大了。


十幾個點肯定是自己的原因。


不知道你網路用了哪些層, 這怎麼說

  1. 初始化有影響——主要是對比時, 使用相對的初始化更好對比, 最終結果也可能有差別
  2. 優化器選擇、學習率、learning rate scheduler, 不過這個應該是最不可能不一樣的, 這用得不一樣, 只能說是粗心了, 沒錯, 我時不時來一下。。。
  3. batchnorm 和 dropout 參數, dropout 層我沒研究清楚, batchnorm 的話, 從調試來看, pytorch的 batchnorm 要把 affine=False, 輸出才能和tensorflow 相同, affine=True 會不一樣
  4. 數據預處理方式相同, 但, 順序有時候也有點影響, 換個 seed 都能有不小的區別, 所以更難說得清楚了, 除非你用相同的代碼讀數據——但靜態的tf 和 pytorch 可能又不那麼好兼容
  5. 忘了。。。

我在我的 sndnyang/DeepLearningCMP里有 notebook, tf_eager.ipynb 和 pytorch.ipynb 兩個文件, 對比了下。。。不過可能有遺漏。


十幾……這鍋工具不好背啊


可以把tensorflow模型轉化為pytorch版本,列印輸出,一層層排查,注意每一層的參數,尤其是bn層。


看看數據訓練前有沒有打散(tf和pytorch是不是一樣), 權重參數初始化的方法是不是一樣,優化器學習率等是不是一樣, 如果這些條件都滿足, 那結果應該相差不大。


我也遇到過 感覺是bn層有問題


有興趣可以看下c代碼層面的優化,之前我也碰到過,一樣的參數一樣的初始化,tf的性能確實優於pytorch


要看看默認的初始化,API中的默認參數是不是一樣的,不然影響會挺大的


這就是神經網路,因為神經


同樣的模型與參數, tensorflow實現的性能比pytorch低了很多。我認為這也可能存在,取決於模型與參數吧。畢竟兩個框架底層有多少不同講不清楚


手寫圖像分割模型,在tensorflow上效果很好,在pytorch上很差。後來發現是損失函數的參數問題,tensorflow中自己寫的多分類focal loss用作分割任務(alpha用0.25),pytorch中重寫了該函數(但是alpha要用1.5至1.75才有效果),有點懵。


推薦閱讀:
相关文章