mindspore.nn.Pad

class mindspore.nn.Pad(paddings, mode='CONSTANT')[源代码]

根据 paddingsmode 对输入进行填充。

参数:
  • paddings (tuple) - 填充大小,其shape为 \((N, 2)\) ,N是输入数据的维度,填充的元素为int类型。对于 x 的第 D 个维度,paddings[D, 0]表示要在输入Tensor的第 D 个维度之前扩展的大小,paddings[D, 1]表示在输入Tensor的第 D 个维度后面要扩展的大小。每个维度填充后的大小为: \(paddings[D, 0] + input\_x.dim\_size(D) + paddings[D, 1]\)

    # 假设参数和输入如下:
    mode = "CONSTANT".
    paddings = [[1,1], [2,2]].
    x = [[1,2,3], [4,5,6], [7,8,9]].
    # `x` 的第一个维度为3, `x` 的第二个维度为3。
    # 根据以上公式可得:
    # 输出的第一个维度是paddings[0][0] + 3 + paddings[0][1] = 1 + 3 + 1 = 5。
    # 输出的第二个维度是paddings[1][0] + 3 + paddings[1][1] = 2 + 3 + 2 = 7。
    # 所以最终的输出shape为(5, 7)
    
  • mode (str) - 指定填充模式。取值为”CONSTANT”,”REFLECT”,”SYMMETRIC”。默认值:”CONSTANT”。

输入:
  • x (Tensor) - 输入Tensor。

输出:

Tensor,填充后的Tensor。

  • 如果 mode 为”CONSTANT”, x 使用0进行填充。例如, x 为[[1,2,3],[4,5,6],[7,8,9]], paddings 为[[1,1],[2,2]],则输出为[[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]]。

  • 如果 mode 为”REFLECT”, x 使用对称轴进行对称复制的方式进行填充(复制时不包括对称轴)。例如 x 为[[1,2,3],[4,5,6],[7,8,9]], paddings 为[[1,1],[2,2]],则输出为[[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]]。

  • 如果 mode 为”SYMMETRIC”,此填充方法类似于”REFLECT”。也是根据对称轴填充,包含对称轴。例如 x 为[[1,2,3],[4,5,6],[7,8,9]], paddings 为[[1,1],[2,2]],则输出为[[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]]。

异常:
  • TypeError - paddings 不是tuple。

  • ValueError - paddings 的长度超过4或其shape不是 \((N, 2)\)

  • ValueError - mode 不是’CONSTANT’,’REFLECT’或’SYMMETRIC’。

支持平台:

Ascend GPU CPU

样例:

>>> 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.]]