用pytorch中的填充重塑张量

时间:2018-02-08 13:43:32

标签: pytorch

我有一个尺寸为cleanup: false的张量。我想将其重新整形为(30, 35, 49),以便能够与另一个同样具有(30, 35, 512)形状的张量相乘。

我想在张量为(30, 35, 512)的张量上进行填充,以使其(30, 35, 49)维度。

如何做到这一点?

6 个答案:

答案 0 :(得分:7)

最简单的解决方案是使用填充值和目标维度分配张量,并指定您拥有数据的部分:

target = torch.zeros(30, 35, 512)
source = torch.ones(30, 35, 49)
target[:, :, :49] = source

请注意,无法保证用零填充张量然后将其乘以另一个张量最终会有意义,这取决于你。

答案 1 :(得分:4)

虽然@nemo的解决方案可以正常工作,但是有一个pytorch内部例程可以执行此操作-并且具有torch.ones(*sizes)*pad_value解决方案不具备的一些属性(即其他形式的填充,例如反射填充或复制填充.. ,它还会检查一些与梯度相关的属性):

import torch.nn.functional as F
source = torch.rand((5,10))
# now we expand to size (7, 11) by appending a row of 0s at pos 0 and pos 6, 
# and a column of 0s at pos 10
result = F.pad(input=source, pad=(0, 1, 1, 1), mode='constant', value=0)

参数的语义是:input-源张量pad-长度2 * len(source.shape)的形式列表(从最后一个轴开始,从最后一个轴开始,从第二个开始到最后一个轴,从第2个到最后一个轴的末端,从第3个到最后一个轴的开始,依此类推),该状态指出应向每个轴的起点和终点添加多少尺寸,mode-'常量','反射'或'复制'。默认值:“ constant”表示各种填充,最后为value表示恒定填充。

答案 2 :(得分:2)

torch.nn.ConstantPad1d是一个可能更清晰,更适合此问题的模块,例如

import torch
from torch import nn

x = torch.ones(30, 35, 49)
padded = nn.ConstantPad1d((0, 512 - 49), 0)(x)

答案 3 :(得分:2)

enter image description here

import torch.nn.functional as F
data = torch.ones(4, 4)
# pad(left, right, top, bottom)
new_data = F.pad(input=data, pad=(1, 1, 1, 1), mode='constant', value=0)
print(new_data)

答案 4 :(得分:1)

这里的想法是使用 torch.cat 用您想要的张量填充该特定维度。这个例子应该更清楚。

In [1]: import torch

In [2]: a = torch.randn(30, 35, 49)

In [3]: b = torch.randn(30, 35, 512)

In [4]: padder = torch.zeros(30,35,512 - 49)

In [5]: padded_a = torch.cat([a,padder], dim = 2) # Choose your desired dim

In [6]: padded_a.shape
Out[6]: torch.Size([30, 35, 512])

In [7]: target = torch.randn(30,35,512)

In [8]: target = torch.cat([target,padded_a], dim = 2)

In [9]: target.shape
Out[9]: torch.Size([30, 35, 1024])

答案 5 :(得分:1)

只是想说明@ghchoi 给出的答案。因为我在跟踪它时遇到了一些麻烦。

由于内核大小限制,我想将尺寸为 (N,1,28,28) 的标准 mnist 图像放入 LeNet(早在 1998 年提出),预计输入的形状为 (N,1,32,32)。所以假设我们尝试通过填充来缓解这个问题。

填充前

在填充单个图像之前,它的大小为 (1,28,28). 因此我们有三个维度。

before_padding

填充后

在 padding 之后,创建一个大小为 (1,32,32) 的图像。请注意 pad=(2,2,2,2,0,0)

这是因为我在第一个 (2,2) 之前和之后向 x 轴添加了两个零,在 yaxis (2,2) 之后添加了两个零,因此单独留下通道列 (0,0)value 表示填充为 0。

after_padding

谢谢!