如何堆叠不同大小的矩阵
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.Tensor
s.
torch.cat(matrices).cpu().detach().numpy()
默认情况下 torch.cat
在 axis=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])
我有一个大小为 (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.Tensor
s.
torch.cat(matrices).cpu().detach().numpy()
默认情况下 torch.cat
在 axis=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])