同乙個模型用theano,tf,pytorch實現,performance可能差距較大嗎?

時間 2021-05-09 11:19:35

1樓:大尾巴

可能,之前一次自己用tf實現乙個網路,但是github上面pretrain weight是keras的,所以遇到了很多問題:

1.即使引數,權重原理都一樣,實現不一樣導致遷移模型非常麻煩,比如keras的gru和tf的gru cell,兩者的權重做的運算邏輯不一樣,要自己找到對映關係

2.上面的還可以解決,但是轉換weight之後效果仍然有問題,查了一下最後是因為兩個工具實現裡面pooling層的padding方式不一樣,也就是說即使引數一樣,兩者的pooling方式也不一樣

所以各個工具的實現都有自己不同的微小差別,但是可能導致最後的效果不一樣

2樓:Abakus

我遇到乙個類似的問題,模型用pytorch練出來val accuracy 到85%就成為瓶頸,keras可以到91%。詭異的是training accuracy和loss pytoch 和 keras很接近,但val就是不對。試過各種regularization, 完全無效。

至今滿頭問號。

3樓:

Attention based Handwritten Mathematical Expression Recognition. 現在已有theano的model,嘗試遷移到TensorFlow的框架下,搞了將近乙個月。剛實現出來的時候各種模型表現不一致,然後各個components的input和output作對比,終於跟原模型達到了一致的表現效果。

個人的感覺是其實不同框架的基礎運算操作都是一樣的,至少工程師在做測試的時候一定是可以保證正確性的,如果有不一致了,那麼要麼是你沒有對框架的設計概念有很好的理解比如tensorflow裡邊的get_variable和Variable的區別,variable_scope和name_scope的區別;要麼是你真的只把這個框架當成積木了,不關心裡邊的引數設定以及每乙個模組的基本運算原理比如每個卷積核的初始化方式,每種優化演算法的迭代公式。這些都是能夠造成巨大差異的微小卻關鍵的點。所以說遇到了模型表現不一致的問題,不要傷心不要沮喪,靜下心來推一遍模型中資料的流動軌跡,考察一下該框架下的每乙個操作的引數設定是不是一致的,初始化方式有沒有坑點,祝福每個煉丹師都能克服玄學~

4樓:

如果權重引數一樣,結果肯定一致, 我曾把pytorch訓好的crnn模型裡面的引數手動assign到tensorflow,開始始終結果不達標,後來發現pytorch和tensorflow lstm三個門的排列順序不一樣,解決之後兩者的輸出就完全一樣了

5樓:

看到有提復現達不到精度問題的.

建議考慮考慮模型之外的問題. 比如multi-crop, 比如資料增廣. 作者因為篇幅有限,不寫這些模型之外的操作尚可理解. 下面介紹幾個簡單好用高價效比的增廣方法

Cutout ([1708.04552] Improved Regularization of Convolutional Neural Networks with Cutout)

mixup (mixup: Beyond Empirical Risk Minimization),在一些時序資料上feature層比input層好用.

)資料增廣很好用,畢竟l1,l2,dropout都能看做資料增廣......

Jordan去年的Perturbing Gradient Descent在GD時加雜訊也是相當於在每次迭代時修改資料.

6樓:Eason

RNN類的模型,用微軟的CNTK試一下?香港浸會大學之前做過乙個測試,優勢明顯。現在不知道效果差距,另外微軟,臉書,亞馬遜等一起搞了ONNX,以後模型遷移會越來越方便。

7樓:pita

同樣的資料集和網路結構,用pytorch的損失降到0.4, tensorflow的損失只能降到0.44,各種初始化引數,調整學習率都沒效果,我已經不會了,只能告別tensorflow?

8樓:

