一种新的深度学习操作
einops的Python项目详细描述
EINOPS
一种新的深度学习操作的味道,用于numpy、pytorch、tensorflow、chainer、gluon和others。
einops
引入了一种处理张量的新方法,
提供更安全、可读性更强、语义更丰富的代码。
文档/教程
教程是查看einops
实际操作的最方便的方法
- 第1部分:einops fundamentals
- 第2部分:einops for deep learning
- 第3部分:待定
(教程也用作文档。)
安装
einops
没有强制依赖项。
获取最新的github版本
pip install https://github.com/arogozhnikov/einops/archive/master.zip
PYPI发布很快就会发布。
API
公共api上的微引用。
einops
api是非常简约和强大的。
提供两种操作(请参阅einops
基础知识指南)
fromeinopsimportrearrange,reduce# rearrange elements according to patternoutput_tensor=rearrange(input_tensor,pattern,**axes_lengths)# rearrange elements according to patternoutput_tensor=reduce(input_tensor,pattern,reduction,**axes_lengths)
两个辅助函数
fromeinopsimportasnumpy,parse_shape# einops.asnumpy converts tensors of imperative frameworks to numpynumpy_tensor=asnumpy(input_tensor)# einops.parse_shape returns a shape in the form of a dictionary, axis name mapped to its length parse_shape(input_tensor,pattern)
和两层(每个框架的单独版本)具有相同的api。
fromeinops.layers.chainerimportRearrange,Reducefromeinops.layers.gluonimportRearrange,Reducefromeinops.layers.kerasimportRearrange,Reducefromeinops.layers.torchimportRearrange,Reduce
Einops
层的行为与操作相同,并且具有相同的参数
(对于第一个参数的异常,它应该在调用期间传递)
layer=Rearrange(pattern,**axes_lengths)# applying to tensorx=layer(x)layer=Reduce(pattern,reduction,**axes_lengths)# applying to tensorx=layer(x)
通常,使用层而不是操作来构建模型更为方便
# example given for pytorch, but code in other frameworks is almost identical fromtorch.nnimportSequential,Conv2d,MaxPool2d,Linear,ReLUfromeinops.layers.torchimportReducemodel=Sequential(Conv2d(3,6,kernel_size=5),MaxPool2d(kernel_size=2),Conv2d(6,16,kernel_size=5),Reduce('b c (h h2) (w w2) -> b (c h w)','max',h2=2,w2=2),# combined pooling and flatteningLinear(16*5*5,120),ReLU(),Linear(120,10),)
层可用于chainer
、gluon
、keras
和torch
。
命名和术语
einops
保留爱因斯坦启发的运算符号
(尽管“爱因斯坦操作”听起来更简单更吸引人)。
符号的灵感来源于爱因斯坦求和(特别是numpy.einsum
运算)。
- 术语
tensor
和ndarray
被等效地使用,并引用多维数组 - 术语
axis
和dimension
也是等价的
为什么使用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)')
第二行检查输入中是否有四个维度, 但也可以指定特定的尺寸。 这是反对只写关于形状的评论,因为 comments don't work 我们知道
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 spacerearrange(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 dx) -> b c x y','max',dx=2,dy=3)reduce(x,'b c (x dx) (y dx) (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,)
- keras,tensorflow.layers,mxnet和胶子:
(3, 20)
- pytorch:没有这样的功能
支持的框架
Einops与…
贡献
最好的贡献方式是
- 传播关于
einops
的信息
- 为您喜爱的深度学习框架准备指南/帖子/教程
- 用英语以外的语言翻译例子也是一个好主意
- 在论文中使用
einops
符号来严格定义正在使用的操作
支持的Python版本
einops
适用于python 3.5或更高版本。
代码中没有特定于Python3的内容, 我们只是need to move further 我决定不支持python 2。