一种新的深度学习操作

einops的Python项目详细描述


einops package logo

EINOPS

一种新的深度学习操作的味道,用于numpy、pytorch、tensorflow、chainer、gluon和others

einops引入了一种处理张量的新方法, 提供更安全、可读性更强、语义更丰富的代码。



einops package logo

This video in better quality.

文档/教程

教程是查看einops实际操作的最方便的方法

(教程也用作文档。)

安装

einops没有强制依赖项。

获取最新的github版本

pip install https://github.com/arogozhnikov/einops/archive/master.zip

PYPI发布很快就会发布。

API

公共api上的微引用。

einopsapi是非常简约和强大的。

提供两种操作(请参阅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),)

层可用于chainergluonkerastorch

命名和术语

einops保留爱因斯坦启发的运算符号 (尽管“爱因斯坦操作”听起来更简单更吸引人)。

符号的灵感来源于爱因斯坦求和(特别是numpy.einsum运算)。

  • 术语tensorndarray被等效地使用,并引用多维数组
  • 术语axisdimension也是等价的

为什么使用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。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Android应用程序在后台   如何使用java减去日期。sql。时间戳   在Eclipse中使用Tomcat和Maven的java抛出错误   java Runnable jar什么都不做,资源不导出   并发Java内存模型:volatiles和读/写重新排序   使用Morphia在MongoDB中进行java批量升级。可能吗?   java将自己创建的sqlite数据库复制到安卓失败   在java中使用嵌套循环解决消除?   地图上多个标记的java实时动画   java如何在J2EE web应用程序中从服务层调用DAO方法   java我只想浏览文件,并将其作为电子邮件中的文件。我应如何附加:   猜猜我在think Java中的数字是57   可以在java流中的groupingBy中使用foreach吗?   我的Java程序编译时没有任何错误,但不会完全运行