읽기 쉽고 신뢰할 수있는 코드를위한 유연하고 강력한 텐서 작업.
Numpy, Pytorch, Tensorflow, Jax 등을 지원합니다.
torch.compile , 배열 API 표준 지원 등Einsum과 Einops에 대해 배우기 위해 시간을 따로 설정하는 설득력있는 주장이 필요한 경우 ... Tim Rocktäschel
Pytorch 및 Einops로 더 나은 코드를 작성합니까? Andrej Karpathy
천천히 그러나 확실하게, Einops는 내 코드의 모든 구석 구석과 구석에 스며 들고 있습니다. 만약 당신이 바질 차원 텐서를 뒤섞는 것을 발견한다면, 이것은 당신의 삶을 바꿀 수 있습니다. Nasim Rahaman
더 많은 평가
평범하고 단순 :
pip install einops 튜토리얼은 einops 작동하는 가장 편리한 방법입니다.
Kapil Sachdeva는 Einops에 작은 소개를 기록했습니다.
einops 최소한의 강력한 API를 가지고 있습니다.
제공된 세 가지 핵심 작업 (Einops 튜토리얼은 커버 스태킹, 재구성, 전치, 스퀴즈/퀴즈, 반복, 타일, 컨텍스트,보기 및 수많은 감소를 보여줍니다)
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는 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.jit.script의 제한으로 인해 작업은 Torch.compile-abable이지만 스크립트 가능하지는 않습니다.
einops 아인슈타인에서 영감을 얻은 운영 표기법을 나타냅니다 ( "아인슈타인 작업"은 더 매력적이고 기억하기 쉽습니다).
이 표기법은 아인슈타인 합산 (특히 numpy.einsum 작동)에서 느슨하게 영감을 받았습니다.
einops 표기법을 사용하는 이유는 무엇입니까?! y = x . view ( x . shape [ 0 ], - 1 )
y = rearrange ( x , 'b c h w -> b (c h w)' ) 이 두 줄은 어떤 맥락에서 동일한 작업을 수행하는 반면, 두 번째 라인은 입력 및 출력에 대한 정보를 제공합니다. 다시 말해, 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)' )두 번째 줄은 입력에 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 )아래에는 깊이-공간 작업을 정의하는 두 가지 방법이 있습니다.
# 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 Array API 표준을 지원하는 모든 프레임 워크와 함께 사용할 수 있습니다.
DevContainer가 제공되며,이 환경은 로컬, 서버 또는 GitHub 코드 스페이스 내에서 사용될 수 있습니다. VS 코드의 DevContainers로 시작하려면 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 이상에서 작동합니다.