张量变形:einops rearrange 和 view方法的区别

1.rearrange 和 view方法的区别

` rearrange` 和 `view` 都是在 PyTorch 中用于改变 tensor 维度的方法,但是两者有着不同的作用和效果:
  • rearrange 方法用于对 tensor 中的维度顺序进行重排。它将按照用户指定的顺序重新排列维度,并返回一个新的 tensor,而原始 tensor 的数据不会被修改。可以理解为是 PyTorch 版本的 Numpy 中的 transpose 操作。

  • view 方法则是用于改变 tensor 的形状。这个操作不涉及 tensor 中元素的数目或值,只改变 tensor 的张量形状,因此需要满足新形状的张量与原有的张量元素总数相等。如果满足,view 将返回新的 tensor,其数据存储和原始 tensor 相同,即共享存储空间,如果不满足,view 方法会报错。

以下是一个简单的例子:

import torch

# 定义一个 2*3*4 的三维 tensor
x = torch.randn(2, 3, 4)
print(x.shape)  # 输出 (2, 3, 4)

# 使用 rearrange 对 tensor 维度进行重排
y = x.rearrange(1, 2, 0)
print(y.shape)  # 输出 (3, 4, 2)

# 使用 view 改变 tensor 的形状
z = x.view(6, 4)
print(z.shape)  # 输出 (6, 4)

在这个例子中,我们创建了一个 2 × 3 × 4 2 \times 3 \times 4 2×3×4 的三维 tensor,然后使用 rearrange 方法将维度按照 1 − 2 − 0 1-2-0 120 的顺序重新排列,生成了一个新的 tensor 3 × 4 × 2 3 \times 4 \times 2 3×4×2。接下来,我们使用 view 方法将原始 tensor 改成一个 6 × 4 6 \times 4 6×4 的二维 tensor。

2.einops.rearrange 和 view 的区别

`einops.rearrange` 和 pytorch `view` 方法都可用于改变张量的形状,但在实现上有一些区别。下面是这两种方法的一些不同之处:
  • einops.rearrange: 通常可以处理更加复杂的形状变换,并且可读性更好。通过使用类似 “…” 的符号或显式命名维度来操作任意数量的维度,可以轻松地重组和重新排序维度。此外,einops 提供了一组预定义的操作,例如 einops.rearrange('b (h w) c -> b c h w', x) 将形状为 (b, h * w, c) 的张量重塑成形状为 (b, c, h, w)
  • view:通常适用于直接从一个大小相同的张量改变形状。view 要求新形状中的元素数必须与原始张量中的相同,因此不能提供添加/删除/合并维度的功能。

总之,如果需要对张量进行复杂的形状变换,einops 的 rearrange 方法可能更好用。而如果仅需要改变张量的形状而不改变大小,则pytorch的view方法更合适。

3.einops.rearrange 和 einops.layers.torch.Rearrange 的区别

`einops`是一个用于重排和调整张量结构的python库,可以被用于各种机器学习应用中。其中 `einops.rearrange` 和 `einops.layers.torch.rearrange` 两者的区别如下:
  • einops.rearrangeeinops 库提供的主函数之一,用于对张量结构进行改变和重新排列。该函数返回一个新的张量。
  • einops.layers.torch.rearrangepytorch 的另外一个包含在 einops 中的函数。与 einops.rearrange 不同的是,它返回一个 nn.module 对象,而不是一个张量。

因此,主要的区别在于这两个函数返回的对象类型不同。一般来说,如果我们需要将张量的结构进行变换并且需要继续使用该张量,那么我们可以选择使用 einops.rearrange() 来保持输出为张量类型,而如果需要定义一个能够在 pytorch 的计算图中使用的层,则可以考虑使用 einops.layers.torch.rearrange 返回的 nn.module 对象。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值