ShapeGuard允许您以一种动态的、受einsum启发的方式非常简洁地断言张量的预期形状。

torch-shapeguard的Python项目详细描述


形卫兵

ShapeGuard允许您以一种动态的、受einsum启发的方式非常简洁地断言张量的预期形状

在ml中生成bug很容易。一个特别丰富的bug源是由于操作符的灵活性:a*b不管a和b是向量、标量向量、向量向量等等,都可以工作。同样地,{}也可以工作,而不管张量的形状如何。既然我们在优化我们最终执行的任何计算,我们可能可以优化它,使其合理工作,即使它没有做我们想要的。如果我们的算法能更好地工作的话。这使得bug很难被发现。在

我发现避免错误的最好方法就是一直虔诚地检查我所有张量的形状,所以我最终花了很多时间调试并到处写诸如#(bs, n_samples, z_size)之类的评论。在

那么为什么不通过算法检查形状呢?它很快就变丑了。在

您必须在任何地方添加assert foo.shape == (bs, n_samples, x_size),这实际上使您的行数和 你必须定义你所有的尺寸尺寸(bs等),这些尺寸可能会随列车/测试、批次等的不同而变化。 所以我做了个小帮手让它变得更好。我叫它ShapeGuard。导入时,它将sg方法添加到torch.Tensor和{},并公开一个静态的ShapeGuard类。在

您可以像使用断言一样使用sg方法:

defforward(self,x,y):x.sg("bchw")y.sg("by")

这将验证x有4个维度,y有2个维度,并且x和y在第一个维度“b”中具有相同的大小。如果assert通过,则返回张量。这意味着您还可以在操作结果中内联使用它:

^{pr2}$

如果assert失败,它将生成一条很好的错误消息。在

它的工作方式如下:第一次为一个看不见的形状调用sg时,该形状的张量大小保存在ShapeGuard.shapes全局dict中。随后的调用会在形状dict中看到此形状,并断言该维度的张量是相同的形状。例如,如果批量大小在训练和测试之间发生变化,您可以调用ShapeGuard.reset("b")来重置“b”形状。在

我发现通过调用ShapeGuard.reset()来重置主nn.Module.forward开头的所有形状效果很好。如果你想验证一个精确的尺寸,你可以传递一个整数作为形状

defforward(self,x,y):x.sg(("b",1,"h","w"))y.sg("by")

特殊形状“*”是为不应断言的形状保留的,例如,x.sg("*chw")将断言除第一个形状之外的所有形状。在

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

推荐PyPI第三方库


热门话题
java JNLP无法在浏览器中正确启动(与dtjava.js一起部署)   在执行下一个方法之前,java将等待线程执行结束   java如何将另一个LayoutManager应用于JComboBox?(多栏JComboBox尝试)   使用jPBC在java中实现双线性配对   java在使用@RequestMapping注释时获取请求的值(URL)   java如何控制流量   java如何获取IFC对象的绝对坐标?   java目标服务器无法使用htmlunit和tor响应异常   java需要帮助创建一个循环结构来运行我的程序   java有可能拥有一个Android APK并在应用程序中更改构建变体吗?   在Sphinx4中运行Ant的java   Java:从ArrayList获取子列表的有效方法   java如何使在循环内部创建的数组在循环外部工作?   apache poi通过java中的XSSF表从单元格读取日期值   安卓 java自己的SeqLock实现,避免spinlock会更好吗?   java的并发底层方法。util。同时发生的预定未来   java比较方法违反了它的一般约定,如何使它具有可传递性?   使用JAVA定向指定类的DB导出子类   一个方法中的java更改特定imageView