用pytorch中的填充重塑张量

yus*_*suf 14 pytorch

我有一个尺寸张量(30, 35, 49).我想重新塑造它(30, 35, 512),以便能够与另一个具有形状的张量相乘(30, 35, 512).

我想在(30, 35, 49)尺寸上对张量进行填充以使其具有(30, 35, 512)尺寸.

如何才能做到这一点?

cle*_*ros 18

虽然@nemo的解决方案可以正常工作,但有一个pytorch内部例程torch.nn.functional.pad可以做到这一点-并且具有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)
Run Code Online (Sandbox Code Playgroud)

参数的语义是:

  • input:源张量,
  • pad2 * len(source.shape)格式的长度列表(从最后一个轴开始,从最后一个轴结束,从第2个到最后一个轴,从第2个到最后一个轴结束,从第3个到最后一个轴开始,等等),该形式指出应在开始和结束时添加多少维每个轴的末端
  • mode'constant''reflect''replicate'。默认值:'constant'用于各种填充
  • value 持续填充。

  • 实际上,尺寸的顺序是相反的。因此,填充输入中的前两个值对应于最后一个尺寸(请参阅https://pytorch.org/docs/stable/nn.html#torch.nn.functional.pad) (3认同)
  • @Benedikt谢谢!我更新了答案 (2认同)

nem*_*emo 10

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

target = torch.zeros(30, 35, 512)
source = torch.ones(30, 35, 49)
target[:, :, :49] = source
Run Code Online (Sandbox Code Playgroud)

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

  • 前两个维度仍然相同,但这在大多数情况下不会发生 (2认同)
  • 这不适用于ONNX导出功能 (2认同)

coo*_*ter 10

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

import torch
from torch import nn

x = torch.ones(30, 35, 49)
padded = nn.ConstantPad1d((0, 512 - 49), 0)(x)
Run Code Online (Sandbox Code Playgroud)


Bip*_*Das 6

在此处输入图片说明

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)
Run Code Online (Sandbox Code Playgroud)