如何堆叠不同大小的矩阵

How to stack matrices with different size

我有一个大小为 (63,32,1,600,600) 的矩阵列表,当我想将它与 torch.stack(matrices).cpu().detach().numpy() 堆叠时,它出现错误:

“堆栈期望每个张量大小相等,但在条目 0 处得到 [32, 1, 600, 600],在条目 62 处得到 [16, 1, 600, 600]”。尝试调整大小,但没有成功。我很感激任何建议。

如果我理解正确的话,你想做的是将输出的小批量堆叠成一个批量。我敢打赌你的最后一批是部分填充的(只有 16 个元素而不是 32)。

而不是在批处理轴上使用 torch.stack (creating a new axis), I would simply concatenate with torch.cat (axis=0)。假设 matrices 列表 torch.Tensors.

torch.cat(matrices).cpu().detach().numpy()

默认情况下 torch.cataxis=0 上连接。

当我们的张量仅在第一个维度上大小不同时,as of PyTorch v1.7.0, we can use torch.vstack() 将其沿轴 0 堆叠。使用 torch.stack() 在这里失败,因为它期望所有张量具有相同的形状.

这是一个与您的问题描述相匹配的可重现的插图:

# sample tensors (as per your size)
In [65]: t1 = torch.randn([32, 1, 600, 600])
In [66]: t2 = torch.randn([16, 1, 600, 600])

# vertical stacking (i.e., stacking along axis 0)
In [67]: stacked = torch.vstack([t1, t2])

# check shape of output
In [68]: stacked.shape
Out[68]: torch.Size([48, 1, 600, 600])

我们得到 48 (32 + 16) 作为结果中第一个维度的大小,因为我们沿着那个维度堆叠张量。


注:

你也可以初始化结果张量,比如stacked,通过显式计算形状并将这个张量作为参数传递给torch.vstack()out= kwarg,如果你想写结果为特定张量,例如更新现有张量(相同形状)的值。但是,这是可选的。

# calculate new shape of stacking
In [80]: newshape = (t1.shape[0] + t2.shape[0], *t1.shape[1:])

# allocate an empty tensor, filled with garbage values
In [81]: stacked = torch.empty(newshape)

# stack it along axis 0 and write the result to `stacked`
In [83]: torch.vstack([t1, t2], out=stacked)

# check shape/size
In [84]: stacked.shape
Out[84]: torch.Size([48, 1, 600, 600])