Operasi tensor yang fleksibel dan kuat untuk kode yang dapat dibaca dan andal.
Mendukung Numpy, Pytorch, Tensorflow, Jax, dan lainnya.
torch.compile , Dukungan Standar API Array dan banyak lagiJika Anda membutuhkan argumen yang meyakinkan untuk menyisihkan waktu untuk belajar tentang Einsum dan Einops ... Tim Rocktäschel
Menulis kode yang lebih baik dengan Pytorch dan Einops? Andrej Karpathy
Perlahan tapi pasti, Einops merembes ke setiap sudut dan celah kode saya. Jika Anda mendapati diri Anda berjalan di sekitar Bazillion Dimensional Tensors, ini mungkin mengubah hidup Anda Nasim Rahaman
Lebih banyak testimonial
Polos dan sederhana:
pip install einops Tutorial adalah cara paling nyaman untuk melihat einops beraksi
Kapil Sachdeva merekam intro kecil ke Einops.
einops memiliki API minimalis namun kuat.
Tiga operasi inti yang disediakan (tutorial Einops menunjukkan penumpukan penutup, pembentukan kembali, transposisi, pemerasan/tidak tertuju, mengulangi, ubin, gabungan, tampilan dan banyak pengurangan)
from einops import rearrange , reduce , repeat
# rearrange elements according to the pattern
output_tensor = rearrange ( input_tensor , 't b c -> b c t' )
# combine rearrangement and reduction
output_tensor = reduce ( input_tensor , 'b c (h h2) (w w2) -> b h w c' , 'mean' , h2 = 2 , w2 = 2 )
# copy along a new axis
output_tensor = repeat ( input_tensor , 'h w -> h w c' , c = 3 ) Penambahan kemudian untuk keluarga adalah fungsi pack dan unpack (lebih baik dari tumpukan/split/concatenate):
from einops import pack , unpack
# pack and unpack allow reversibly 'packing' multiple tensors into one.
# Packed tensors may be of different dimensionality:
packed , ps = pack ([ class_token_bc , image_tokens_bhwc , text_tokens_btc ], 'b * c' )
class_emb_bc , image_emb_bhwc , text_emb_btc = unpack ( transformer ( packed ), ps , 'b * c' )Akhirnya, Einops memberi Einsum dukungan dari nama multi-huruf:
from einops import einsum , pack , unpack
# einsum is like ... einsum, generic and flexible dot-product
# but 1) axes can be multi-lettered 2) pattern goes last 3) works with multiple frameworks
C = einsum ( A , B , 'b t1 head c, b t2 head c -> b head t1 t2' ) EinMix adalah lapisan linier generik, sempurna untuk mixer MLP dan arsitektur serupa.
Einops menyediakan lapisan ( einops menyimpan versi terpisah untuk setiap kerangka kerja) yang mencerminkan fungsi yang sesuai
from einops . layers . torch import Rearrange , Reduce
from einops . layers . tensorflow import Rearrange , Reduce
from einops . layers . flax import Rearrange , Reduce
from einops . layers . paddle import Rearrange , Reduce from torch . nn import Sequential , Conv2d , MaxPool2d , Linear , ReLU
from einops . layers . torch import Rearrange
model = Sequential (
...,
Conv2d ( 6 , 16 , kernel_size = 5 ),
MaxPool2d ( kernel_size = 2 ),
# flattening without need to write forward
Rearrange ( 'b c h w -> b (c h w)' ),
Linear ( 16 * 5 * 5 , 120 ),
ReLU (),
Linear ( 120 , 10 ),
)Tidak ada lagi yang dibutuhkan!
Selain itu, lapisan obor karena itu mampu membuat skrip dan dapat dikompilasi. Operasi adalah obor.
einops adalah singkatan dari Einstein yang diilhami untuk operasi (meskipun "Operasi Einstein" lebih menarik dan lebih mudah diingat).
Notasi terinspirasi secara longgar oleh penjumlahan Einstein (khususnya oleh numpy.einsum Operation).
einops ?! y = x . view ( x . shape [ 0 ], - 1 )
y = rearrange ( x , 'b c h w -> b (c h w)' ) Sementara kedua baris ini melakukan pekerjaan yang sama dalam beberapa konteks, yang kedua memberikan informasi tentang input dan output. Dengan kata lain, einops berfokus pada antarmuka: apa input dan output , bukan bagaimana output dihitung.
Operasi berikutnya terlihat serupa:
y = rearrange ( x , 'time c h w -> time (c h w)' )Tapi itu memberi pembaca petunjuk: Ini bukan kumpulan gambar independen yang kami proses, melainkan urutan (video).
Informasi semantik membuat kode lebih mudah dibaca dan dipelihara.
Mempertimbangkan kembali contoh yang sama:
y = x . view ( x . shape [ 0 ], - 1 ) # x: (batch, 256, 19, 19)
y = rearrange ( x , 'b c h w -> b (c h w)' )Baris kedua memeriksa bahwa input memiliki empat dimensi, tetapi Anda juga dapat menentukan dimensi tertentu. Itu bertentangan dengan hanya menulis komentar tentang bentuk karena komentar tidak mencegah kesalahan, tidak diuji, dan tanpa tinjauan kode cenderung ketinggalan zaman
y = x . view ( x . shape [ 0 ], - 1 ) # x: (batch, 256, 19, 19)
y = rearrange ( x , 'b c h w -> b (c h w)' , c = 256 , h = 19 , w = 19 )Di bawah ini kami memiliki setidaknya dua cara untuk menentukan operasi kedalaman-ke-ruang
# depth-to-space
rearrange ( x , 'b c (h h2) (w w2) -> b (c h2 w2) h w' , h2 = 2 , w2 = 2 )
rearrange ( x , 'b c (h h2) (w w2) -> b (h2 w2 c) h w' , h2 = 2 , w2 = 2 )Setidaknya ada empat cara lagi untuk melakukannya. Mana yang digunakan oleh kerangka kerja?
Rincian ini diabaikan, karena biasanya tidak ada bedanya, tetapi dapat membuat perbedaan besar (misalnya jika Anda menggunakan konvolusi yang dikelompokkan pada tahap berikutnya), dan Anda ingin menentukan ini dalam kode Anda.
reduce ( x , 'b c (x dx) -> b c x' , 'max' , dx = 2 )
reduce ( x , 'b c (x dx) (y dy) -> b c x y' , 'max' , dx = 2 , dy = 3 )
reduce ( x , 'b c (x dx) (y dy) (z dz) -> b c x y z' , 'max' , dx = 2 , dy = 3 , dz = 4 )Contoh -contoh ini menunjukkan bahwa kami tidak menggunakan operasi terpisah untuk pengumpulan 1D/2D/3D, semuanya didefinisikan dengan cara yang seragam.
Ruang-ke-kedalaman dan kedalaman ruang didefinisikan dalam banyak kerangka kerja tetapi bagaimana dengan lebar-ke-tinggi? Ini dia:
rearrange ( x , 'b c h (w w2) -> b c (h w2) w' , w2 = 2 )Bahkan fungsi sederhana didefinisikan secara berbeda oleh kerangka kerja yang berbeda
y = x . flatten () # or flatten(x) Misalkan bentuk x adalah (3, 4, 5) , maka y memiliki bentuk ...
(60,)(3, 20) einops bekerja dengan cara yang sama dalam semua kerangka kerja.
Contoh: tile vs repeat menyebabkan banyak kebingungan. Untuk menyalin gambar sepanjang lebar:
np . tile ( image , ( 1 , 2 )) # in numpy
image . repeat ( 1 , 2 ) # pytorch's repeat ~ numpy's tileDengan Einops Anda tidak perlu menguraikan sumbu mana yang diulangi:
repeat ( image , 'h w -> h (tile w)' , tile = 2 ) # in numpy
repeat ( image , 'h w -> h (tile w)' , tile = 2 ) # in pytorch
repeat ( image , 'h w -> h (tile w)' , tile = 2 ) # in tf
repeat ( image , 'h w -> h (tile w)' , tile = 2 ) # in jax
repeat ( image , 'h w -> h (tile w)' , tile = 2 ) # in cupy
... ( etc .)Testimonial memberikan perspektif pengguna tentang pertanyaan yang sama.
Einops bekerja dengan ...
Selain itu, Einops dapat digunakan dengan kerangka kerja apa pun yang mendukung standar API Python Array, yang mencakup
DevContainer disediakan, lingkungan ini dapat digunakan secara lokal, atau di server Anda, atau dalam codespaces github. Untuk memulai dengan DevContainers di VS Code, Clone Repo, dan klik 'Buka kembali di DevContainer'.
Mulai dari versi berikutnya, Einops akan mendistribusikan tes sebagai bagian dari paket. Untuk menjalankan tes:
# pip install einops
python -m einops.tests.run_tests numpy pytorch jax --pip-install numpy pytorch jax adalah contoh, setiap bagian dari kerangka kerja yang dapat diuji dapat disediakan. Setiap kerangka kerja diuji terhadap Numpy, jadi itu adalah persyaratan untuk tes.
Menentukan --pip-install akan menginstal persyaratan di VirtualEnv saat ini, dan harus dihilangkan jika dependensi diinstal secara lokal.
Untuk membangun/menguji dokumen:
hatch run docs:serve # Serving on http://localhost:8000/ Silakan gunakan catatan Bibtex berikut
@inproceedings{
rogozhnikov2022einops,
title={Einops: Clear and Reliable Tensor Manipulations with Einstein-like Notation},
author={Alex Rogozhnikov},
booktitle={International Conference on Learning Representations},
year={2022},
url={https://openreview.net/forum?id=oapKSVM2bcj}
}
einops bekerja dengan Python 3.8 atau lebih baru.