einops包中的rearrange,reduce, repeat及einops.layers.torch中的Rearrange,Reduce。对高维数据的处理方式

from einops import rearrange, reduce, repeat
from einops.layers.torch import Rearrange, Reduce

一.rearrange和Rearrange,作用:从函数名称也可以看出是对张量尺度进行重排,

区别:
1.einops.layers.torch中的Rearrange,用于搭建网络结构时对张量进行“隐式”的处理

例如:

class PatchEmbedding(nn.Module):
    def __init__(self, in_channels: int = 3, patch_size: int = 16, emb_size: int = 768, img_size: int = 224):
        self.patch_size = patch_size
        super().__init__()
        self.projection = nn.Sequential(
            # using a conv layer instead of a linear one -> performance gains
            nn.Conv2d(in_channels, emb_size, kernel_size=patch_size, stride=patch_size),
            Rearrange('b e (h) (w) -> b (h w) e'),
        )

这里的Rearrange('b e (h) (w) -> b (h w) e'),表示将4维张量转换为3维,且原来的最后两维合并为一维:(16,512,4,16)->(16,64,512)
这样只要我们知道初始的张量维度就可以操作注释来对其进行维度重排。

2.eniops中的rearrange,用于对张量‘显示’的处理,是一个函数

例如:

rearrange(images, 'b h w c -> b (h w) c')

将4维张量转换为3维,同样的,只要我们知道初始维度,就可以操作注释对其进行重排
值得注意的是:这里的注释给定以后就代表当前维度
不能更改,例如:

image = torch.randn(1,2,3,2)  # torch.Size([1,2,3,2]) 

out = rearrange(image, 'b c h w -> b (c h w)', c=2,h=3,w=2) # torch.Size([1,12])
# h,w的值更改
err1 = rearrange(image, 'b c h w -> b (c h w)', c=2,h=2,w=3) # 报错

二.repeat:即将tensor中的某一维度进行重复,以扩充该维度数量

B = 16
cls_token = torch.randn(1, 1, emb_size)
cls_tokens = repeat(cls_token, '() n e -> b n e', b=B)#维度为1的时候可用()代替

将(1,1,emb_size)的张量处理为(B,1,emb_size)

R = 16
a = torch.randn(2,3,4)
b = repeat(a, 'b n e -> (r b) n e', r = R)
#(2R, 3, 4)
c = repeat(a, 'b n e -> b (r n) e', r = R)
#(2, 3R, 4)

#错误用法:
d = repeat(a, 'b n e -> c n e', c = 2R)

#将(2,3,4)维张量处理为(2R, 3, 4)......
上面都是同纬度的扩充,我们看一个升维的扩充:

R = 5
a = torch.randn(2, 3, 4)
d = repeat(a,'b n e->  b n c e ', c = R)

#将(2,3,4)维张量处理为(2, 3, 5, 4)......

这里我们同样只须操作维度注释即可完成相应的张量操作。

三.Reduce 和 reduce:

x = torch.randn(100, 32, 64)
# perform max-reduction on the first axis:
y0 = reduce(x, 't b c -> b c', 'max') #(32, 64)
 
#指定h2,w2,相当于指定池化核的大小
x = torch.randn(10, 512, 30, 40)
# 2d max-pooling with kernel size = 2 * 2 
y1 = reduce(x, 'b c (h1 h2) (w1 w2) -> b c h1 w1', 'max', h2=2, w2=2)
#(10, 512, 15, 20)
 
# go back to the original height and width
y2 = rearrange(y1, 'b (c h2 w2) h1 w1 -> b c (h1 h2) (w1 w2)', h2=2, w2=2)
#(10, 128, 30, 40)
#指定h1,w1,相当于指定池化后张量的大小
# 2d max-pooling to 12 * 16 grid:
y3 = reduce(x, 'b c (h1 h2) (w1 w2) -> b c h1 w1', 'max', h1=12, w1=16)
#(10, 512, 12, 16)

# 2d average-pooling to 12 * 16 grid:
y4 = (reduce(x, 'b c (h1 h2) (w1 w2) -> b c h1 w1', 'mean', h1=12, w1=16)
#(10, 512, 12, 16)

# Global average pooling
y5 = reduce(x, 'b c h w -> b c', 'mean')
#(10, 512)

Redece同理。

注意:这里我们以张量为例,einops同样可以处理numpy下的数据

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值