mindspore.nn.Pad
- class mindspore.nn.Pad(paddings, mode='CONSTANT')[source]
Pads the input tensor according to the paddings and mode.
- Parameters
paddings (tuple) –
The shape of parameter paddings is (N, 2). N is the rank of input data. All elements of paddings are int type. For D th dimension of the x, paddings[D, 0] indicates how many sizes to be extended ahead of the D th dimension of the input tensor, and paddings[D, 1] indicates how many sizes to be extended behind of the D th dimension of the input tensor. The padded size of each dimension D of the output is: \(paddings[D, 0] + input\_x.dim\_size(D) + paddings[D, 1]\), e.g.:
mode = "CONSTANT". paddings = [[1,1], [2,2]]. x = [[1,2,3], [4,5,6], [7,8,9]]. # The above can be seen: 1st dimension of `x` is 3, 2nd dimension of `x` is 3. # Substitute into the formula to get: # 1st dimension of output is paddings[0][0] + 3 + paddings[0][1] = 1 + 3 + 1 = 5. # 2nd dimension of output is paddings[1][0] + 3 + paddings[1][1] = 2 + 3 + 2 = 7. # So the shape of output is (5, 7).
mode (str) – Specifies padding mode. The optional values are “CONSTANT”, “REFLECT”, “SYMMETRIC”. Default: “CONSTANT”.
- Inputs:
x (Tensor) - The input tensor.
- Outputs:
Tensor, the tensor after padding.
If mode is “CONSTANT”, it fills the edge with 0, regardless of the values of the x. If the x is [[1,2,3], [4,5,6], [7,8,9]] and paddings is [[1,1], [2,2]], then the Outputs is [[0,0,0,0,0,0,0], [0,0,1,2,3,0,0], [0,0,4,5,6,0,0], [0,0,7,8,9,0,0], [0,0,0,0,0,0,0]].
If mode is “REFLECT”, it uses a way of symmetrical copying through the axis of symmetry to fill in. If the x is [[1,2,3], [4,5,6], [7,8,9]] and paddings is [[1,1], [2,2]], then the Outputs is [[6,5,4,5,6,5,4], [3,2,1,2,3,2,1], [6,5,4,5,6,5,4], [9,8,7,8,9,8,7], [6,5,4,5,6,5,4]].
If mode is “SYMMETRIC”, the filling method is similar to the “REFLECT”. It is also copied according to the symmetry axis, except that it includes the symmetry axis. If the x is [[1,2,3], [4,5,6], [7,8,9]] and paddings is [[1,1], [2,2]], then the Outputs is [[2,1,1,2,3,3,2], [2,1,1,2,3,3,2], [5,4,4,5,6,6,5], [8,7,7,8,9,9,8], [8,7,7,8,9,9,8]].
- Raises
TypeError – If paddings is not a tuple.
ValueError – If length of paddings is more than 4 or its shape is not (n, 2).
ValueError – If mode is not one of ‘CONSTANT’, ‘REFLECT’, ‘SYMMETRIC’.
- Supported Platforms:
Ascend
GPU
CPU
Examples
>>> from mindspore import Tensor >>> import mindspore.nn as nn >>> import numpy as np >>> # If `mode` is "CONSTANT" >>> class Net(nn.Cell): ... def __init__(self): ... super(Net, self).__init__() ... self.pad = nn.Pad(paddings=((1, 1), (2, 2)), mode="CONSTANT") ... def construct(self, x): ... return self.pad(x) >>> x = Tensor(np.array([[1, 2, 3], [4, 5, 6]]), mindspore.float32) >>> pad = Net() >>> output = pad(x) >>> print(output) [[0. 0. 0. 0. 0. 0. 0.] [0. 0. 1. 2. 3. 0. 0.] [0. 0. 4. 5. 6. 0. 0.] [0. 0. 0. 0. 0. 0. 0.]] >>> # Another way to call >>> pad = ops.Pad(paddings=((1, 1), (2, 2))) >>> # From the above code, we can see following: >>> # "paddings=((1, 1), (2, 2))", >>> # paddings[0][0] = 1, indicates a row of values is filled top of the input data in the 1st dimension. >>> # Shown as follows: >>> # [[0. 0. 0.] >>> # [1. 2. 3.] >>> # [4. 5. 6.]] >>> # paddings[0][1] = 1 indicates a row of values is filled below input data in the 1st dimension. >>> # Shown as follows: >>> # [[0. 0. 0.] >>> # [1. 2. 3.] >>> # [4. 5. 6.] >>> # [0. 0. 0.]] >>> # paddings[1][0] = 2, indicates 2 rows of values is filled in front of input data in the 2nd dimension. >>> # Shown as follows: >>> # [[0. 0. 0. 0. 0.] >>> # [0. 0. 1. 2. 3.] >>> # [0. 0. 4. 5. 6.] >>> # [0. 0. 0. 0. 0.]] >>> # paddings[1][1] = 2, indicates 2 rows of values is filled in front of input data in the 2nd dimension. >>> # Shown as follows: >>> # [[0. 0. 0. 0. 0. 0. 0.] >>> # [0. 0. 1. 2. 3. 0. 0.] >>> # [0. 0. 4. 5. 6. 0. 0.] >>> # [0. 0. 0. 0. 0. 0. 0.]] >>> output = pad(x) >>> print(output) [[0. 0. 0. 0. 0. 0. 0.] [0. 0. 1. 2. 3. 0. 0.] [0. 0. 4. 5. 6. 0. 0.] [0. 0. 0. 0. 0. 0. 0.]] >>> # if mode is "REFLECT" >>> class Net(nn.Cell): ... def __init__(self): ... super(Net, self).__init__() ... self.pad = nn.Pad(paddings=((1, 1), (2, 2)), mode="REFLECT") ... def construct(self, x): ... return self.pad(x) >>> x = Tensor(np.array([[1, 2, 3], [4, 5, 6]]), mindspore.float32) >>> pad = Net() >>> output = pad(x) >>> print(output) [[6. 5. 4. 5. 6. 5. 4.] [3. 2. 1. 2. 3. 2. 1.] [6. 5. 4. 5. 6. 5. 4.] [3. 2. 1. 2. 3. 2. 1.]] >>> # if mode is "SYMMETRIC" >>> class Net(nn.Cell): ... def __init__(self): ... super(Net, self).__init__() ... self.pad = nn.Pad(paddings=((1, 1), (2, 2)), mode="SYMMETRIC") ... def construct(self, x): ... return self.pad(x) >>> x = Tensor(np.array([[1, 2, 3], [4, 5, 6]]), mindspore.float32) >>> pad = Net() >>> output = pad(x) >>> print(output) [[2. 1. 1. 2. 3. 3. 2.] [2. 1. 1. 2. 3. 3. 2.] [5. 4. 4. 5. 6. 6. 5.] [5. 4. 4. 5. 6. 6. 5.]]