你們對用最優化方法解決高維非線性問題一無所知~~~(滑稽

高維非線性問題簡直是人類科技的死穴,隨便拿個學科出來,最後都會發現高維非線性問題擋在那。能搞出點東西來就算不錯啦,成系統的理論根本沒有,把超參設一設,開始迭代,回家睡覺啦!

9樓:應小興

光談pytorch和tensorflow,performance可能存在差距,但這基於某些特定情況。譬如,多於多工網路,當梯度從網路不同的兩個分支反向傳播時,若網路層通路複雜,就可能導致引數更新不一致。分析其原因,可能在於兩者實現可能存在差異,簡單的情況效果基本一致,但複雜情況下就存在差異,目前我還沒找到具體關於兩者實現的差別(在復現某些演算法的時候,爬過坑,發現相同的網路結構和loss計算,pytorch復現不了但tensorflow能夠復現效果)。

個人經歷。。。。。

10樓:李鳶

pytorch沒經驗,但TF和Theano先來占個坑。但是我們的TF大部分是from scratch,基本不用tf.contrib裡面的API

CNN:accuracy上沒什麼區別(有區別問題就大了)但是TF training speed普遍比較快(大概快1.5倍的樣子),convergence的話theano比較快。

正在試GRU/LSTM:個人覺得TF寫起來比較麻煩(各種variable_scope, name_scope,也可能才從Theano轉過來不太習慣,因為theano的symbolic graph並不完完全全是分開的)但是TF的debug比較簡單(Lots of thanks to Tensorboard)。目前卡了乙個問題,不知道怎麼implement Thenao的scan()裡的truncated BPTT,其他的好像performance也差不多

但是Theano比較容易出OOM error而且比較佔資源,TF就可以直接config session

11樓:silverBullet

乙個主要的差異是符號(Symbolic) vs 命令式(Imperative)程式差異。

命令式程式(Torch, Chainer):

Python 或 C++ 是命令式程式。當你執行它們時,命令式程式執行計算。當程式執行 y = 1 + x 時,它就是執行實際的數值計算。

優點是更加靈活,debug更容易,程式語言本身更貼近自然語言。例如,可以直接在計算中print值,或者在計算流程中的任意點使用本地控制流和迴圈。

符號程式(Theano, TensorFlow):

符號程式不同,它首先抽象地定義乙個函式。在定義函式時,不會進行實際的數值計算。我們根據佔位符值定義抽象函式。

然後,程式可以編譯該函式,並在給出實際輸入的情況下評估這個函式。當程式執行 y = 1 + x 時,沒有計算發生。相反,此操作會生成乙個計算圖(也稱為符號圖),用於表示計算。

符號程式相對沒那麼靈活。但有另外的好處。

大多數符號式程式都明確或隱含地包含編譯步驟。當編譯 x 時,我們告訴系統我們只需要 x 的值。計算的中間值我們是看不見的。

符號程式還可以執行另一種優化,稱為操作摺疊,比如把幾個計算合併為乙個,如果在GPU上執行,則會執行乙個 GPU 核心,而不是多個。事實上,這是優化庫(如 CXXNet 和 Caffe)的優化方法之一。摺疊操作提高了計算效率,減少資料傳遞。

命令式程式不能執行操作摺疊,因為不確定哪些中間值需要在之後用到,如果都略過,後面要用到時還得再執行一次。但在符號程式中因為可以得到整個計算圖,明確指定哪些值將需要,哪些不需要。

12樓:

我也試過tensorflow和pytorch對比,我把tensorflow的模型用pytorch復現了一遍,差了好幾個點,後來研究發現也是引數初始化的問題,不一定要按照tensorlfow的引數初始化方法,但要重新調,後來得到了可以相當的結果。

13樓:元峰

所有引數相同,模型初始化方式相同,理論上應該是一致的,不過不同框架可能在計算方法上(例如矩陣求逆,求導,可能用的優化計算方法不一樣),或者浮點計算上保留的精度不一樣,那就會產生差距了。

考研室友和你考同乙個大學同乙個專業?

落辰 如果ta比你優秀 比你更加上進,你不妨主動提出與ta一起努力,有困難互相照應一下,多交流一下學習期間的經驗。如果ta意志不堅定 做事拖沓 沒什麼理想,那你選擇乙個人奮鬥會更好,回到寢室盡量不要再學習,也不要聽ta或者其他室友說些沒用的話,保證自己良好的心態。當然有時候和室友簡單聊聊,可以緩解壓...

同乙個訓練集 模型和引數,每次訓練的結果都不一樣,最大相差3 ,所以請問實驗訓練的結果怎樣才算最好?

漁舟唱晚 如果網路結構相同,使用下面的設定可以固定隨機種子,方便對比結果。但如果網路結構有變化,哪怕多乙個變數,乙個類成員值,隨機值會隨著模型整體發生變化。下面使得每次的結果是固定的 init seed 34 torch.manual seed init seed torch.cuda.manual...

同乙個物種不同品種間同乙個基因的鹼基序列完全相同嗎?相似度會達到多少?

鐘文 分子生物學實驗想拿到乙個蛋白,常用的基因序列不外乎human,rat,mouse,monkey等模式生物的cDNA文庫,在此之前你得去multi alignment各個物種的序列,構建進化樹來確定這個基因的conserve程度。同乙個物種不同品種,比如說同乙個物種的monkey,不同品種比如說...