Гибкие и мощные тензоры для читаемого и надежного кода.
Поддерживает Numpy, Pytorch, Tensorflow, Jax и другие.
torch.compileВ случае, если вам нужны убедительные аргументы в отношении того, чтобы выделить время, чтобы узнать о Einsum и Einops ... Tim Rocktäschel
Написание лучшего кода с Pytorch и Einops? Андрей Карпати
Медленно, но верно, Эйнопс просачивается в каждый укромный уголок моего кода. Если вы обнаружите, что перетасовываете из -за многократных тензоров, это может изменить вашу жизнь Nasim Rahaman
Больше отзывов
Просто и просто:
pip install einops Учебные пособия - самый удобный способ увидеть einops в действии
Капил Сачдева записал небольшое вступление в 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.compile, но не сценарий, способный из-за ограничений TORCH.JIT.Script.
einops означает нотацию в стиле Эйнштейна для операций (хотя «операции Einstein» более привлекательны и легче запомнить).
Обозначения были свободно вдохновлены суммированием Эйнштейна (в частности, при работе 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)' )Вторая строка проверяет, что вход имеет четыре измерения, но вы также можете указать определенные измерения. Это против просто писать комментарии о формах, так как комментарии не предотвращают ошибки, а не тестируются и без обзора кода, как правило, устарели
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 )Есть по крайней мере еще четыре способа сделать это. Какой из них используется в рамках?
Эти детали игнорируются, так как обычно это не имеет значения, но это может иметь большое значение (например, если вы используете сгруппированные свертывания на следующем этапе), и вы хотели бы указать это в своем коде.
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 tileС Einops вам не нужно расшифровать, какая ось повторялась:
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 можно использовать с любой структурой, которая поддерживает стандарт API Python API, который включает
DevContainer предоставляется, эта среда может использоваться локально, или на вашем сервере или в коде GitHub. Начнем с DevContainers в коде VS, Clone Repo и нажмите «RepeN Open в 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 или более поздней версии.