您好,登錄后才能下訂單哦!
怎么編寫同時在PyTorch和Tensorflow上工作的代碼,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Foolbox是一個構建在EagerPy之上的Python庫。該庫是用EagerPy而不是NumPy重寫的,以實現在PyTorch和TensorFlow中開發,并且只有一個代碼庫,沒有代碼重復。Foolbox是一個對機器學習模型進行對抗性攻擊的庫。
為了解決框架之間的差異,作者探索了句法偏差。在PyTorch的情況下,使用In-place的梯度需要使用**_grad_(),而反向傳播是使用backward**()調用的。
然而,TensorFlow提供了一個高級管理器和像tape.gradient這樣的函數來查詢梯度。即使在句法層面,這兩個框架也有很大的不同。例如,對于參數,dim vs axis;對于函數,sum vs reduce_sum。
這就是“EagerPy ”發揮作用的地方。它通過提供一個統一的API來解決PyTorch和TensorFlow之間的差異,該API透明地映射到各種底層框架,而無需計算開銷。
“EagerPy允許你編寫自動使用PyTorch、TensorFlow、JAX和NumPy的代碼。”
研究人員寫道,EagerPy專注于Eager執行,此外,它的方法是透明的,用戶可以將與框架無關的EagerPy代碼與特定于框架的代碼結合起來。
TensorFlow引入的eager執行模塊和PyTorch的相似特性使eager執行成為主流,框架更加相似。然而,盡管PyTorch和TensorFlow2之間有這些相似之處,但編寫框架無關的代碼并不簡單。在語法層面,這些框架中用于自動微分的api是不同的。
自動微分是指用算法求解微分方程。它的工作原理是鏈式規則,也就是說,求解函數的導數可以歸結為基本的數學運算(加、減、乘、除)。這些算術運算可以用圖形格式表示。EagerPy特別使用了一種函數式的方法來自動區分。
下面是一段來自文檔的代碼片段:
import eagerpy as ep x = ep.astensor(x) def loss_fn(x): #這個函數接受并返回一個eager張量 return x.square().sum() print(loss_fn(x)) # PyTorchTensor(tensor(14.)) print(ep.value_and_grad(loss_fn, x))
首先定義第一個函數,然后根據其輸入進行微分。然后傳遞給ep.value_and_grad 來得到函數的值及其梯度。
此外,norm函數現在可以與PyTorch、TensorFlow、JAX和NumPy中的原生張量和數組一起使用,與本機代碼相比幾乎沒有任何開銷。它也適用于GPU張量。
import torch norm(torch.tensor([1., 2., 3.])) import tensorflow as tf norm(tf.constant([1., 2., 3.]))
總之,EagerPy 旨在提供以下功能:
為快速執行提供統一的API
維護框架的本機性能
完全可鏈接的API
全面的類型檢查支持
研究人員聲稱,這些屬性使得使用這些屬性比底層框架特定的api更容易、更安全。盡管有這些變化和改進,但EagerPy 背后的團隊還是確保了eagerpy API遵循了NumPy、PyTorch和JAX設置的標準。
使用pip從PyPI安裝最新版本:
python3 -m pip install eagerpy
import eagerpy as ep def norm(x): x = ep.astensor(x) result = x.square().sum().sqrt() return result.raw
關于怎么編寫同時在PyTorch和Tensorflow上工作的代碼問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。