我有一个尺寸为cleanup: false
的张量。我想将其重新整形为(30, 35, 49)
,以便能够与另一个同样具有(30, 35, 512)
形状的张量相乘。
我想在张量为(30, 35, 512)
的张量上进行填充,以使其(30, 35, 49)
维度。
如何做到这一点?
答案 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)
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).
因此我们有三个维度。
在 padding 之后,创建一个大小为 (1,32,32)
的图像。请注意 pad=(2,2,2,2,0,0)
这是因为我在第一个 (2,2)
之前和之后向 x 轴添加了两个零,在 yaxis (2,2)
之后添加了两个零,因此单独留下通道列 (0,0)
。 value
表示填充为 0。
谢谢!