作者 | Ram Sagar
編譯 | VK
來源 | Analytics In Diamag
❝「庫開發人員不再需要在框架之間進行選擇。」
❞來自德國圖賓根人工智慧中心的研究人員介紹了一種新的Python框架EagerPy,EagerPy允許開發人員編寫獨立於PyTorch和TensorFlow等流行框架的代碼。
在最近發表的一篇關於EagerPy的文章中,研究人員寫道,庫開發人員不再關注框架依賴性。他們的新Python框架,急切地解決了它們的重新實現和代碼複製障礙。
例如,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更容易、更安全。儘管有這些變化和改進,但EagerPy 背後的團隊還是確保了eagerpy API遵循了NumPy、PyTorch和JAX設置的標準。
入門「EagerPy」:使用pip從PyPI安裝最新版本:
python3 -m pip install eagerpyimport eagerpy as ep
def norm(x):
x = ep.astensor(x)
result = x.square().sum().sqrt()
return result.raw了解更多關於「eagerpy」的信息:https://eagerpy.jonasrauber.de/guide/autodiff.html
原文連結:https://analyticsindiamag.com/eagerpy-pytorch-tensorflow-coding/