読みやすく信頼できるコードのための柔軟で強力なテンソル操作。
Numpy、Pytorch、Tensorflow、Jaxなどをサポートしています。
torch.compile 、配列API標準のサポートなどインズサムとイノプスについて学ぶために時間を確保するための説得力のある議論が必要な場合に備えて...ティムロックテーシェル
PytorchとEinopsでより良いコードを書く?アンドレイ・カルパシー
ゆっくりと、しかし確実に、エイノプスは私のコードの隅々に浸透しています。あなたが自分がむさぼりの寸法のテンソルをシャッフルしていることに気付いた場合、これはあなたの人生を変えるかもしれませんnasim rahaman
より多くの証言
プレーンでシンプル:
pip install einopsチュートリアルは、 einops動作しているのを見るのに最も便利な方法です
Kapil Sachdevaは、Einopsの小さなイントロを録音しました。
einopsは、ミニマルでありながら強力なAPIがあります。
3つのコア操作が提供されます(Einopsチュートリアルには、スタッキング、再シェープ、転置、絞り/queeeze、繰り返し、タイル、視聴、および多数の削減をカバーすることが示されています)
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 )後の家族への追加は、 packとunpack機能です(スタック/分割/連結よりも優れています):
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' )最後に、EinopsはMulti-Lettered NameのサポートをEinsumに提供します。
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は一般的な線形層で、MLPミキサーや同様のアーキテクチャに最適です。
einopsは、対応する関数を反映するレイヤー( einopsフレームワークごとに個別のバージョンを保持します)を提供します
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 ),
)これ以上平らな必要はありません!
さらに、それらのトーチ層はスクリプト可能でコンパイル可能です。操作はtorch.compile-ableですが、torch.jit.scriptの制限によりスクリプト可能ではありません。
einops 、アインシュタインにインスパイアされた運用表の略です(ただし、「アインシュタイン操作」はより魅力的で覚えやすいです)。
表記は、Einstein Summation(特にnumpy.einsum操作による)に大まかに触発されました。
einops Notationを使用するのですか?! y = x . view ( x . shape [ 0 ], - 1 )
y = rearrange ( x , 'b c h w -> b (c h w)' )これらの2つの行は、あるコンテキストで同じ仕事をしていますが、2番目の行は入力と出力に関する情報を提供します。言い換えれば、 einopsインターフェイスに焦点を当てています。出力の計算方法ではなく、入力と出力とは何かです。
次の操作は似ています:
y = rearrange ( x , 'time c h w -> time (c h w)' )しかし、それは読者にヒントを与えます:これは私たちが処理している画像の独立したバッチではなく、むしろシーケンス(ビデオ)です。
セマンティック情報により、コードの読み取りと保守が容易になります。
同じ例を再考してください:
y = x . view ( x . shape [ 0 ], - 1 ) # x: (batch, 256, 19, 19)
y = rearrange ( x , 'b c h w -> b (c h w)' )2行目は、入力に4つの次元があることをチェックしますが、特定の寸法を指定することもできます。コメントがテストされず、コードレビューなしでは時代遅れになる傾向があるため、コメントが間違いを妨げないため、形状に関するコメントを書くこととは反対です
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 )以下に、深さからスペースへの操作を定義する方法が少なくとも2つあります
# 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 )それを行う方法は少なくとも4つあります。フレームワークで使用されているのはどれですか?
これらの詳細は無視されますが、通常は違いはありませんが、大きな違いを生む可能性があります(たとえば、次の段階でグループ化された畳み込みを使用する場合)、コードでこれを指定したいからです。
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 )これらの例は、1D/2D/3Dプーリングに個別の操作を使用しないことを示しています。これらはすべて均一な方法で定義されています。
多くのフレームワークでは、空間から深さまでの空間が定義されていますが、幅から高くなることはどうですか?どうぞ:
rearrange ( x , 'b c h (w w2) -> b c (h w2) w' , w2 = 2 )単純な関数でさえ、異なるフレームワークによって異なって定義されます
y = x . flatten () # or flatten(x) xの形状が(3, 4, 5)であると仮定し、 y形状をしているとします...
(60,)(3, 20) einops 、すべてのフレームワークで同じように機能します。
例: tile対repeat多くの混乱を引き起こします。幅に沿って画像をコピーするには:
np . tile ( image , ( 1 , 2 )) # in numpy
image . repeat ( 1 , 2 ) # pytorch's repeat ~ numpy's tileEinopsを使用すると、どの軸が繰り返されたかを解読する必要はありません。
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 .)証言は、同じ質問に関するユーザーの視点を提供します。
einopsは一緒に働きます...
さらに、einopsは、PythonアレイAPI標準をサポートする任意のフレームワークで使用できます。
DevContainerが提供されます。この環境は、ローカルで、またはサーバーで、またはGitHubコードスペース内で使用できます。 VSコードのDevContainersから始めるには、Clone Repoをクリックし、[DevContainerで再オープン]をクリックします。
次のバージョンから始めて、Einopsはテストをパッケージの一部として配布します。テストを実行するには:
# pip install einops
python -m einops.tests.run_tests numpy pytorch jax --pip-install numpy pytorch jaxは例です。テスト可能なフレームワークのサブセットを提供できます。すべてのフレームワークはnumpyに対してテストされているため、テストの要件です。
--pip-installを指定すると、現在のVirtualenvに要件がインストールされ、依存関係がローカルにインストールされている場合は省略する必要があります。
ドキュメントを作成/テストするには:
hatch run docs:serve # Serving on http://localhost:8000/ 次のBibtexレコードを使用してください
@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 Python 3.8以降で動作します。