Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

reshaping a tensor with padding in pytorch

Tags:

python

pytorch

How do I reshape a tensor with dimensions (30, 35, 49) to (30, 35, 512) by padding it?

like image 887
yusuf Avatar asked Feb 08 '18 13:02

yusuf


People also ask

What does padding do in PyTorch?

Constant padding is implemented for arbitrary dimensions. Replicate and reflection padding are implemented for padding the last 3 dimensions of a 4D or 5D input tensor, the last 2 dimensions of a 3D or 4D input tensor, or the last dimension of a 2D or 3D input tensor.

What is padding in tensor?

paddings is an integer tensor with shape [n, 2] , where n is the rank of tensor . For each dimension D of input , paddings[D, 0] indicates how many values to add before the contents of tensor in that dimension, and paddings[D, 1] indicates how many values to add after the contents of tensor in that dimension.


2 Answers

While @nemo's solution works fine, there is a pytorch internal routine, torch.nn.functional.pad, that does the same - and which has a couple of properties that a torch.ones(*sizes)*pad_value solution does not (namely other forms of padding, like reflection padding or replicate padding ... it also checks some gradient-related properties):

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)

The semantics of the arguments are:

  • input: the source tensor,
  • pad: a list of length 2 * len(source.shape) of the form (begin last axis, end last axis, begin 2nd to last axis, end 2nd to last axis, begin 3rd to last axis, etc.) that states how many dimensions should be added to the beginning and end of each axis,
  • mode: 'constant', 'reflect' or 'replicate'. Default: 'constant' for the different kinds of padding
  • value for constant padding.
like image 64
cleros Avatar answered Oct 06 '22 22:10

cleros


The simplest solution is to allocate a tensor with your padding value and the target dimensions and assign the portion for which you have data:

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

Note that there is no guarantee that padding your tensor with zeros and then multiplying it with another tensor makes sense in the end, that is up to you.

like image 39
nemo Avatar answered Oct 06 '22 23:10

nemo