具体的例子来展示这两种不同的rearrange
调用如何影响Tensor的数据排列。假设我们有一个Tensor h 的大小为 [1, 8, c],其中c是通道数,可以简化为1以便于演示,这样我们可以更清楚地看到数据的变化。此处我们将ws设置为4,以符合你的原始问题描述。
原始的h为:
h = [[0, 1, 2, 3, 4, 5, 6, 7]]
使用不同的rearrange模式
模式一:‘b (ws w) c -> b w ws c’
将中间的维度(ws*w)视为[ws, w],即将8个元素分为ws=4和w=2的两部分。
from einops import rearrange, reduce
import torch
a = torch.tensor([[[0], [1], [2], [3], [4], [5], [6], [7]]])
feature1 = rearrange(a, 'b (ws w) c -> b w ws c', ws=2)
print(feature1.shape)
print(feature1)
输出结果:
torch.Size([1, 4, 2, 1])
tensor([[[[0],
[4]],
[[1],
[5]],
[[2],
[6]],
[[3],
[7]]]])
模式二:‘b (w ws) c -> b w ws c’
将中间的维度视为[w, ws],即将8个元素分为w=2和ws=4的两部分
from einops import rearrange, reduce
import torch
a = torch.tensor([[[0], [1], [2], [3], [4], [5], [6], [7]]])
feature1 = rearrange(a, 'b (w ws) c -> b w ws c', ws=2)
print(feature1.shape)
print(feature1)
输出结果:
torch.Size([1, 4, 2, 1])
tensor([[[[0],
[1]],
[[2],
[3]],
[[4],
[5]],
[[6],
[7]]]])